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