Почему в процедуре ОбработкаЗаполнения регистра сведений не передается ссылка на записанный документ?

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

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

При этом, если форму документа закрыть и открыть заново, автозаполнение начинает работать корректно. Проанализируем, почему возникает такое поведение платформы и как правильно организовать работу с отборами и автозаполнением.

Причина проблемы и механизм работы платформы

Рассмотрим механизм передачи значений в параметр ДанныеЗаполнения. При интерактивном добавлении новой записи через список или связанную таблицу формы платформа 1С автоматически подставляет значения в создаваемый объект на основе установленных в списке отборов с видом сравнения Равно.

Выясним причину ошибки поэтапно:

  1. При открытии формы нового (еще не записанного в базу данных) документа его реквизит Ссылка содержит пустую ссылку соответствующего типа.
  2. Если в обработчике при открытии формы программно устанавливается отбор на связанный список записей регистра по значению Ссылка, в фильтр жестко записывается пустая ссылка.
  3. Пользователь заполняет реквизиты документа и нажимает кнопку сохранения. Документ физически записывается в базу, и реквизит Ссылка получает реальный уникальный идентификатор.
  4. Однако установленный ранее отбор в элементе формы автоматически не пересчитывается и продолжает содержать исходную пустую ссылку.
  5. При нажатии кнопки добавления записи регистра платформа берет значение из текущего отбора списка и передает его в ДанныеЗаполнения.Документ, в результате чего измерение регистра заполняется пустой ссылкой.

Способ 1. Обновление отбора в обработчике после записи

Разберем по шагам базовое решение: необходимо принудительно обновить значение отбора в интерфейсном элементе сразу после успешной фиксации транзакции записи документа.

Для обычных форм используем процедуру-обработчик ПослеЗаписи модуля формы документа:


Процедура ПослеЗаписи(Отказ)
    // Обновляем значение установленного отбора актуальной ссылкой
    ЭлементыФормы.ПолученныеДокументы.Отбор.Документ.Значение = Ссылка;
    ЭлементыФормы.ПолученныеДокументы.Отбор.Документ.Использование = Истина;
КонецПроцедуры

Если разработка ведется на управляемых формах, аналогичное обновление параметров динамического списка или элементов отбора следует выполнять в обработчике ПослеЗаписиНаСервере:


&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    // Обновляем параметр динамического списка
    Список.Параметры.УстановитьЗначениеПараметра("Документ", Объект.Ссылка);
КонецПроцедуры

Способ 2. Предварительная генерация ссылки для нового документа

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

Рассмотрим пример инициализации ссылки при создании объекта:


СсылкаНаНовый = Документы.ИмяДокумента.ПолучитьСсылку(Новый УникальныйИдентификатор());
ЭтотОбъект.УстановитьСсылкуНового(СсылкаНаНовый);

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

Способ 3. Явная передача значений заполнения при открытии формы записи

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


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

ОткрытьФорму("РегистрСведений.ИмяРегистра.ФормаЗаписи", ПараметрыОткрытия, ЭтотОбъект);

Рекомендации по проектированию интерфейса

Обратим внимание на важные практические аспекты работы с подчиненными регистрами:

  1. Блокировка ввода до записи владельца: Создание записей в подчиненных регистрах для еще не сохраненного документа часто приводит к появлению ссылок на несуществующие объекты, если пользователь решит закрыть документ без сохранения. Рекомендуется отключать доступность таблиц и кнопок добавления связанных записей, пока метод ЭтоНовый() возвращает значение Истина.
  2. Программное создание записей: Важно помнить, что автозаполнение через ДанныеЗаполнения работает исключительно при интерактивном вводе через форму. При программной записи через СоздатьМенеджерЗаписи() или набор записей все измерения необходимо инициализировать явно в коде.
← На главную