Код Икс Пи ☆ Центр автоматизации, сопровождения и поддержки
При открытии формы нового объекта (элемента справочника, документа) и при открытии формы существующего объекта возникает различная последовательность событий.
Форма нового объекта
Если открывается форма нового объекта, то сначала происходит начальное заполнение объекта данными (событие Обработка заполнения в модуле объекта, форма которого открывается), а затем вызываются два события формы: сначала на сервере (При создании на сервере) и затем на клиенте (При открытии). Эти два события позволяют подготовить форму к открытию (рис. 1).
Рис. 1. Последовательность событий при открытии формы нового объекта
№ | Модуль | Метод (процедура) |
1 | Модуль объекта (сервер) | Компиляция и код внизу модуля |
2 | Модуль объекта (сервер) | ОбработкаЗаполнения() |
3 | Модуль формы (сервер) | ПриСозданииНаСервере() |
4 | Модуль формы (клиент) | ПриОткрытии() |
Слева показан клиентский контекст, в котором вызываются события формы. Посередине и справа – серверный контекст, в котором вызываются как события формы, так и события самого прикладного объекта, форма которого открывается.
Форма существующего объекта
Если открывается форма существующего объекта, то последовательность событий будет иной (рис. 2). Сначала на сервере вызываются два события формы. Одно (При чтении на сервере) – чтобы подготовить дополнительные данные, которые зависят от данных объекта. Другое (При создании на сервере) – чтобы максимально подготовить форму к открытию. И наконец, на клиенте вызывается еще одно событие формы (При открытии), чтобы выполнить действия, связанные с открытием формы, которые на сервере выполнить невозможно.
Рис. 2. Последовательность событий при открытии формы существующего объекта
№ | Модуль | Метод (процедура) |
1 | Модуль объекта (сервер) | Компиляция и код внизу модуля |
2 | Модуль формы (сервер) | ПриЧтенииНаСервере() |
3 | Модуль формы (сервер) | ПриСозданииНаСервере() |
4 | Модуль формы (клиент) | ПриОткрытии() |
Из всех перечисленных событий нас прежде всего будут интересовать два события формы: При создании на сервере и При открытии.
Все, что можно сделать на сервере для подготовки формы к открытию, нужно делать в обработчике события При создании на сервере.
В обработчике события При открытии нужно делать только то, что на сервере сделать невозможно. Например, выдать предупреждение, задать вопрос. Или же выполнить те действия, которые выполняются именно тогда, когда форма наверняка открывается. Например, открыть связанную форму, которая «сама по себе» не существует, а существует, только если открыта родительская форма. Потому что обработчик При открытии – последний перед открытием формы, в котором можно отказаться от ее открытия. И если не происходит отказа от открытия родительской формы, то, значит, она наверняка будет открыта.
Заполнение реквизитов нового документа
Частая задача — сделать так, чтобы форма нового объекта открывалась не «пустая», а уже заполненная некоторыми начальными данными. Для самых простых случаев можно использовать свойство ЗначениеЗаполнения , которое есть у реквизитов объектов конфигурации. В более сложных случаях можно использовать свойство ЗаполнятьИзДанныхЗаполнения . Если ни тот, ни другой способы не подходят, на встроенном языке можно описать собственный алгоритм начального заполнения данных нового объекта.
Свойство ЗначениеЗаполнения
Например, есть документ Накладная с реквизитом Склад . В подавляющем большинстве случаев товары приходуются на главный склад, и лишь в отдельных редких случаях они могут приходоваться на другие склады. Чтобы облегчить работу оператора и не заставлять его каждый раз выбирать один и тот же склад в новых накладных, можно поступить следующим образом.
У реквизитов объектов конфигурации существует свойство ЗначениеЗаполнения . Реквизит Склад имеет тип ссылки на справочник Склады , а в справочнике Склады существует предопределенный элемент ГлавныйСклад . Тогда прямо в конфигураторе можно указать, что в новых документах реквизит Склад будет сразу же заполнен ссылкой на ГлавныйСклад :
Cвойство ЗаполнятьИзДанныхЗаполнения
Пусть у пользователя список накладных отобран по поставщику и по складу. Необходимо сделать так, чтобы при вводе новой накладной эти значения (поставщик и склад) сразу же подставлялись в нужные поля накладной. Для решения этой задачи достаточно открыть накладную в конфигураторе и для ее реквизитов Поставщик и Склад установить свойство ЗаполнятьИзДанныхЗаполнения :
Теперь будет происходить следующее. В режиме 1С:Предприятие пользователь отобрал список накладных по некоторому поставщику и некоторому складу. При вводе новой накладной с помощью команды «Создать» списка, поля Поставщик и Склад будут заполнены именно теми значениями, по которым отобран список накладных:
Собственный алгоритм заполнения реквизитов
Для этого предназначено событие объекта ОбработкаЗаполнения . Первым параметром процедуре ОбработкаЗаполнения() передаются ДанныеЗаполнения . Проанализировав их тип, можно определить, каким именно образом вводится новый объект, и выполнить соответствующий этому варианту алгоритм. Например:
Параметр СтандартнаяОбработка позволяет управлять дальнейшим развитием событий. Если ему присвоить значение Ложь , то никаких других действий по заполнению реквизитов формы платформа предпринимать не будет, а сразу создаст форму и вызовет ее серверное событие ПриСозданииНаСервере .
Если же не менять стандартное значение этого параметра, то после выхода из этого обработчика платформа попытается самостоятельно заполнить реквизиты объекта, подлежащие заполнению. Незаполненными она будет считать те реквизиты, которые имеют стандартное значение своего типа. Например, для типа Число это значение 0, для типа Строка — пустая строка, а для типа Ссылка — пустая ссылка.
Для простоты предположим, что у объекта всего один реквизит, подлежащий заполнению. Тогда платформа будет действовать по следующему алгоритму:
1С 8.3 : Последовательность событий при открытии формы нового элемента
Последовательность событий, которые происходят при открытии формы нового элемента, можно представить следующей схемой:
Прежде всего, при заполнении нового объекта данными, можно попробовать обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства ЗначениеЗаполнения и ЗаполнятьИзДанныхЗаполнения.
Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.
Если этих возможностей недостаточно, то тогда нужно использовать возможности встроенного языка.
Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения. Этот событие возникает только при создании новых объектов, при открытии форм существующих объектов это событие не вызывается. Поэтому в нем не нужно узнавать, новый это объект, или нет. Нужно только описать алгоритм заполнения объекта данными. При этом следует учитывать, что это событие будет вызываться в нескольких случаях:
- при интерактивном создании нового объекта,
- при вводе на основании,
- при выполнении метода объекта Заполнить().
При этом параметр Основание, передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент.
Например, он может иметь тип ссылки, если новый объект вводится на основании.
Или он может иметь тип Структура, если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка.
Также этот параметр может иметь тип Неопределено, если новый элемент создается интерактивной командой из панели действий. То есть в своем алгоритме начального заполнения полезно анализировать этот параметр.
Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере.
Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ.
Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:
Если требуется выполнять какие-то действия в обработчике события формы ПриОткрытии, то в нем ситуация аналогичная, нужно анализировать параметр формы Ключ.
Для тех кто не хочет читать все что выше, код проверки на ЭтоНовый в Управляемом приложении:
Обычные формы 1С¶
В обычных формах для передачи параметра обычно используется два варианта:
- менее распространенный способ: в форме объекта на вкладке «Реквизиты» добавлялся реквизит, при необходимости определялся доступ визуальными средствами
- более распространенный способ: в модуле формы объявлялась экспортная переменная и в обработчике «ПередОткрытием» значение обрабатывалось
Пример вызова формы:
Свойства реквизитов «Значение заполнения», «Заполнять из данных заполнения»¶
https://its.1c.ru/db/pubessence/content/94/hdoc
В версии 8.1 не существовало возможности автоматического (без написания кода) заполнения значений реквизитов добавляемых объектов. Для решения этой задачи приходилось писать обработчик события Обработка заполнения. При вводе на основании этот обработчик вызывался системой автоматически. В других случаях нужно было вызывать этот обработчик самостоятельно, из кода.
У реквизитов объектов конфигурации появилось два новых свойства: и .
Для примитивных типов это может быть некоторое число или строка. Для ссылочных типов можно выбрать одно из предопределенных значений, а для перечислений – существующие в конфигурации значения перечислений.
Свойство означает, что система самостоятельно должна заполнить этот реквизит, либо используя некоторые стандартные соглашения, либо ту информацию, которую разработчик передаст в данные заполнения.
Действия системы по начальному заполнению реквизитов можно программно переопределить в обработчике события объекта .