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