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