Как при открытии формы определить, что создается новый элемент?
25.05.2018
Теги: 1С:Предприятие • Заполнить • ЗаполнятьИзДанныхЗаполнения • ЗначениеЗаполнения • Ключ • ОбработкаЗаполнения • ПриСозданииНаСервере
Необходимость в определении того, что создается новый элемент, возникает тогда, когда новый элемент нужно предварительно заполнить какими-то данными. Все действия, которые разработчику требуется сделать при создании нового объекта, должны быть выполнены на сервере.
Причем действия с данными самого объекта и действия с внешним видом его формы должны быть разделены. Действия с данными нужно выполнять в самом объекте, а внешним видом формы нужно управлять уже в форме, но в серверной процедуре.
Кроме этого могут понадобиться и другие действия при открытии формы, например открыть связанную форму, выдать предупреждение и т.д., которые нельзя сделать на сервере — их нужно выполнять в форме, но уже в клиентской процедуре.
Последовательность событий, которые происходят при открытии формы нового элемента, можно представить следующей схемой:
Прежде всего, при заполнении нового объекта данными, можно попробовать обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства ЗначениеЗаполнения
и ЗаполнятьИзДанныхЗаполнения
. Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.
Если этих возможностей недостаточно, то тогда нужно использовать возможности встроенного языка.
Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения
. Этот событие возникает только при создании новых объектов, при открытии форм существующих объектов это событие не вызывается. Поэтому в нем не нужно узнавать, новый это объект, или нет. Нужно только описать алгоритм заполнения объекта данными. При этом следует учитывать, что это событие будет вызываться в нескольких случаях:
- при интерактивном создании нового объекта
- при вводе на основании
- при выполнении метода объекта
Заполнить()
При этом параметр ДанныеЗаполнения
, передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент. Например, он может иметь тип Ссылка
, если новый объект вводится на основании. Или он может иметь тип Структура
, если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка. Также этот параметр может иметь тип Неопределено
, если новый элемент создается интерактивной командой из панели действий.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ДанныеЗаполнения = Неопределено Тогда // «Простой» ввод нового объекта ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Поставщики") Тогда // Новый объект вводится на основании другого объекта. // В этом случае в данные заполнения передается ссылка на объект, являющийся основанием. // В данном случае обрабатывается ввод на основании элемента справочника Поставщики. ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда // Новый объект вводится командой из отобранного списка. // В данных заполнения будет структура, содержащая значения отбора: // «Поставщик» — СсылкаНаПоставщика // «Склад» — СсылкаНаСклад КонецЕсли; КонецПроцедуры
Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере
. Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ
. Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект — в этом параметре будет ссылка на этот объект:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Ключ.Пустая() Тогда Сообщить("Создается новый объект"); КонецЕсли; // Если Объект.Ссылка.Пустая() Тогда // Сообщить("Создается новый объект"); // КонецЕсли; КонецПроцедуры
И, наконец, если требуется выполнять какие-то действия в обработчике события формы ПриОткрытии
, то в нем ситуация аналогичная, нужно анализировать параметр формы Ключ
.
&НаКлиенте Процедура ПриОткрытии(Отказ) Если Параметры.Ключ.Пустая() Тогда Сообщить("Создается новый объект"); КонецЕсли; КонецПроцедуры
Поиск: 1С:Предприятие • Заполнить • Заполнять из данных заполнения • Значение заполнения • Ключ • Обработка заполнения • При создании на сервере