Книга знаний

1С:Предприятие / Приемы программирования / Внешние компоненты

Быстрое отображение остатка в справочнике и другие трюки с событиями в 1С

Программирование с использованием событий возможно не только в программном интерфейсе Windows (где события, пожалуй, являются "сердцем", или даже "нервной системой" оконной библиотеки), но и, при помощи простой внешней компоненты, применимо для реализации простых, но полезных трюков в 1С:Предприятие. Например, Ваши справочники будут отображать остаток товара, и при этом "не тормозить". Автор статьи: romix | Редакторы:
Последняя редакция №8 от 02.04.06 | История
URL: http://kb.mista.ru/article.php?id=43

Ключевые слова: остаток в справочнике, показать не помеченные на удаление, где есть остаток, кто заблокировал элемент


"Чем большей преданности Стопам-Лотосам Шри Гаурасундара достигает удачливая душа, тем больший океан нектара - Служение Стопам-Лотосам Шри Радхики - самопроизвольно переполняет сердце"
(с) Шри Прабодхананда Сарасватипада.


В этой статье мы продолжим исследование такой "непознанной земли" системы программирования 1С, как события.

С одной стороны, генерация событий описана в источнике "1С:Предприятие 7.5, 7.7 и 8.0 Технология создания внешних компонент", то есть, являются штатным и документированным механизмом системы 1С:Предприятие. С другой стороны, большинство разработчиков используют события лишь в случаях, когда имеется оборудование, и с него надо получить данные.

Давайте посмотрим, что же еще, помимо расширенной работы с документами, рассмотренной в предыдущей статье на эту тему, предлагает нам подсистема событий 1С:Предприятие.

Быстрый показ остатков в форме списка справочника "Номенклатура"


Насколько многие из нас могут судить из собственного опыта, в справочнике "Номенклатура" действительно можно отображать остатки товаров, как того просят пользователи, (чуть ли не припадающие к стопам-лотосам, чтобы это было не только отчетом, а именно в справочнике), и при этом действительно возникают сверхмощные тормоза. Однако, программист 1С может последовать древнему индИйскому правилу: "трнад апи суничена" (не причиняйте беспокойств никому), и устранить эти тормоза.

  • Для этой цели нам потребуется завести в справочнике товаров дополнительный реквизит "Остаток". Именно его мы и будем обновлять; однако, необходимо сделать это корректно - чтобы при любых обстоятельствах, таких как аварийное выключение питания, или же блокировка карточки товара пользователем, остатки в справочнике не испортились.


  • Для передачи информации о товарах, остаток по которым следует обновить, мы будем использовать справочник "Журнал транзакций". Несмотря на громкое название - это всего лишь таблица, которая позволяет реализовать FIFO-добавление товаров в список и удаление элементов из списка, чтобы он не разрастался, подобно очереди в Макдональдс в первый день его открытия.
  • Поскольку в модуле проведения текущие остатки лучше не смотреть (в момент проведения документа они еще не сформированы), мы будем считывать их особым образом: в обработчике события. Для этого в модуле проведения мы будем генерировать событие. После того как выполнение любого кода (включая проведение документа) будет завершено, возникнет состояние "время простоя" -  idle time (что, кстати, по индийски звучит как "йога" = "бездействие"). В это время система ожидает ввода информации от пользователя, и может, подобно просветленному йогину, отрабатывать информацию извне, находясь в бездействии.

Показ имени пользователя, который заблокировал объект, в форме списка/журнала


Легче верблюду пройти через игольное ушко, чем пользователю - выполнять довольно-таки сложный, подобный древнему танцу с бубном, "Отбор событий по объекту" в журнале регистрации, чтобы выяснить, а кто же заблокировал документ или элемент справочника, и ушел "покурить"?.

Юзера, который заблокировал объект, мы покажем в форме списка справочника, сделав это при помощи трюка "ложное закрытие формы" (с) не мой. Это делается методами Форма.Закрыть() с последующим СтатусВозврата(0) в обработчике закрытия. В данном случае мы тоже используем событие и его обработчик, но это - событие закрытия формы (реализованное где-то внутри 1С через подсистему оконных сообщений Windows).

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

Сокрытие в справочнике номенклатуры элементов, где нет остатка


На диске ИТС есть рекомендация, как реализовать этот режим. Мы сделаем его похожим образом, но не будем парить юзера необходимостью явно запускать какую-либо обработку ("трнад апи суничена"). Напомню, что это означает, что программист 1С должен быть проще, и тогда к его божественным стопам-лотосам потянутся пользователи. :-)

  • Чтобы реализовать этот режим показа товаров в списке, в справочник номенклатуры мы добавим индексируемое поле "Показ", которое говорит системе 1С, показывать ли данный элемент в форме списка, или нет. Чтобы этот режим возымел действие, в форме списка справочника мы используем метод УстановитьОтбор() по реквизиту - и тогда скроются все ненужные пользователю элементы из списка. Пример реализации - см. там же.


  • Установку и сброс признака Показ мы будем производить в глобальном модуле, просто добавив пару строчек кода в обработчик, который проставляет в справочник остатки товара. Если остаток нулевой (или, хуже того, отрицательный), то многие пользователи пожелают это скрыть из показа. :-) На форме списка есть флажок, который позволяет включать и выключать показ скрываемых элементов номенклатуры.
  • Новичков прошу обратить внимание, что для реквизита "Показ" установлен признак "Сортировка" и "Отбор" - иначе получится розовая птица обломинго. Поскольку это поле является индексируемым, лучше, чтобы оно имело минимальную длину (в нашем случае - 1 символ) и было неотрицательным.

Сокрытие в справочнике номенклатуры элементов, помеченных на удаление


Иногда нужно скрыть из справочника помеченные на удаление элементы, чтобы они не мешали просветленной сосредоточенности при созерцании пользователем справочника номенклатуры.

Реализуется через ловушку на глобальный обработчик пометки удаления - предопределенную процедуру глобального модуля ПриУдаленииЭлемента(). В этом обработчике мы либо устанавливаем, либо сбрасываем реквизит "Показ" справочника товаров.




Тестовую конфигурацию с внешней компонентой можно скачать здесь:

http://x-romix.narod.ru/Fakir2.rar



Более компактная и быстродействующая реализация этого же механизма приведена в более новой статье:
Книга знаний: Асинхронные события 1С: полезные алгоритмы
(файл для скачивания - в конце статьи).

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика