Имя: Пароль:
1C
 
Сеанс практической йоги: события и их обработчики, часть 2
0 romix
 
15.06.05
18:22
"...Так делать крайне не рекомендуется. Этот пример был специально приведен, чтобы показать, как НЕ НАДО делать".
(с) Станислав Митичкин, про отображение остатков в форме списка справочника, "Разработка в системе 1С:Предприятие 8.0".


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


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

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

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

- Топор
- Копье
- Дротик
- Скребок
- Мотыгу

и другие полезные в хозяйстве древнего человека приспособления.

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


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

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

Для передачи информации о товарах, остаток по которым следует обновить, мы будем использовать справочник "Журнал транзакций". Несмотря на громкое название - это всего лишь таблица, которая позволяет реализовать FIFO-добавление товаров в список и удаление элементов из списка, чтобы он не разрастался, подобно очереди в Макдональдс в первый день его открытия.

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

Тестовую конфигурацию, которая реализует этот режим работы, можно скачать здесь:

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


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

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

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

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


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

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

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

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

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


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

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

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



- Автоматическое расширение формы справочника или журнала на весь экран

Иногда нужно развернуть форму справочника или журнала на весь экран. Режим, который предлагает 1С по умолчанию - свернутые окошки, что не всегда подходит сердитым пользователям, которые вынуждены всякий раз их разворачивать.

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

   //Расширение формы на весь экран
   wsh=СоздатьОбъект("WScript.Shell");
   wsh.SendKeys("{F10}{LEFT}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}");

Повторный вызов этого же пункта меню не приводит ни к какому действию. Этот режим работы использует очередь клавиатурных событий системы Windows, помещая в нее (при помощи системного объекта WScript.Shell) требуемые нажатия.


- Автоматический перезапуск 1С по нажатию клавиши F11.

"На закуску" мы реализуем пример закрытия 1С 7.7 по нажатию F11 в конфигураторе. После непродолжительной работы в 8.0 этот режим работы уже кажется естественным, поэтому давайте его реализуем. Для этого мы встроим в нашу "волшебную" внешнюю компоненту вызов несколько измененной keyhook.dll (автор - Alexey Pavlov). Она будет реагировать на нажатия клавиш и закрывать 1С по нажатию F11.

Запустите из конфигуратора (нажатием F11) тестовую конфигурацию, ссылка на которую приведена выше. Потом перейдите в конфигуратор и нажмите F11 еще раз - 1С автоматически закроется, и не надо каждый раз переходить в окно 1С и его закрывать при изменении конфигурации. Не правда ли, удобно?

(Этот режим работы проверен в Windows XP SP2 и Windows 98 SE).

Процедура, которая перехватывает нажатия, отлавливает нажатие F11 и закрывает окно 1С. Поскольку могут "всплыть" окошки наподобие "Документ был изменен. Сохранить?", то дополнительно имитируются два нажатия на клавишу Enter.
1 romix
 
15.06.05
19:29
У кого-нибудь примеры, например, с быстрым показом остатков в "Номенклатуре" или с F11, работают? :-)
2 Ёжик в тумане
 
15.06.05
19:37
(0) Это уже даже не смешно.
3 romix
 
15.06.05
19:41
(2) Велосипед что ли с F11 я изобрел? :-)
А то мне кажется удобно, как в 8-ке :-)
4 Ушастый ёжик
 
15.06.05
19:45
(2) А в прошлый раз было смешно?
Ну лана, вечерком еще ветку посмотрю...
Может примеры кода кого порадуют...
5 Ёжик в тумане
 
15.06.05
19:50
(3) Да я не об этом..
6 Скользящий
 
15.06.05
19:52
(0)Хорошая статья. Лучше бы ты ее раньше повесил. Пожалуй, я лучше так реализую быстрый подбор.
7 spock
 
15.06.05
19:57
ядреная дурь у (0)
наверно чуйская долина снабжает йоБа...
8 Denisыч
 
15.06.05
20:49
(0) Я тебе уже говорил чтоб к психиатру сходил...
Но... Очень интересная статья, продолжай в том же духе. И ещё - практических примеров побольше и можно книгу писать про йогу.
9 romix
 
16.06.05
00:10
(5) Статья вполне серьезная: я не знаю что именно там должно быть смешно.
Религиозные вопросы я попытался поднять корректно, а тестовые примеры и
внешние компоненты попытался сделать работоспособными и безглючными.
Кроме того, они поставляются с открытым исходником.

(6) Плохих не пишем :-) Блин, знал бы - повесил, она у меня уже несколько
дней болтается, вот сегодня сделал чтобы хорошо работал пример с клавишей
F11 в Конфигураторе.

(7) Пример заработал? На текст внимания не обращай - он для новичков, которые не смогут с первого захода въехать, как это работает.

(8) Тут психиатров и наркологов хватает. Такой диагноз поставят (не посмотрев,
что пример работает и решает старую проблему 1С, да еще и не одну) - что мало
не покажется. :-)
10 romix
 
16.06.05
16:48
При тестировании компоненты под 1С 8.0 был выявлен глюк движка:
Если вызвать метод генерации события с параметром-пустой строкой, то 1С
(8.0.9.32) "срывает крышу".

fakir.ВызватьСобытие("fakir", "ПередОткрытием", "");

Возникает исключение обращения к ячейке памяти с адресом 0.
Это к вопросу о качестве тестирования входных значений в движке 1С.

Поэтому все параметры, по крайней мере, в этой версии движка должны быть заполнены непустыми строками.
11 Nil Pointer
 
16.06.05
17:16
Видимо, пустая строка представляется указателем на адрес 0.
И 1С, не проверяя, в данном случае начинает его читать.

Также не исправили прикол, когда в ВК исключение, движок 1С намертво виснет и предлагает отправить ошибку в Mirosoft. Если 1С думает, что даже крупные франчи на эти грабли не попадают, то типа сильно ошибается. :-)

Похоже, полная противоположность safecall в Delphi. :-)
12 romix
 
16.06.05
18:46
Статья размещена в Базе знаний в несколько сокращенном виде (меньше ненужных отвлечений от темы), с разметкой (выделены жирным шрифтом заголовки и прочее) под заголовком

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

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