Почему в ОбработкуЗаполнения передается Структура и как найти место ее формирования

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 мы часто сталкиваемся с тем, что стандартная процедура ОбработкаЗаполнения ведет себя не совсем так, как ожидается. Обычно при вводе на основании в параметр ДанныеЗаполнения попадает ссылка на объект-источник. Однако нередко разработчики обнаруживают там объект типа Структура. В этой статье мы подробно разберем, почему это происходит, как платформа формирует эти данные и где искать код, ответственный за их создание.

Механизм процедуры ОбработкаЗаполнения

Процедура ОбработкаЗаполнения является обработчиком события создания нового объекта. Она принимает два параметра: ДанныеЗаполнения (содержит информацию, на основе которой нужно заполнить реквизиты) и СтандартнаяОбработка (булево значение, позволяющее отключить системные механизмы).

Рассмотрим типовой фрагмент кода, который часто встречается в конфигурациях:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
    ЗаполнитьПоЗначениямАвтозаполнения(ДанныеЗаполнения);
    
    Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
    ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.Контрагенты") Тогда
        // Логика заполнения на основании ссылки
    КонецЕсли;
КонецПроцедуры

Давайте выясним причины, по которым в ДанныеЗаполнения может оказаться именно Структура.

Причина 1: Интерактивное создание из формы списка с отборами

Это один из самых распространенных «невидимых» механизмов платформы. Когда пользователь находится в форме списка (например, в списке документов «Реализация товаров и услуг») и у него установлены фильтры, платформа пытается помочь в заполнении нового объекта.

Проанализируем ситуацию: если в динамическом списке установлен отбор по полю Организация с видом сравнения Равно, то при нажатии кнопки «Создать» платформа автоматически сформирует структуру. В эту структуру будет включен ключ Организация со значением из отбора. Этот механизм работает для:

Важно помнить, что в структуру попадают только те элементы отбора, где способ сравнения — Равно, В списке (если в списке ровно один элемент) или В группе (для иерархических справочников).

Причина 2: Программное открытие формы с ключом ЗначенияЗаполнения

Если мы открываем форму нового объекта программно, мы можем явно передать данные для заполнения. Для этого используется специальный параметр формы ЗначенияЗаполнения. Рассмотрим пример кода:


ЗначенияЗаполнения = Новый Структура;
ЗначенияЗаполнения.Вставить("Партнер", Объект.Партнер);
ЗначенияЗаполнения.Вставить("Склад", Объект.Склад);
ЗначенияЗаполнения.Вставить("Валюта", Объект.Валюта);

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);
ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);

В этом случае платформа при инициализации нового документа извлечет содержимое ключа ЗначенияЗаполнения и передаст его в процедуру ОбработкаЗаполнения именно как структуру. Это очень удобно, когда нам нужно передать не один объект-основание, а целый набор готовых значений.

Причина 3: Переопределение ввода на основании через Модули команд

В современных конфигурациях (например, на базе БСП) стандартный механизм «Ввода на основании» часто заменяется использованием команд. Вместо прямой связи в дереве метаданных создается общая команда или команда объекта.

Выясним, как это работает: в модуле команды разработчик описывает алгоритм сбора данных. Если команда предполагает ввод на основании сразу нескольких документов или требует предварительной обработки данных перед созданием нового объекта, разработчик формирует структуру и передает её в параметры открытия формы. Если вы видите, что в ОбработкаЗаполнения пришла структура, а стандартный стек вызовов пуст, обязательно проверьте Модуль команды соответствующего действия.

Метод ЗаполнитьПоЗначениямАвтозаполнения

Часто в начале процедуры мы видим вызов ЗаполнитьПоЗначениямАвтозаполнения(ДанныеЗаполнения). Разберем, что он делает. Если в ДанныеЗаполнения пришла структура, этот метод платформы автоматически сопоставляет ключи структуры с именами реквизитов объекта. Если имена совпадают, значения присваиваются автоматически. Это объясняет, почему иногда процедура ОбработкаЗаполнения кажется пустой, но документ при этом создается заполненным.

Как найти источник формирования структуры (Отладка)

Если вы столкнулись с необходимостью найти код, формирующий «загадочную» структуру, рекомендуем придерживаться следующего алгоритма:

  1. Точка останова: Поставьте точку останова в самом начале процедуры ОбработкаЗаполнения в модуле объекта.
  2. Анализ стека вызовов: Когда выполнение прервется, посмотрите окно «Стек вызовов». Если создание инициировано программно, вы увидите процедуру, вызвавшую ОткрытьФорму.
  3. Глобальный поиск: Если стек вызовов указывает на системные механизмы, воспользуйтесь глобальным поиском по конфигурации (Ctrl+Shift+F). Ищите строку ЗначенияЗаполнения или имя вашего документа/справочника в кавычках (например, "Документ.РеализацияТоваровУслуг").
  4. Проверка динамических списков: Если структура содержит поля, совпадающие с отборами в форме списка, из которой вы создаете объект, — значит, это автоматический механизм платформы.
  5. Проверка расширений: Не забывайте, что логика заполнения может быть переопределена в расширениях конфигурации через аннотации &Перед, &Вместо или &После.

Подводя итог, можно сказать, что тип данных Структура в заполнении — это мощный инструмент платформы, позволяющий гибко передавать наборы параметров. Понимание того, откуда берутся эти данные, значительно упрощает поддержку и доработку сложных корпоративных систем на базе 1С.

← На главную