Как программно вызвать событие формы 1с

Обновлено: 07.07.2024

События, вызываемые при выполнении действий над объектом, редактируемым в форме

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

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

При записи существующего объекта ничего обновлять не нужно, так как в процессе записи данные объекта не изменяются. Запись нового объекта выделена в отдельное действие, так как при этом изменяется ссылка объекта. В этом случае требуется обновить содержимое списка валют, так как его содержимое зависит от значения ссылки объекта. При изменении ссылки перечитывать фотографию не надо, так как она не изменилась.
При нажатии на кнопку "Перечитать данные" пользователь ожидает, что будут обновлены данные объекта и все связанные с ним данные, поэтому в этом случае следует обновить и список валют, и фотографию сотрудника.

Для решения этих задач форма предоставляет возможность назначить обработчик на событие формы ПриИзмененииДанных, и на изменении данных объекта Ссылка. Подключение обработчика изменения данных может быть осуществлено в теле модуля формы следующим образом:

В таблице отражено, на какие действия пользователя, вызываются эти события.

Событие Присвоение Запись нового Перечитывание
Событие формы ПриИзмененииДанных Х Х
Обработчик изменения данных Ссылка Х Х Х

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

Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа.
Именно такое сложное чувство непонимания было поначалу и у меня. В процессе обучения и реального опыта была создана эта шпаргалка, целью которой было "разложить всё по полочкам", чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи объектов.

Для чего нам вообще нужны эти обработчики?
Очень часто программисту требуется переопределить стандартное поведение системы во время записи объектов, а именно: отменить запись, в случае каких-то условий; запросить дополнительную информацию у пользователя; дозаполнить реквизиты; что-то ещё записать в базу данных на основании этой записи; что-то изменить на форме после записи и т.д. и т.п. Каждый программист рано или поздно сталкивается с подобными задачами, потому знать назначение и последовательность запуска этих событий программисту, работающему на платформе 1С 8.2, необходимо.

В модуле формы или в модуле объекта?
Сначала надо определиться нужны ли нам данные формы? Будет ли запись записываться программным способом или только интерактивно? Будем ли вести диалог с пользователем?
Дело в том, что часть событий выполняется на уровне модуля формы и это значит, что они выполняются только при интерактивной записи, а также в этих событиях мы можем обращаться к данным формы, вести диалог с пользователем.
Другая часть событий выполняется на уровне модуля объекта, как при интерактивной, так и при программной записи.
Потому можно сразу определиться с обработчиком модуля формы или модуля объекта будем работать.

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

Как выбрать конкретный обработчик?
Выбор зависит от поставленной задачи. Что конкретно можно делать в каждом обработчике опишу ниже, а пока пример.

title

Пример выбора обработчиков событий записи объекта:
Бывают задачи, когда потребуется использовать несколько обработчиков для решения одной задачи. Например, надо запросить информацию у пользователя во время записи: «Будем создавать новый документ на основании этой записи?» и, если пользователь ответит утвердительно, то надо создать новый документ с ссылкой на записываемый объект. Причем запись нового документа надо выполнять в транзакции, т.к. если текущая запись по каким то причинам будет отменена, то и уже созданный и записанный документ не должен остаться в базе данных.
Для решения этой задачи потребуется использовать обработчики события модуля формы по двум причинам:
1) Диалог с пользователем возможен только на клиенте, а клиентеские обработчики есть только в модуле формы. Для диалога будем использовать клиентскую процедуру модуля формы ПередЗаписью(), и сохраним ответ пользователя в параметре этой процедуры «ПараметрыЗаписи».
2) А в процедуре ПриЗаписиНаСервере() модуля формы примем этот параметр и в зависимости от него будем создавать документ или нет. Почему именно эта процедура? Ссылка будет получена только после записи, но поскольку нам нужно записывать в транзакции, то нужно использовать процедуры ДО завершения транзакции, но уже имеющие ссылку на записываемый объект. ПередЗаписью() не подходит , так как ещё нет ссылки, а ПослеЗаписи() не подходит, так как транзакция уже завершена. Остаётся ПриЗаписи(), но перед нами встаёт выбор: модуля формы или модуля объекта? Поскольку обработчик события ПриЗаписи() модуля объекта не содержит параметр, содержащий ответ пользователя, а событие ПриЗаписиНаСервере() модуля формы содержит, то ответ очевиден-используем это событие ПриЗаписиНаСервере() модуля формы потому что:
1) Это событие выполняется в транзакции 2) Содержит параметр «ПараметрыЗаписи», в котором уже содержится ответ пользователя, который передался из процедуры ПередЗаписью() 3) Ссылка уже создана и можно создавать новый документ, используя эту ссылку.

