1с не срабатывает событие при изменении после обработки выбора
Механизм подписок на событие предназначен для назначения обработчика события для одного или нескольких объектов конфигурации платформы «1С:Предприятие». В статье рассматриваются несколько примеров применения данного механизма. Изучив статью, вы узнаете:
Применимость
В статье рассматривается платформа «1С:Предприятие» редакции 8.3. Представленная информация актуальна для текущих релизов платформы.
Подписки на события
В статье рассматриваются несколько примеров применения одного из вспомогательных объектов платформы «1С:Предприятие 8» – подписок на события.
Подписки на события позволяют размещать в общих модулях внешние обработчики, которые будут исполняться после выполнения определенного обработчика события в модуле объекта или модуле менеджера.
Подписки на события описываются в ветке Общие окна объектов конфигурации (Рис.1).
- Выполняется обработчик события ПередЗаписью() в модуле объекта документа.
- Если в ходе выполнения обработчика параметр Отказ принимает значение Истина или вызывается исключение, то обработка события прерывается.
- Если на втором шаге обработка события не прерывалась, то выполняются внешние обработчики (подписки на события), определенные для события ПередЗаписью().
- Если в ходе выполнения внешнего обработчика параметр Отказ принимает значение Истина или вызывается исключение, то выполнение внешнего обработчика прерывается.
С помощью подписок на события можно организовать выполнение различных проверок, выполняющихся при записи объектов в базу данных.
Задача 1
Флаг Клиент (обычное приложение) доступен, если в параметрах конфигуратора установлен режим редактирования Управляемое приложение и обычное приложение.
В ветке Общие окна объектов конфигурации создать новую подписку на событие. В палитре свойств ввести имя подписки ПроверкаНаименованияСправочника. В поле выбора Источник отметить тип данных СправочникОбъект.Контрагенты. В поле выбора Событие выбрать событие ПередЗаписью(). После отработки этого события будет срабатывать процедура обработки подписки на событие (Рис. 2).
Листинг процедуры ПроверкаНаименованияСправочникаПередЗаписью()
На практике может встретиться задача выполнения движений по дополнительным регистрам при проведении документов в типовых конфигурациях. Создание дополнительных регистров позволяет избежать модификации существующих регистров и при этом получить возможность дополнительной обработки данных при проведении типовых документов.
Задача 2
Касса, тип: СправочникСсылка.Кассы;
Статья, тип: СправочникСсылка.СтатьиДвиженияДенежныхСредств.
Создать ресурс регистра:
Создать новую подписку на событие:
Имя – ДвиженияПоВыбытиюДенежныхСредств;
Источник – ДокументОбъект.РКО;
Событие – ОбработкаПроведения.
Листинг процедуры ДвиженияПоВыбытиюДенежныхСредствОбработкаПроведения()
В типовых конфигурациях может возникнуть необходимость доработки основной формы некоторого объекта, например документа. Эту задачу можно решить с помощью подписок на события. При этом создается копия основной формы документа. В новую форму вносятся необходимые изменения. С помощью механизма подписок на события обеспечивается открытие новой формы вместо основной формы. При этом основная форма, находящаяся на поддержке, остается без изменения.
Задача 3
Создать новую подписку на событие:
В общем модуле ОбработчикиПодписокНаСобытия создать обработчик ОсновнаяФормаРКООбработкаПолученияФормы(). В обработчик в качестве параметра ВыбраннаяФорма передается имя открываемой формы.
Параметр СтандартнаяОбработка устанавливается в значении Ложь для отключения открытия основной формы.
Листинг процедуры ОсновнаяФормаРКООбработкаПолученияФормы()
Таким образом, подписки на события предоставляют возможность добавления нового функционала, не изменяя существующие модули объектов. К недостаткам подписок на события можно отнести:
- Увеличение сложности алгоритмов.
- Подписаться можно только на события объектов и менеджеров объектов.
Если необходимо модифицировать какое-либо событие формы, то механизм подписок на события не доступен. В этом случае, необходимо вносить изменения в саму форму или копировать форму и вносить изменения в новый объект.
Добрый день!
Столкнулся с задачей:
Необходимо из экселя заполнять реквизиты документа. Документ создается, реквизиты заполняются, но не получается вызвать обработчик события при изменении одного из реквизитов. Может кто подскажет или поделится примерами как это делается?
Вот код, который я использую:
Помощь в написании контрольных, курсовых и дипломных работ здесь
Вызвать процедуру ПриИзменении, для изменяемого реквизита в тч из внешней обработки
Заполняю обработкой ТЧ. Реквизиты заполняются, но ПриЗименении() Номенклатуры не срабатывает.
как вызвать процедуру?
как вызвать HeapSort в процедуре нажатия кнопки? procedure HeapSort(var N: integer); var i.
Как вызвать процедуру
Procedure Level1; begin PlaySound(button); menu1.visible:=false; .
Как вызвать процедуру?
Сам код процедуры: CREATE PROC count_purchases (@dl SMALLDATETIME, @d2 SMALLDATETIME, @c INT.
кликаете 2 раза по реквизиту на форме, откроется окно свойств в нем внизу есть предопределенные процедуры так сказать вот какая вам нужна справа от нее кликаете по значку лупы и вуаля вас перебросит в модуль формы в нужную вам процедуру
Добавлено через 1 минуту
или вам нужно программно вызвать.
Добавлено через 36 секунд
если программно то вам если я не ошибаюсь нужно сначала получить форму а уже у нее вызывать процедуру
Добавлено через 9 минут
ну и естественно она должна быть экспортной
В том-то и беда, что программно надо вызвать из внешней обработки. И эта функция не является экспортной.
Я нашел один пример как это делается, но ничего в нем не понял. Суть данного метода следующая:
Создается форма пустышка, где интерактивно выбирается/вводится реквизит, потом программно форме пустышке назначают владельца (в моем случае это: ПриходныйКассовыйОрдер). Далее форме ПриходныйКассовыйОрдера с помощью функции "ОповеститьОВыборе" сообщают, что выбор конкретного реквизита сделан, после чего запускается стандартная процедура обработки события для данного ПоляВвода, предусмотренная 1С. Что-то в этом роде, беда в том, что я не понял как это сделать.
При выборе ссылочного значения в поле ввода иногда возникает необходимость специальным образом обработать выбирамемое значение.
Например, в документе, нужно выбрать поставщика. Но нужно вмешаться в процесс выбора значения и кроме ссылки на поставщика получить еще и другую информацию о поставщике. Например, его полное наименование и ИНН, которые являются реквизитами поставщика.
Для того, чтобы вмешаться в процесс выбора значения используется событие ОбработкаВыбора элемента формы Поле. Это событие поставляется расширением поля ввода. Обработчик этого события имеет такой синтаксис:
ОбработкаВыбора(<Элемент>, <ВыбранноеЗначение>, <СтандартнаяОбработка>).
Во втором параметре (ВыбранноеЗначение) платформа передает в обработчик то значение, которое выбрал пользователь. В данном случае это будет ссылка на поставщика.
Но проблема заключается в том, что обработчик ОбработкаВыбора исполняется на клиенте, то есть объявление процедуры выглядит так:
А на клиенте возможности ссылки очень сильно ограничены. В частности, от нее нельзя через точку получить значения реквизитов.
Поэтому для того, чтобы в этой ситуации получить значения реквизитов ссылки, нужно из этого обработчика вызвать серверную функцию и в ней получить нужные реквизиты. Например так:
При этом следует иметь ввиду два момента:
- Во-первых, для получения реквизитов используется неконтекстный серверный вызов (&НаСервереБезКонтекста). Это важно, т.к. в этом обработчике нельзя использовать контекстные серверные вызовы (&НаСервере).
- Во-вторых, любое обращение к серверу требует дополнительных ресурсов системы и может замедлять работу пользователя, особенно в случае подключения по низкоскоростному каналу связи. Поэтому нужно прежде всего внимательно оценить, а так ли необходимо в этом месте получать реквизиты ссылки или можно обойтись без этого? И если нужно получать несколько реквизитов и при этом используется какой-то сложный алгоритм – нужно постараться реализовать его так, чтобы все необходимые данные получить за один серверный вызов, вернуть их на клиента и на клиенте только поместить их в нужные поля формы, не проводя каких-то сложных вычислений.
Подробнее об использовании метода ОбработкаВыбора можно прочитать в синтакс-помощнике: Интерфейс (управляемый) - Поле формы - Расширение поля ввода - События:
События, вызываемые при выполнении действий над объектом, редактируемым в форме
При создании форм редактирования для различных объектов часто встает задача отображения в форме либо дополнительной информации связанной с этим объектом, либо части данных объекта, которые не могут быть связаны с элементами формы посредством системного механизма связи с данными. В первом случае примером может служить список курсов валют в форме редактирования элемента валюты. Во втором случае примером служит фотография сотрудника, хранящаяся в хранилище значений.
Для правильной синхронизации данных с элементами формы нужно рассмотреть действия пользователя, которые приводят к необходимости обновлять те или иные данные, и какие инструменты, предоставляемые формой, нужно задействовать для решения этой задачи. При редактировании объекта в форме пользователь может совершать следующие действия: открыть форму нового объекта, открыть форму существующего объекта, записать новый объект, записать измененный объект, вызвать перечитывание объекта. Кроме того, разработчик может предусмотреть смену редактируемого объекта без закрытия формы. Действия по открытию формы нового и существующего объекта, изменения объекта в форме можно объединить в одно действие - назначение форме другого объекта для редактирования. При этом в форме должны быть обновлены и список валют и фотография сотрудника, так как в форме редактируется уже другой объект.
При записи существующего объекта ничего обновлять не нужно, так как в процессе записи данные объекта не изменяются. Запись нового объекта выделена в отдельное действие, так как при этом изменяется ссылка объекта. В этом случае требуется обновить содержимое списка валют, так как его содержимое зависит от значения ссылки объекта. При изменении ссылки перечитывать фотографию не надо, так как она не изменилась.
При нажатии на кнопку "Перечитать данные" пользователь ожидает, что будут обновлены данные объекта и все связанные с ним данные, поэтому в этом случае следует обновить и список валют, и фотографию сотрудника.
Для решения этих задач форма предоставляет возможность назначить обработчик на событие формы ПриИзмененииДанных, и на изменении данных объекта Ссылка. Подключение обработчика изменения данных может быть осуществлено в теле модуля формы следующим образом:
В таблице отражено, на какие действия пользователя, вызываются эти события.
Событие | Присвоение | Запись нового | Перечитывание |
Событие формы ПриИзмененииДанных | Х | Х | |
Обработчик изменения данных Ссылка | Х | Х | Х |
Как видно из таблицы событие формы ПриИзмененииДанных вызывается на присвоение другого объекта (будет вызываться при открытии формы нового и существующего объекта) и при перечитывании данных, но не будет вызываться при записи нового объекта. Следовательно, данное событие подходит для синхронизации фотографии сотрудника с элементов формы картинка.
Обработчик изменения данных Ссылка вызывается при всех действиях. Следовательно, данное событие следует использовать для синхронизации списка валют.
Читайте также: