Что такое события и с чем они связаны 1с
События, вызываемые при выполнении действий над объектом, редактируемым в форме
При создании форм редактирования для различных объектов часто встает задача отображения в форме либо дополнительной информации связанной с этим объектом, либо части данных объекта, которые не могут быть связаны с элементами формы посредством системного механизма связи с данными. В первом случае примером может служить список курсов валют в форме редактирования элемента валюты. Во втором случае примером служит фотография сотрудника, хранящаяся в хранилище значений.
Для правильной синхронизации данных с элементами формы нужно рассмотреть действия пользователя, которые приводят к необходимости обновлять те или иные данные, и какие инструменты, предоставляемые формой, нужно задействовать для решения этой задачи. При редактировании объекта в форме пользователь может совершать следующие действия: открыть форму нового объекта, открыть форму существующего объекта, записать новый объект, записать измененный объект, вызвать перечитывание объекта. Кроме того, разработчик может предусмотреть смену редактируемого объекта без закрытия формы. Действия по открытию формы нового и существующего объекта, изменения объекта в форме можно объединить в одно действие - назначение форме другого объекта для редактирования. При этом в форме должны быть обновлены и список валют и фотография сотрудника, так как в форме редактируется уже другой объект.
При записи существующего объекта ничего обновлять не нужно, так как в процессе записи данные объекта не изменяются. Запись нового объекта выделена в отдельное действие, так как при этом изменяется ссылка объекта. В этом случае требуется обновить содержимое списка валют, так как его содержимое зависит от значения ссылки объекта. При изменении ссылки перечитывать фотографию не надо, так как она не изменилась.
При нажатии на кнопку "Перечитать данные" пользователь ожидает, что будут обновлены данные объекта и все связанные с ним данные, поэтому в этом случае следует обновить и список валют, и фотографию сотрудника.
Для решения этих задач форма предоставляет возможность назначить обработчик на событие формы ПриИзмененииДанных, и на изменении данных объекта Ссылка. Подключение обработчика изменения данных может быть осуществлено в теле модуля формы следующим образом:
В таблице отражено, на какие действия пользователя, вызываются эти события.
Событие | Присвоение | Запись нового | Перечитывание |
Событие формы ПриИзмененииДанных | Х | Х | |
Обработчик изменения данных Ссылка | Х | Х | Х |
Как видно из таблицы событие формы ПриИзмененииДанных вызывается на присвоение другого объекта (будет вызываться при открытии формы нового и существующего объекта) и при перечитывании данных, но не будет вызываться при записи нового объекта. Следовательно, данное событие подходит для синхронизации фотографии сотрудника с элементов формы картинка.
Обработчик изменения данных Ссылка вызывается при всех действиях. Следовательно, данное событие следует использовать для синхронизации списка валют.
Продолжение одинэсной темы, ответы на книгу Радченко, занятие 2 и 3.
Документ предназначен для описания информации о совершенных хозяйственных операциях или произошедших событий в организации. Отличительная особенность документа - способность проведения - событие, которое отображает документ, повлияло на состояние учета. Так же документ привязан к конкретному моменту времени.
Реквизиты предназначены для описания наборов одинаковой для всех документов этого типа информации, стандартные реквизиты - дата и номер документа;
Табличные части - для описания набора информации, которая одинакова по структуре, но различна по количеству;
Проведение - действие, которое выполняет изменение других данных системы на основании информации документа;
В 1С:Предприятие создать новый документ. Данные заполняются как с помощью поля выбора, так и с клавиатуры;
Конструктор форм - это инструмент разработчика для создания форм, построенные по принципу "мастеров": ввод данных в определенной последовательности;
Редактор форм используется для создания и редактирования форм объектов прикладного решения. Редактор форм обеспечивает редактирования диалога формы, её реквизитов и редактирование модулей;
Основной интерфейсный инструмент, служит для управления и отображения записей Базы Данных; Примеры: кнопка, табличное поле, поле ввода и др;
Событие - процессы, возникающие при соблюдении определенных условий во время функционирования формы. Событие связаны с элементами формы.
Выбираем элемент формы, находим в палитре свойств событие, жмем на значок лупы. В модуле создастся шаблон процедуры - обработки события;
Общий модуль служит для хранения процедур, которые могут быть доступны для любых объектов конфигурации;
Объекты конфигурации, для которых может быть указан тип информации, содержащийся в объекте, называют типизированными объектами конфигурации. Некоторые объекты (справочники, документы, перечисления) могут сами образовывать типа, следовательно, они являются типообразующими объектами
Для чего нужны измерения регистра, ресурсы и реквизиты?
Измерение - накопление числовой информации в данном разрезе;
Резурсы - виды числовой информации, накапливаемой регистром;
Измерение так же является критерием отбора при получении данных;
Реквизиты - набор попутных данных для записи регистра;
Что такое движение регистра и что такое регистратор?
Движение регистра - в регистр отправляется некоторый набор записей, содержащий значение измерения, значения приращения ресурсов, ссылку на документ, который вызвал эти изменения (регистратор);
Регистратор - объект информационной базы данных (документ), который производит конкретные движения;
Как создать новый регистр накопления и описать его структуру?
В 1С:Конфигуратор правый клик - добавить. Структура определяется на вкладке "Данные"
Как создать движение документа с помощью конструктора движений?
Выбираем нужный документ в конфигураторе, правый клик - изменить, закладка "Движения"
Выбираем регистр, и жмем на конструктор движений.
В окошке "Регистры" - регистр, по которому будут проходить движения, в поле "реквизиты документа" - исходные данные для создания движений - реквизиты документа.
В нижнем окошке - устанавливаем соответствие между данными регистра и данными документа.
Как с помощью встроенного языка обойти табличную часть документа и обратится к её данным?
Это можно сделать с помощью циклов.
Для Каждого СтрокаТабличнойЧасти ИЗ ТабличнаяЧасть ЦИКЛ
Сообщить(СтрокаТабличнойЧасти.Услуга)
КонецЦикла
Как показать команды открытия списка регистра в интерфейсе конфигурации и в интерфейсе форм?
Подсистемы - правый клик - все подсистемы - выбираем нужную подсистему, ставим галочку напротив регистра
Почему появилась эта статья?
При совершении любых действий пользователем платформа 1С генерирует программные события. Как правило генерируется не одно событие, а целая цепочка событий. Задача программиста правильно разместить программный код в событиях, чтобы добиться ожидаемого поведения от программы. Однако начинающему программисту по 1С это не просто будет сделать, по причинам перечисленным ниже.
В управляемой форме могут быть сгенерированы события: ПриЧтенииНаСервере, ПриСозданииНаСервере, ПриОткрытии и т.д.
События в управляемой форме генерируются на клиенте и на сервере: ПередЗаписью, ПередЗаписьюНаСервере.
События вызываются в разных модулях: ФормаЭлемента, МодульОбъекта, МодульМенеджера.
Некоторые события могут вызываться несколько раз, если в списке несколько элементов справочника, например: ОбработкаПолученияПредставления.
Управляемая форма может быть открыта в результате выполнения разных действий пользователя при этом цепочки вызова событий будут различаться. При любых следующих действиях пользователя со справочником будет открыта управляемая форма: создание нового элемента, копирование элемента, изменение существующего элемента справочника.
События также генерируются элементами формы: при добавлении строки в табличную часть, при редактировании строки табличной части, при активизации строки или поля, при выборе элемента справочника в поле ввода и т.д.
Чтобы лучше понять логику и последовательность вызываемых событий, можно воспользоваться разработкой «Изучение событий» прикрепленной к данной статье. Зная контекст вызова события, последовательность событий и действия которые будет выполнять пользователь будет легче понять в какой обработчик событий лучше всего поместить свой программный код.
Инструкция к применению программы «Изучение событий»
Программа «Изучение событий» показывает события, которые генерирует платформа 1С при интерактивных действиях пользователя. Принцип работы следующий, пользователь открывает справочник, программа показывает цепочку событий. Пользователь помечает на удаление элемент справочника, программа выводит последовательность возникающих событий. События отображаются с небольшой задержкой по умолчанию 3 секунды, это необходимо чтобы отделить одну цепочку событий от другой цепочки событий. Поэтому выполнять интерактивные действия нужно «неторопливо».
Все события отображаются в специальном окне «Последние события». В нем можно включить или выключить запись событий. По умолчанию при первом открытии запись событий включена. Окно «Последние события» советую закрепить снизу экрана сразу при запуске программы, для удобного просмотра событий.
Программа не может сама определить каким действием вызвана цепочка событий, советую в поле «Действие причина» набирать с клавиатуры названия ваших последних действий, например «Открыта форма списка справочника», «Помечен на удаление элемент в списке справочника» и т.д. Это облегчит затем анализ действий и событий.
События записываются и отображаются для объектов, размещенных в разделе «Трассировка событий» при условии включенной записи событий в форме «Последние события».
Все записанные события можно посмотреть через «Отчет по событиям», который находится в разделе «Сервис».
Чтобы быстро очистить все записанные действия и события в разделе «Сервис» выбираем «Очистить события и действия».
Работа программы тестировалась на 1С платформе версии «8.3.9».
Программа «Изучение событий» может полезна как новичкам, так и программистам с опытом.
Система позволяет расширить практически любой программный модуль, относящийся к управляемому приложению. Невозможно расширять глобальные серверные модули. Также следует помнить, что расширение привилегированного общего модуля будет выполняться в непривилегированном режиме (если иное не разрешено профилем безопасности). Кроме того, предоставляется возможность создавать собственные общие модули, которые не могут быть привилегированными и глобальными серверными. Работа с собственным общим модулем в расширении ничем не отличается от работы с общим модулем обычной конфигурации.
Работа с расширенным программным модулем имеет существенные особенности, которые будут рассмотрены в данном разделе.
При разработке расширяющего модуля следует учитывать, что этот модуль будет находиться в одном пространстве имен с расширяемым модулем. В связи с этим, из расширяющего модуля имеется возможность использовать расширяемый контекст (переменные и методы) напрямую. Также следует помнить, что созданные в расширении экспортные методы и переменные автоматически попадают в публичный контекст расширяемого модуля.
В расширяющем модуле имеется возможность:
- Создавать собственные методы и переменные (если это допускает расширяемый модуль).
- Назначать собственные обработчики на события, которые не обрабатываются в расширяемой конфигурации.
- Перехватывать любой метод расширяемого модуля (в том числе и методы обработчиков событий), при этом имеется возможность:
- полностью заменить оригинальный метод собственным;
- создать методы, которые будут вызваны перед или после расширяемого метода.
Создание собственного метода или переменной в расширяющем модуле ничем не отличается от создания метода или переменной в расширяемой конфигурации, при работе без расширений. Однако при создании собственных методов или переменных рекомендуется предварять их имена префиксом, который позволит однозначно идентифицировать принадлежность метода или переменной тому или иному расширению, а также избежать конфликта имен с расширяемой конфигурацией.
Перехват методов расширяемой конфигурации (включая назначение обработчиков) реализуется с помощью специального механизма аннотаций (см. здесь). Всего имеется три различных возможности перехвата вызова метода, которые позволяет реализовать практически любую схему исполнения расширяемого и расширяющего программного кода.
В общем случае, аннотированный метод из программного модуля расширения выглядит следующим образом:
В данном примере Перед одна из трех возможных аннотаций, ИмяМетода имя расширяемого метода, Префикс_Имя имя расширяющего метода. Префикс_ это префикс расширения, который желательно указывать для всех методов расширения. Расширяться может как процедура, так и функция. Имя расширяющего метода должно подчиняться обычным правилам формирования имен процедур и функций. В частности, оно должно быть уникально.
Если расширяемый метод содержит какие-либо параметры, то:
- Все расширяющие методы обязаны иметь в точности такое же описание, как и расширяемый метод, с точностью до ключевых слов Знач в описаниях параметров методов.
- Значения параметров разделяются между всеми расширяющими методами из всех расширений и собственно расширяемым методом. Это значит, что если какой-либо расширяющий метод изменит значение параметра, все методы, которые получат управление после этого метода, получат измененное значение этого параметра.
- В расширяющем методе не имеет смысла указывать значения по умолчанию для параметров расширяемого метода. Значения по умолчанию будут определяться из описания расширяемого метода.
Также следует отметить, что если расширяется обработчик события, то расширяющий метод выполниться до того, как сработают подписки на «расширяемое» событие (см. здесь).
Исполнение до расширяемого метода (аннотация Перед)
Если метод аннотирован таким образом, это означает, что вначале будет выполнен метод расширения, а затем расширяемый метод.
Рис. 688. Схема исполнения «Перед»
Исполнение после расширяемого метода (аннотация После)
Если метод аннотирован таким образом, это означает, что вначале будет выполнен расширяемый метод, а затем метод расширения.
Рис. 689. Схема исполнения «После»
Обрамление расширяемого метода (аннотации Перед и После)
Если в расширяющем модуле созданы расширяющие методы, которые отмечены аннотациями Перед и После , то это означает, что вначале будет вызван метод, который отмечен аннотацией Перед , затем расширяемый метод и зачем метод расширения, отмеченный аннотацией После .
Рис. 690. Схема исполнения «Перед» и «После»
Замена метода (аннотация Вместо)
Под перехватом вызова метода понимается ситуация, когда метод, созданный в расширении, полностью замещает собой расширяемый метод. Другими словами, вызов метода расширяемой конфигурации приведет к исполнению метода расширения. Имя замещаемого метода указывается в качестве параметра аннотации. Рекомендуется использовать данный способ только в том случае, когда нет возможности использовать другие способы расширения методов.
Для расширяемых функций возможно применение только этого способа расширения.
Рис. 691. Схема исполнения «Вместо»
Чтобы иметь возможность модифицировать результат работы расширяемого метода, предусмотрен метод глобального контекста ПродолжитьВызов(). В качестве параметров метода должны быть указаны фактические параметры, которые переданы в расширяющий метод.
Рис. 692. Схема исполнения «Вместо» совместно с ПродолжитьВызов()
В исходном тексте пример будет выглядеть следующим образом:
В общем случае, редактирование программного модуля в расширении мало отличается от редактирования модуля в расширяемой конфигурации или модуля в конфигурации, где вообще нет расширений (подробнее о редактировании модулей см. здесь). В качестве основных отличий можно указать процесс заимствования метода из какого-либо программного модуля расширяемой конфигурации.
Для того чтобы добавить какой-либо метод в расширение, необходимо поместить курсор в требуемый метод (включая строку с именем метода) и выбрать команду Добавить в расширение . Если при выполнении данной команды в конфигураторе открыто одно расширение, то именно это расширение будет использовано. Во всех остальных случаях будет предложен выбор из расширений, которые добавлены для данной информационной базы.
При выполнении команды Добавить в расширение происходит следующее:
- Если объект, из модуля которого добавляется метод, отсутствует в выбранном расширении этот объект автоматически добавляется в расширение.
- Если расширяется метод из модуля, отличного от модуля формы:
- Разработчику предлагается выбрать аннотацию для метода ( Перед , После или Вместо ). При этом полужирным шрифтом выделяются те расширения метода, которые уже существуют в расширении.
- Если выбран существующий метод в расширении, то выполняется переход к этому методу. При этом возможна корректировка объявления метода, если оно стало отличаться от расширяемого метода.
- Если выбран несуществующий способ расширения, то будет создан новый метод в расширении, который будет предваряться соответствующей аннотацией.
- Для функций недоступны аннотации Перед и После
- Для процедуры недоступно:
- Аннотация Вместо , если уже существуют методы с аннотациями Перед или После
- Аннотация Перед / После , если уже существует метод с аннотацией Вместо
Следует учитывать, что если расширяемый метод обрамлен инструкциями препроцессора, то эти инструкции не будут перенесены в расширение.
При проверке соответствия описания расширяемого метода и метода расширения проверяются следующие характеристики методов:
- Количество параметров и признак передачи параметров «по значению» (ключевое слово Знач ).
- Метод является процедурой или функцией. Если определение метода изменяется с процедуры на функцию, а до этого процедура была расширена с применением аннотаций Перед / После , то аннотация будет заменена на аннотацию Вместо
- Если в модуле расширения присутствуют несколько методов с одинаковым именем, но которые обрамлены разными инструкциями препроцессора, то в расширении будет обновляться всегда первый из перечня таких методов.
Еще одной особенностью редактирования программного модуля в расширении является то, что имеется возможность перехода к расширяемому методу непосредственно из расширения. Для этого следует поместить курсор на имя расширяемого метода в аннотации, а затем воспользоваться стандартной командой редактора Перейти к определению
При разработке расширений следует исходить из следующих предположений:
Далее будут рассмотрены несколько примеров работы результирующей конфигурации при различных способах расширения.
Если оба расширения одинаково обрамляют (аннотации Перед и После ) расширяемый метод, то исполнение схема исполнения встроенного языка будет выглядеть следующим образом:
Рис. 693. Схема взаимодействия. Пример 1
При попытке вызвать метод Расширяемая() (в основной конфигурации), встроенный язык будет исполняться в следующем порядке:
- Будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения2
- Затем будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения1
- Затем будет вызван метод Расширяемая() из расширяемой конфигурации.
- Затем, в обратном порядке (относительно списка расширений, т. е. Расширение1 и Расширение2 ), будут вызваны методы, отмеченные аннотациями После("Расширяемая")
Т.е. вначале вызываются те методы расширений, которые разработчик отметил как вызываемые до исполнения расширяемого метода, затем исполняется собственно расширяемый метод, а затем вызываются те методы, которые разработчик отметил как вызываемые после исполнения расширяемого метода.
Если в каждом расширении расширяемый метод перехватывается полностью, то схема выполнения будет выглядеть следующим образом:
Рис. 694. Схема взаимодействия. Пример 2
Так произошло потом, что метод, отмеченный аннотацией Вместо , полностью заменяет собой расширяемый метод. Следует особо отметить, что если в этом примере поменять порядок регистрации расширений (первым будет Расширение2 , а последним Расширение1 ), то единственным выполнившимся методом будет метод из Расширения1
В связи с таким поведением «замещающего» метода расширения, рекомендуется не допускать ситуаций, когда какой-то метод расширяемой конфигурации расширяется с замещением (аннотация Вместо) более чем в одном одновременно работающим расширении. Другими словами, если в расширении, в модуле документа Документ1 замещается обработчик события ОбработкаПроведения , то рекомендуется не допускать ситуации, когда в информационной базе работает еще хотя бы одно расширение, которое каким-либо образом перехватывает обработчик события ОбработкаПроведения в документе Документ1 . Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов() , то одновременное существование нескольких расширений с таким способом расширения вполне допустимо.
Факт того, что расширение успешно подключено к расширяемой конфигурации, не означает, что все расширяющие методы, которые находятся в расширении, будут выполняться. Работоспособность методов расширения может быть изменена настройками профиля безопасности (подробнее см. здесь), который использует информационная база.
Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении расширения:
- В обычном режиме исполнения встроенного языка допустимо расширять как клиентские, так и серверные методы. Без ограничения места расположения методов.
- В безопасном режиме исполнения встроенного языка будут расширяться только клиентские методы и серверные обработчики форм, которые установлены через панель свойств. К остальным серверным методам (аннотированные серверные методы модулей формы и серверные общие модули) расширение применяться не будет.
Возможность расширения серверных общих модулей в клиент-серверном варианте регулируется профилем безопасности. Подробное описание см. здесь.
ps: оригинальные изображения взяты из источников
upd(ответ на комментарии Cyberhawk и Yashazz):
"Отказ=Истина", выставленный в одной подписке, не мешает срабатывать другой (т.е. процесс не прерывается)
утверждение верно для ОДНОГО события (в случае наличия нескольких подписок на одно и то же событие). Например, если есть 3 подписки на событие ПриЗаписи документа ПКО, то Отказ=Истина выставленный в одной из них не помешает срабатыванию других двух.
Отказ для каждого события проверяется в двух местах
1. После выполнения обработчика в модуле объекта/менеджера, включая все расширения.
2. После обработки всех подписок, включая все их расширения.
Т.е. если в п.1 выставили Отказ, то п.2 уже выполняться не будет. Думаю стоит это добавить в статью.(с) tormozit
Читайте также: