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