Ну и теперь последовательность запуска событий (в том порядке, в каком они перечислены) и небольшие подробности :
Во многих обработчиках есть параметр «Отказ». Там, где этот параметр присутствует означает, что в этом обработчике ещё можно отказаться от записи, присвоив параметру «Отказ» значение Истина, и тогда запись произведена не будет.
1) Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
Выполняется на клиенте!
Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.
Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои.
Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, при записи регистра сведений, надо сделать запись в другой регистр сведений старое значение ресурса. Можно передать старое значение в эти самые параметры и уже в ПриЗаписиНаСервере сделать запись в другой регистр.
2) Модуль формы ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
3) Модуль объекта ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)
Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения «Выдавать ошибку»)
И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.
Таким образом, можно сказать, что эти два обработчика событий предназначены :
Для включения в проверку заполнения тех реквизитов, у которых в свойствах «ПроверкаЗаполнения» указано «Не проверять». Для этого надо добавить этот реквизит в массив параметр «ПроверяемыеРеквизиты»
Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить этот реквизит из массива параметра «ПроверяемыеРеквизиты»
Имеется несколько особенностей, которые необходимо учитывать:
Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
Вызываются только при интерактивной записи! При программной записи не вызываются. Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
Для документов, имеющих возможность проведения , эти события проверки заполнения вызываются только при проведении!
Оба эти события выполняются на сервере, отличие в том, что ОбработкаПроверкиЗаполненияНаСервере() это событие модуля формы и, следовательно, есть доступ к данным формы. А ОбработкаПроверкиЗаполнения() - событие модуля объекта.
4) Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки. Есть доступ к данным формы. Есть параметр ТекущийОбъект.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан.
Начало транзакции
5) Модуль объекта ПередЗаписью(Отказ)
В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки.
Для документов в параметры данного обработчика добавляются ещё два параметра:РежимЗаписи, РежимПроведения.
Запись
6) Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Возникает в момент, когда выполняется установка номера нового документа, задачи или бизнес-процесса.
Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)
Возникает в момент, когда выполняется установка нового кода элемента справочника, узла плана обмена или кода плана видов характеристик.
Эти событии вызываются для объектов у которых указано свойство «Автонумерация» и только для новых объектов.
Если установить параметру СтандартнаяОбработка значение Ложь, то новый номер генерироваться не будет и можно программно задать код объекта в данном обработчике.
7) Модуль объекта ПриЗаписи(Отказ)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.
Ссылка уже есть и можно записать в базу данных дополнительные данные на основании текущего объекта, используя эту ссылку.
Например, при записи создавать другой документ, содержащий реквизит ссылку на записываемый.
8) Модуль формы ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи. Есть доступ к данным формы. Есть последний шанс отказаться от записи.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Можно обратиться к его свойствам и методам.
Завершение транзакции
9) Модуль формы ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
Выполняется на сервере.
Можно использовать для того, чтобы визуально что-то отобразить на форме.
10) Модуль формы ПослеЗаписи(ПараметрыЗаписи)
Выполняется на клиенте!
Можно использовать для того, чтобы визуально что-то отобразить на форме или выдать предупреждение пользователю.


Обработчик события для программно созданных кнопок
Помогите пожалуйста! Есть программно создаваемые кнопки в количестве, зависящем от введенного в.

Один обработчик события для нескольких динамически созданных объектов
Я программно создаю несколько картинок и их кол-во всегда разное. Создаю картинки циклом: .

Прикрепить обработчик события для элементов, созданных после загрузки формы
Я, возможно, заблуждаюсь в употреблении таких слов как "рантайм", но все же. Имеется listbox.

Как создать обработчик события для формы?
как создать обработчик события для формы java?

После того, как я создал эти элементы, мне надо, чтобы при изменении какого-либо из этих элементов вызывалась процедура.

Для элемента управления можно программно установить обработчики событий

ПолеФормы (FormField)
УстановитьДействие (SetAction)
Синтаксис:

