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