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

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

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

Разберем механику связи: Ввод на основании vs Структура подчиненности

Первое, что нам необходимо усвоить: механизм "Ввода на основании" и механизм отображения "Структуры подчиненности" — это две разные сущности в метаданных 1С. Настройка "Является основанием для..." в свойствах документа лишь разрешает пользователю нажать кнопку "Создать на основании" и определяет, какие типы данных могут быть переданы в обработку заполнения. Однако сама по себе эта настройка не гарантирует, что система «увидит» связь в отчете.

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

Шаг 1: Проверка реквизита связи в подчиненном документе

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

Рассмотрим пример правильного заполнения документа:


// Получаем ссылку на основной документ
ДокументСсылка = ЭтотОбъект.Ссылка; 

// Создаем новый объект
НовыйДок = Документы.ПеремещениеТоваров.СоздатьДокумент();

// Важно: метод Заполнить() сработает только если в модуле объекта 
// прописана процедура ОбработкаЗаполнения
НовыйДок.Заполнить(ДокументСсылка);

// Если в ОбработкеЗаполнения нет явного присвоения, делаем это принудительно:
НовыйДок.ДокументОснование = ДокументСсылка;

// Устанавливаем дополнительные реквизиты, если нужно
НовыйДок.СкладОтправитель = ЭтотОбъект.СкладОтправитель;

// Записываем документ! Без записи в БД критерий отбора его не найдет
НовыйДок.Записать(РежимЗаписиДокумента.Запись);

// Открываем форму для пользователя
НовыйДок.ПолучитьФорму().Открыть();

Важный момент: Если вы создали документ, заполнили его, но еще не нажали кнопку "Записать" (или не вызвали метод Записать() программно), он не попадет в структуру подчиненности родительского документа. Критерии отбора ищут данные в физических таблицах базы данных, а не в открытых формах.

Шаг 2: Настройка состава Критерия отбора

Если реквизит заполнен и документ записан, но связи всё равно нет, причина кроется в настройках метаданных. Выясним, какой критерий отбора отвечает за вывод структуры в вашей конфигурации. В типовых решениях (УТ, ERP, БП) это чаще всего критерий СвязанныеДокументы.

Выполним следующие действия в Конфигураторе (также предварительно можно провести Анализ структуры метаданных):

  1. Перейдем в ветку Общие -> Критерии отбора -> СвязанныеДокументы.
  2. Откроем вкладку Данные. Там указан тип значения (например, ДокументСсылка). Это типы документов, которые могут выступать в роли "родителя" (удобно изучать через Информер по метаданным).
  3. Перейдем на вкладку Состав. Именно здесь кроется решение проблемы.
  4. Нам нужно найти в списке наш подчиненный документ и отметить галочкой тот его реквизит, в котором хранится ссылка на документ-основание.

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

Шаг 3: Особенности работы с расширениями (Анализ состава расширений) и платформенные нюансы

Проанализируем ситуацию, описанную в сообщении 18. При использовании расширений конфигурации на платформе 8.3.25 и выше разработчики иногда сталкиваются с тем, что реквизиты документа не отображаются в составе критерия отбора внутри расширения.

Если вы добавили новый документ или новый реквизит связи через расширение:

  1. Убедитесь, что критерий отбора СвязанныеДокументы также добавлен в ваше расширение.
  2. Внутри расширения проверьте состав этого критерия. Если нужный реквизит отсутствует или не активен, попробуйте обновить версию платформы или очистить кэш конфигурации. В некоторых версиях (например, 8.3.25.1336) наблюдались баги отрисовки состава метаданных.
  3. Иногда помогает удаление критерия отбора из расширения и его повторное добавление.

Шаг 4: Программный вывод структуры в БСП

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

Выясним причину отсутствия документа через консоль запросов. Попробуйте выполнить простой запрос, чтобы понять, видит ли платформа связь на уровне базы данных:


ВЫБРАТЬ
    СвязанныеДокументы.Ссылка КАК ПодчиненныйДокумент
ИЗ
    КритерийОтбора.СвязанныеДокументы(&Родитель) КАК СвязанныеДокументы

Если этот запрос возвращает результат, значит, технически связь установлена, и проблему нужно искать в коде формы (например, в проверке прав доступа RLS или функциональных опциях, которые могут скрывать определенные типы документов).

Резюме и рекомендации

Подведем итог. Чтобы подчиненный документ гарантированно отображался в структуре родительского, рассмотрите следующий чек-лист:

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

← На главную