УстановитьДействие(<ИмяСобытия>, <Действие>)
Параметры:

Тип: Строка.
Имя события, для которого устанавливается новое действие.
<Действие> (обязательный)

Тип: Строка.
Указывается имя обработчика.
Описание:

Устанавливает обработчик события.

Сервер, мобильное приложение(сервер).

Но в Вашем случае лучше воспользоваться свойствами элементов управления СвязиПараметровВыбора или ПараметрыВыбора, чтобы установить необходимые отборы на выбираемые значения. Ошибка: тип не определен (Действие)
Я так понимаю, это доступно только на клиенте? Ошибка: тип не определен (Действие)
Я так понимаю, это доступно только на клиенте?

Спасибо, буду пробовать

Добавлено через 45 минут
Возникла другая проблема. Как мне передать имя элемента, который я изменяю в обработчик события вместо ". " ?

Добавлено через 43 минуты
Нашел - ЭтаФорма.ТекущийЭлемент.Имя
Но как мне передать тип значения ПВХСсылка.СвойстваКошельков?
Пробую так, но выдает ошибку на параметр "ПланыВидовХарактеристикСсылка.СвойстваКошельков"

Странное вообще решение какое-то.

Почему было не использовать предопределенный набор записей регистра сведений - зачем было лепить динамические реквизиты на форму?

Нашел - ЭтаФорма.ТекущийЭлемент.Имя
Но как мне передать тип значения ПВХСсылка.СвойстваКошельков?
Пробую так, но выдает ошибку на параметр "ПланыВидовХарактеристикСсылка.СвойстваКошельков"

Я всего около месяца программирую, поэтому не особо понимаю, когда, что проще использовать. И вообще многого не знаю еще. Сейчас попробую так

Добавлено через 9 минут
Переменная не определена ПланыВидовХарактеристикСсылка

К сожалению, та же ошибка
Переменная не определена ПланыВидовХарактеристик. Может я вставляю не туда?

Если пишу вот-так

Тогда уже в самом предприятии при изменении элемента ошибка недопустимое значение параметров (1) у описания типов.
Если пишу так

Решение


Обработчик события для объекта, созданного программно
Здравствуйте. В форме программно создано кнопочное поле. Cреда Visual Studio 2010. (в файле.


Привязать обработчик события для программно добавленного элемента управления
Такая проблема. Программно создаю DataGridView при добавлении новой вкладки на tabControl.


Как передать в обработчик события значение программно созданного pictureBox?
как передать в обработчик события значение программно созданного pictureBox? суть прилоения оно.

Создать обработчик события для класса
Добрый день. Подскажите, пожалуйста, как создать свой обработчик события для своего класса? В.

Как отловить событие закрытия формы
Здравствуйте, есть макрос с одной строчки кода: Печатать.Show если в появившейся форме её закрыть.

Как отловить событие дочерней формы в родительской
Дочерняя форма влепливается в родительскую с помощью SetWindowLong(frmChild.hWnd, GWL_STYLE, HR Or.

Как отловить событие запуска другой формы
Здравствуйте. В форме А создаю форму B. Как в форме B можно обращаться к событие Load? делаю.

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

Нужно еще в свойствах формы подцепить эти процедуры как обработчики этих событий. Нужно еще в свойствах формы подцепить эти процедуры как обработчики этих событий. В каких? ЭтотОбъект.Свойства не работает, а в синтакс помощнике не нашел похожего свойства

Понятненько. Я искал програмный способ, но и так сойдет. Спасибо.

Если кто еще наткнулся на этот вопрос то вот суть в двух словах. Обработчик нужно подцепить к форме. Я нашел 3 способа как это сделать.
1) Как на скрине выше.
2) С помощью метода УстановитьДействие
3)С помощью помощника в конфигураторе (прямо над модулем есть пустая строка выбора в ней можно выбрать обработчик и создать его в модуле и он автоматом его подцепит к форме)

Добавлено через 12 минут
Кстати если кто знает как программно посмотреть все текущие обработчики событий напишите сюда, пожалуйста. А то можно попасть в ситуацию когда где-то кто-то программно установил другой обработчик события, а ты ковыряешься в старом и недоумеваешь почему он не работает.


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


Отловить событие окончания изменения размера формы
Как отловить окончание изменения размеров формы, чтобы каждый раз не обрабатывать событие изменения.

Читайте также: