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