Процедуры-обработчики событий
Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться. Данная статья написана, чтобы внести ясность в этом вопросе.
Обратите внимание, что термин «Предопределенная процедура», который использовался в версии 7.х, теперь заменен на «процедура-обработчик события» или просто «обработчик события».
ПРАВИЛО №1. Если процедура-обработчик события относится к форме или элементу управления, то ее обязательно нужно указывать в палитре свойств для формы или элемента управления. |
Ниже показана палитра свойств для формы элемента справочника «Номенклатура» с несколькими назначенными обработчиками событий:
Как правило, процедура-обработчик имеет тот же набор параметров, что и событие. Если у нее нет соответствующих параметров, то обработка события может получиться неполной. Поэтому рекомендуется создавать процедуры-обработчики конструктором через палитру свойств, нажимая кнопку с лупой или выбирая процедуру из выпадающего списка.
Есть еще одна интересная возможность: одна и та же процедура может «обслуживать» несколько событий формы или элементов управления, в том числе от разных источников. Элемент управления, который инициировал событие, передается в качестве первого параметра в эту процедуру-обработчик (параметр «Элемент»), и при необходимости алгоритм может проанализировать, откуда пришло событие, и выполнить соответствующие действия.
ПРАВИЛО №2. Процедуры-обработчики событий, расположенные в модуле приложения, модуле внешнего соединения, модуле прикладного объекта должны называться точно так, как называются соответствующие события. |
Поясним это правило на конкретных примерах:
1. Процедуры-обработчики событий, расположенные в модуле приложения или модуле внешнего соединения, совпадают с именами событий:
2. Имена процедур-обработчиков событий, расположенных в модуле объекта, тоже строго соответствуют именам событий:
для модуля документа (события объекта типа «ДокументОбъект»)
Аналогичные обработчики событий могут располагаться в модуле справочника и модулях других прикладных объектов.
3. Есть также модуль набора записей для всех видов регистров, который подобен модулям прикладных объектов. Модуль набора записей может содержать следующие процедуры-обработчики событий (имена процедур должны совпадать с именами событий):
Ниже приведены несколько важных моментов, которые полезно помнить при работе с событиями:
Примечание 1. Событие ПередЗаписью прикладного объекта отличается от события ПередЗаписью формы, связанной с этим прикладным объектом. Обработчик события в модуле формы вызывается при интерактивной записи, а обработчик в модуле объекта при любом способе записи элемента в базу данных.
Примечание 2. Если в процедурах-обработчиках модуля объекта нужно обратиться к самому объекту (текущий элемент справочника, текущий документ и т.д.), то для этого можно использовать свойство ЭтотОбъект. Оно содержит объект типа «СправочникОбъект», «ДокументОбъект» и т.д.
Примечание 3. Считается грубой ошибкой в процедурах-обработчиках событий объектов вызывать такие интерактивные команды, как Вопрос и Предупреждение. Эти команды показывают на экране диалоговое окно и ждут реакции пользователя. Так как событие обрабатывается в рамках транзакции, то это вызовет значительную задержку в обработке события и часть данных (или вся таблица) будет заблокирована на время ожидания.
РеКС — друг в мире компьютеров
Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться.
Процедуры-обработчики событий //its.1c.ru
События жизненного цикла формы
Открытие объекта в форме
Запись объекта в форме
Закрытие формы
События формы
? Форма: ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Событие вызывает метод ОповеститьОВыборе( ) в подчиненной форме, при открытии которой был установлен Владелец.
Фокус формы и ТекущийЭлемент
Активный элемент формы «в фокусе» отслеживается через свойство ЭтаФорма.ТекущийЭлемент. Для события изменения текущего элемента формы обработчик не предусмотрен.
Оповещение формы
Всем открытым формам можно передать произвольные данные для любой дальнейшей обработки на их усмотрение. Передача осуществляется вызовом процедуры Оповестить(ИмяСобытия, Параметр, Источник)
Передача оповещения выполняется для тех форм, у которых определен обработчик событий в процедуре ОбработкаОповещения(ИмяСобытия, Параметр, Источник). Процедура обработчика вызывается с теми же параметрами, с которыми была вызвана процедура Оповестить(…).
Кроме открытых форм оповещение может быть обработано модулем приложения или общим глобальным модулем, если оповещение было подключено процедурой ПодключитьОбработчикОповещения( ).
Все описанные процедуры подключения, вызова и обработки выполняются &НаКлиенте:
Элементы формы
Обработчик изменения текста в Поле управляемой формы ИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) вызывается для каждого добавления, удаления, вставки или серии таких изменений, после которой последовала пауза больше
0.2 секунды. Реквизит связанный с полем получает измененное значение только после завершения редактирования, а до завершения актуальное значение изменяемого текста содержит параметр обработчика Текст или свойство элемента Поле .ТекстРедактирования.
Свойство элемента Поле .ВыделенныйТекст содержит фрагмент текста, который выделен, однако перемещение курсора и выделение фрагмента не имеет обработчика, поэтому для его получения необходима Команда размещенная в Командной панели или в группе вида Командная панель.
Таблица формы (ТаблицаФормы)
Процедура ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) — для вставки начальных значений
. Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Изменение порядка строк
При использовании команд изменяющих порядок строк в элементе ТаблицаФормы событие не возникает, и существуют только косвенные пути это обнаружить!
Объекты
Объекты справочников и документов имеют строковую форму представления, которая формируется динамически каждый раз, когда она понадобится, например в модуле во время преобразования типа Ссылка к типу Строка или в элементе формы отображающим объект справочника или документа, также строковое представление в запросе доступно через виртуальный реквизит .Представление.
Для получения строкового представления платформа реализует алгоритм по умолчанию, который состоит из двух этапов, каждый из которых можно переопределить в модуле менеджера.
Первый этап выполняется в процедуре ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка):
1с в форме списка события
v8: Отлов события «Обновление динамического списка». Проблема и решение.
Динамический список на форме может измениться по множеству причин: изменение отбора, добавление или удаление объектов, нажатие кнопки «обновить» в форме. Статья описывает, как отловить момент изменения списка и назначить свой обработчик. | Автор статьи: aka clappa | Редакторы: Гений 1С Последняя редакция №3 от 03.08.06 | История URL: http://kb.mista.ru/article.php?id=316 |
Ключевые слова: Динамический список, СправочникСписок, ДокументСписок, Событие, Обновление
То есть, данные динамического списка могут изменяться по различным причинам:
1. Изменился отбор списка
2. Пользователь в текущем сеансе изменил или удалил объект из списка
3. Пользователь нажал в форме кнопку «Обновить» (либо настроено автоматическое обновление списка)
Соответственно, хотелось бы после каждого такого события сразу пересчитывать служебную информацию.
Варианты решения были следующие:
1. Использовать событие формы «ОбновлениеОтображения».
Это событие действительно реагирует на любое изменение динамического списка. Но оно также вызывается и во многих других случаях. В частности, при смене страницы формы, при активизации строки в списке (если назначена обработка этих событий) и т.д. Короче, использование этого варианта вызывало приличные тормоза из-за перерасчета итогов после каждого чиха пользователя.
2. Использовать событие табличного поля «ПриПолученииДанных».
Вариант имеет такие же недостатки, как и предыдущий, хотя и в меньшей степени. Т.е. событие (а значит, и перерасчет итогов) выполнялось не только когда данные списка действительно менялись, но и при прокрутке списка, и даже при изменении размеров формы.
3. Добавить в форму кнопочку «Рассчитать», чтобы пользователь жал на неё всякий раз, когда ему потребуются актуальные итоги по списку. Коряво, неудобно, но приходилось поступать именно так, пока не появился ВАРИАНТ 4.
Суть: на форму добавляется скрытое табличное поле, источником данных которого служит нужный нам динамический список, и далее используется событие «ПриПолученииДанных» этого табличного поля. Так как данное табличное поле не прокручивается и не меняет размеров, то событие возникает только тогда, когда список реально требует обновления.
Правда, в процессе реализации этого варианта вылезло ещё несколько «особенностей» платформы, но почти все удалось обойти.
В результате, сервисный код упрятан в две процедуры общего модуля: ПодключитьОбработчикОбновленияСписка(. ) и ОтключитьОбработчикОбновленияСписка(. ). Первая назначает для обработки обновления списка процедуру модуля формы, вторая, соответственно, отключает обработчик. Выглядит всё это так:
Теперь ложка дёгтя.
Алгоритм не отрабатывает ситуацию, когда список полностью очищается. То есть, в списке были какие-то строки, а потом пользователь все строки удалил, либо задал такой отбор, при котором в список не попадает ни один объект. Как оказалось, 1С просто не вызывает событие «ПриПолученииДанных» для пустого списка.
В итоге, получилось следующее:
Замечание от Гений1С:
Можно попробовать подключить функцию изменения данных ПодключитьОбработчикИзмененияДанных на данные списка.
Замечание от clappa:
Мне удалось использовать ПодключитьОбработчикИзмененияДанных только для контроля за изменением отбора динамического списка. В других перечисленных случаях этот метод бесполезен. В частности, изменение порядка он «не ловит».
Изучение событий 1С для программирования
Почему появилась эта статья?
При совершении любых действий пользователем платформа 1С генерирует программные события. Как правило генерируется не одно событие, а целая цепочка событий. Задача программиста правильно разместить программный код в событиях, чтобы добиться ожидаемого поведения от программы. Однако начинающему программисту по 1С это не просто будет сделать, по причинам перечисленным ниже.
В управляемой форме могут быть сгенерированы события: ПриЧтенииНаСервере, ПриСозданииНаСервере, ПриОткрытии и т.д.
События в управляемой форме генерируются на клиенте и на сервере: ПередЗаписью, ПередЗаписьюНаСервере.
События вызываются в разных модулях: ФормаЭлемента, МодульОбъекта, МодульМенеджера.
Некоторые события могут вызываться несколько раз, если в списке несколько элементов справочника, например: ОбработкаПолученияПредставления.
Управляемая форма может быть открыта в результате выполнения разных действий пользователя при этом цепочки вызова событий будут различаться. При любых следующих действиях пользователя со справочником будет открыта управляемая форма: создание нового элемента, копирование элемента, изменение существующего элемента справочника.
События также генерируются элементами формы: при добавлении строки в табличную часть, при редактировании строки табличной части, при активизации строки или поля, при выборе элемента справочника в поле ввода и т.д.
Чтобы лучше понять логику и последовательность вызываемых событий, можно воспользоваться разработкой «Изучение событий» прикрепленной к данной статье. Зная контекст вызова события, последовательность событий и действия которые будет выполнять пользователь будет легче понять в какой обработчик событий лучше всего поместить свой программный код.
Инструкция к применению программы «Изучение событий»
Программа «Изучение событий» показывает события, которые генерирует платформа 1С при интерактивных действиях пользователя. Принцип работы следующий, пользователь открывает справочник, программа показывает цепочку событий. Пользователь помечает на удаление элемент справочника, программа выводит последовательность возникающих событий. События отображаются с небольшой задержкой по умолчанию 3 секунды, это необходимо чтобы отделить одну цепочку событий от другой цепочки событий. Поэтому выполнять интерактивные действия нужно «неторопливо».
Все события отображаются в специальном окне «Последние события». В нем можно включить или выключить запись событий. По умолчанию при первом открытии запись событий включена. Окно «Последние события» советую закрепить снизу экрана сразу при запуске программы, для удобного просмотра событий.
Программа не может сама определить каким действием вызвана цепочка событий, советую в поле «Действие причина» набирать с клавиатуры названия ваших последних действий, например «Открыта форма списка справочника», «Помечен на удаление элемент в списке справочника» и т.д. Это облегчит затем анализ действий и событий.
События записываются и отображаются для объектов, размещенных в разделе «Трассировка событий» при условии включенной записи событий в форме «Последние события».
Все записанные события можно посмотреть через «Отчет по событиям», который находится в разделе «Сервис».
Чтобы быстро очистить все записанные действия и события в разделе «Сервис» выбираем «Очистить события и действия».
Работа программы тестировалась на 1С платформе версии «8.3.9».
Программа «Изучение событий» может полезна как новичкам, так и программистам с опытом.
Обновление списков при интерактивных действиях пользователя
Область применения: управляемое приложение, мобильное приложение.
2. Команды, которые изменяют объекты и размещаются в форме списка, должны заботиться об обновлении списка объектов после своего выполнения. Например, после изменения одного объекта рекомендуется вызывать метод ОповеститьОбИзменении :
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
При изменении нескольких объектов целесообразно обновлять список однократно, в конце операции:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
3. Также должно быть обеспечено обновление данных в динамическом списке, у которого не назначена основная таблица. Такие динамические списки могут отображать данные из нескольких таблиц.
3.1. Если данные добавляются или изменяются командой, расположенной в форме динамического списка, то необходимо обновить список явно после выполнения команды.
3.2. Если данные изменяются в какой-либо другой форме (например, в форме объекта), то необходимо организовать обновление списка через оповещение. Для этого в каждой форме объекта, данные которого выводятся в динамическом списке, следует реализовать обработчик события ПослеЗаписи с использованием метода Оповестить :
Оповестить («Запись_ «, ПараметрыОповещения, ОбъектСсылка);
Затем в обработчике события Оповещение в форме динамического списка разместить код по обновлению динамического списка вида:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если Врег(ИмяСобытия) = Врег(«Запись_РасходнаяНакладная»)
Или Врег(ИмяСобытия) = Врег(«Запись_НакладнаяНаПеремещение») Тогда
Элементы.СписокНакладных.Обновить();
КонецЕсли;
При этом имена событий следует проверять явным образом, чтобы исключить неоправданное обновление списка.
Оповестить(«Запись_РасходнаяНакладная», ПараметрыЗаписи, Неопределено);