Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Решения на 1С, как эффективный инструмент для бизнеса


Служба Рассылок Subscribe.Ru
Всем привет.

Меня зовут Никита Зайцев, в сети я более известен как WildHare. Александр Галимов любезно предоставил мне возможность сделать несколько выпусков рассылки, чем я и собираюсь заняться.

Небольшая преамбула. Материалы, которые я собираюсь постить в рассылку, так и или иначе будут связаны с моим веб-ресурсом Hare.ru. Ресурс некоммерческий и полностью посвящён работе с платформой V7, так что особых отклонений от темы рассылки не произойдёт. Вместе с тем я постараюсь сделать мои рассылки более информативными, нежели тупое перечисление новых материалов, появившихся на сайте.

Теперь можно приступать к делу.


Выпуск #1 // 09.11.2001


Сложные отчёты – это просто.
  • как использовать в запросах свои собственные функции

    Одним из существенных ограничений языка запросов V7 является невозможность использования своих собственных функций. Штатного набора (Сумма, НачОст, КонОст, Приход и Расход) иногда оказывается явно недостаточно. Для того, чтобы собрать сложный отчёт, приходится либо считать промежуточные и перекрёстные итоги (по группам и т.п.) руками, либо использовать предварительную обработку данных в таблицах значений.

    В любом случае, процесс получается трудоёмким и долгим. Насколько было бы проще, если бы прямо в запросе можно было бы определить свою функцию – скажем, для пересчёта сумм в разные валюты.

    В документации этот момент описан очень неявно, но такая возможность на самом деле есть. Дело в том, что в качестве агрумента штатной функции запроса Сумма() можно передать не только числовые переменные запроса, но и ссылку на свою собственную функцию, параметрами которой являются эти самые переменные. Выглядит это примерно так:

    Функция ВВалютеОтчета(Тов,Себ)
    //тут пересчитаем валюту
       Возврат(глПересчет(Себ,Тов.ВалютаУчетаТовара,ДатаОтчета,ВалютаОтчета,ДатаОтчета));
    КонецФункции

    //.

    "Товар = Регистр.Товары.Товар;
    |Склад = Регистр.Товары.Склад;
    |Количество = Регистр.Товары.Количество;
    |Себестоимость = Регистр.Товары.Себестоимость;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Функция ПродВал = Сумма(ВВалютеОтчета(Товар,Себестоимость));
    |Группировка Склад без групп;
    |Группировка Товар;";

    Предлагаемая методика позволяет существенно упростить и удешевить написание сложных отчётов.

    автор материала: Алексей Мозговой.
    полную версию статьи см. по адресу http://www.hare.ru/kb/article.shtml?018.


    Блокировка() нам поможет…

    Иногда бывает нужно обеспечить выполнение некоторых обработок в «квазимонопольном» режиме, т.е. таким образом, чтобы обработка в один момент времени выполнялась только в одной сессии (база данных, разумеется, сетевая).

    Например, это может быть загрузка документов или справочников из внешних источников, какие-то административные работы, «чистка» базы или что-то подобное. В любом случае, открывать базу в монопольном режиме ради выполнения одной обработки очень неудобно и не всегда возможно.

    Следовательно, нужен какой-то механизм, позволяющий распознавать и блокировать ситуации одновременного доступа к обработке. Иными словами, нужен семафор.

    Использование в качестве констант, "ключевых" файлов и т.п. вещей не подходят по вполне понятным причинам – в случае аварийного завершения сессии семафор остаётся поднятым.

    Лучше всего на роль семафора подходит … самый обыкновенный справочник в паре со штатным методом блокировки элементов. Вот как это выглядит на практике:

    Перем _лок; // переменная модуля

    Процедура ПриОткрытии()
    
       _лок=СоздатьОбъект("Справочник.SysLock");
    
       Если _лок.НайтиПоКоду("01",0)=0 Тогда
          Сообщить("не найден флаг 01");
          СтатусВозврата(0);
          Возврат;
       КонецЕсли;
    
       Если _лок.Блокировка(1)=0 Тогда
          Сообщить("кто не успел, тот опоздал");
          СтатусВозврата(0);
          Возврат;
       КонецЕсли;
    КонецПроцедуры
    
    Процедура ПриЗакрытии()
       // на всякий случай
       _лок.Блокировка(0);
       _лок="";
    КонецПроцедуры
    

    Такой механизм будет работать в любой ситуации – поскольку он построен на штатном механизме шаринга и блокировок. Даже при аварийном завершении сессии семафор будет корректно возвращён в исходное (нулевое) состояние.

    автор материала: BigHarry.
    полную версию статьи см. по адресу http://www.hare.ru/kb/article.shtml?019.


    в рассыке были использованы материалы раздела
    Коллективный Разум ::: brain.hare.ru

    Коллективный Разум – это сборник статей от разных людей на разные темы. Общий момент у всех статей только один: они а той или иной мере касаются работы с платформой V7. На данный момент там содержится 19 статей. Любой желающий может представить свой опус для публикации на страницах Коллективного Разума, для этого нужно просто написать письмо по адресу wild@hare.ru


    WBR, Nikita Zaitcev a.k.a. WildHare
    контактная информация: http://hare.ru, mailto:wild@hare.ru, ICQ #64429462.



    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное