Подчинённые документы в 1С 8.3: связь с основанием и отчёт по цепочке

· 9 мин

Содержание

Подчинить документ в 1С — значит записать в него ссылку на документ-основание. Пользователь делает это командой Создать на основании в форме или списке исходного документа, а разработчик — настройкой вкладки «Ввод на основании» в Конфигураторе и реквизитом типа «ДокументСсылка». После этого связь видна в структуре подчинённости и доступна в запросах и в системе компоновки данных (СКД).

Способов три, и выбирают их по задаче. Нужна связь в типовой базе — хватает ввода на основании. Нужна связь в своей конфигурации — настраивают метаданные и обработчик заполнения. Нужен отчёт «заказ → отгрузка → оплата» — строят запрос и группировки в СКД. Ниже все три уровня по порядку, с кодом.

Как устроено подчинение документов в 1С 8.3

В платформе нет отдельного объекта «иерархия документов». Связь «основание → подчинённый» — это обычный реквизит подчинённого документа, в котором хранится ссылка на основание. Обычно его называют Основание или ДокументОснование.

Из этого следуют три практических вывода:

  • 🔗 Связь направлена в одну сторону. Подчинённый документ знает своё основание, основание о подчинённых не знает. Чтобы найти «детей», нужен запрос с отбором по реквизиту.
  • 🌳 Цепочка бывает любой глубины. Заказ → реализация → счёт-фактура → возврат. Каждый уровень — отдельный реквизит в своём документе.
  • 🧩 Тип реквизита часто составной. Реализацию можно ввести на основании заказа, счёта или поступления. В запросах это влияет на скорость (подробно в разделе про оптимизацию).

Иерархия справочников — другое дело. Там есть встроенное поле Родитель, конструкция В ИЕРАРХИИ и тип группировки «Иерархия» в СКД. Для документов этих инструментов нет: «дерево» строят сами, через соединения и группировки.

Что нужноГде делаетсяКто делает
Создать документ по основаниюФорма или список документаПользователь
Привязать уже созданный документПоле основания в формеПользователь
Разрешить ввод на основании в своей конфигурацииКонфигуратор, свойства документаРазработчик
Показать цепочку в отчётеЗапрос, СКДРазработчик

Подчинить документ в типовой базе: ввод на основании

В БП 3.0, ЗУП 3.1, УТ 11 связь создаётся из документа, который станет основанием.

  1. Откройте исходный документ (например, счёт покупателю) или выделите его в списке.
  2. В командной панели нажмите Создать на основании.
  3. Выберите тип документа из списка — в нём только те виды, которые разрешила конфигурация.
  4. Новый документ откроется заполненным: контрагент, договор, табличная часть, ссылка на основание.
  5. Проверьте данные и проведите документ.

Если документ уже создан вручную, подчинить его можно задним числом. Откройте его и найдите поле, в которое выбирается основание (в разных документах оно подписано по-разному: «Основание», «Счёт», «Заказ»). Выберите документ, запишите. Табличную часть при этом программа не перезаполнит — связь появится, данные останутся прежними.

Если в списке Создать на основании нет нужного вида документа, это не ошибка прав. Значит, разработчики конфигурации такую пару не предусмотрели. Добавить её можно только доработкой (следующий раздел) или расширением.

Посмотреть результат удобно через команду «Структура подчинённости» в форме документа. В типовых конфигурациях она вынесена значком на командную панель; если значка нет, ищите её в меню Ещё. Откроется дерево: основание сверху, подчинённые ниже, с датой, номером и признаком проведения.

Настройка в Конфигураторе: ввод на основании и реквизит-основание

Своя конфигурация или доработка требуют трёх шагов. Перед правкой рабочей базы сделайте выгрузку .dt или работайте в копии.

Шаг 1. Реквизит для ссылки на основание

В подчинённом документе (пусть это Реализация) добавьте реквизит Основание. Тип — ДокументСсылка.ЗаказПокупателя или составной, если оснований несколько. В свойствах реквизита включите Индексировать: по этому полю пойдут отборы, и индекс заметно ускорит поиск подчинённых.

Шаг 2. Вкладка «Ввод на основании»

Откройте свойства документа Реализация, вкладку «Ввод на основании»:

  • в списке «Вводится на основании» добавьте ЗаказПокупателя;
  • у документа ЗаказПокупателя эта же связь отобразится в списке «Является основанием для».

Платформа сама добавит команду Создать на основании в формы заказа. Если форма заказа своя и командная панель настроена вручную, проверьте, что группа команд «Создать на основании» на ней не скрыта.

Шаг 3. Обработчик заполнения

Связь в метаданных только разрешает ввод. Чем заполнить новый документ, решает процедура ОбработкаЗаполнения в модуле объекта:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        Основание  = ДанныеЗаполнения;
        Контрагент = ДанныеЗаполнения.Контрагент;
        Договор    = ДанныеЗаполнения.Договор;
        Для Каждого СтрокаЗаказа Из ДанныеЗаполнения.Товары Цикл
            НоваяСтрока = Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗаказа);
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Имена документов и реквизитов здесь условные — подставьте свои. ЗаполнитьЗначенияСвойств копирует колонки с совпадающими именами, поэтому названия колонок табличных частей лучше держать одинаковыми.

Шаг 4. Структура подчинённости на БСП

В конфигурациях на Библиотеке стандартных подсистем дерево подчинённости строится по критерию отбора СвязанныеДокументы. Добавьте в его состав новый реквизит Реализация.Основание — иначе подчинённый документ не появится в дереве, хотя связь в данных есть.

После правок выполните Обновить конфигурацию базы данных (F7).

Запрос для отчёта по подчинённым документам

Когда связь записана, цепочку можно выбрать запросом. Для фиксированной глубины (2–3 уровня) хватает левых соединений. Соберите его в Конструкторе запроса: добавьте таблицы, на вкладке «Связи» задайте условия по реквизиту основания и снимите флажок «Все» у подчинённых таблиц — так получится ЛЕВОЕ СОЕДИНЕНИЕ.

ВЫБРАТЬ
    Заказ.Ссылка КАК Заказ,
    Заказ.Контрагент КАК Контрагент,
    Реализация.Ссылка КАК Реализация,
    Реализация.СуммаДокумента КАК СуммаОтгрузки,
    Оплата.Ссылка КАК Оплата,
    Оплата.СуммаДокумента КАК СуммаОплаты
ИЗ
    Документ.ЗаказПокупателя КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация КАК Реализация
        ПО (Реализация.Основание = Заказ.Ссылка)
            И (НЕ Реализация.ПометкаУдаления)
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеОплаты КАК Оплата
        ПО (Оплата.Основание = Реализация.Ссылка)
            И (НЕ Оплата.ПометкаУдаления)
ГДЕ
    Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И Заказ.Проведен

Условие на пометку удаления стоит именно в ПО, а не в ГДЕ. Если перенести его в ГДЕ, заказы без отгрузки выпадут из результата: у них Реализация.ПометкаУдаления равно NULL, и условие не выполнится.

Глубина неизвестна заранее? Запросом с соединениями её не обойти — язык запросов 1С не поддерживает рекурсию. Тогда подчинённых собирают в цикле, уровень за уровнем:

Функция ВсеПодчиненные(Корень) Экспорт

    Найденные = Новый Соответствие;
    Результат = Новый Массив;
    Текущие   = Новый Массив;
    Текущие.Добавить(Корень);

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Док.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.Реализация КАК Док
    |ГДЕ
    |    Док.Основание В (&Основания)";

    Пока Текущие.Количество() > 0 Цикл
        Запрос.УстановитьПараметр("Основания", Текущие);
        Выборка = Запрос.Выполнить().Выбрать();
        Текущие = Новый Массив;
        Пока Выборка.Следующий() Цикл
            Если Найденные[Выборка.Ссылка] = Неопределено Тогда
                Найденные.Вставить(Выборка.Ссылка, Истина);
                Результат.Добавить(Выборка.Ссылка);
                Текущие.Добавить(Выборка.Ссылка);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;

    Возврат Результат;

КонецФункции

Соответствие Найденные защищает от зацикливания: если в данных случайно образовалось кольцо (документ А — основание Б, Б — основание А), цикл всё равно завершится. Если подчинённые бывают разных видов, объедините таблицы через ОБЪЕДИНИТЬ ВСЕ с одинаковым полем Ссылка.

Связи наборов данных в СКД

Тот же отчёт в СКД можно собрать не одним запросом, а несколькими наборами со связями. Это удобно, когда уровни приходят из разных источников или запрос с пятью соединениями становится нечитаемым.

  1. На вкладке «Наборы данных» создайте набор-запрос Заказы с полями Ссылка, Контрагент, Дата.
  2. Создайте второй набор Реализации с полями Ссылка, Основание, СуммаДокумента.
  3. На вкладке «Связи наборов данных» добавьте строку:
Колонка связиЗначение
Набор данных источникЗаказы
Набор данных приемникРеализации
Выражение источникСсылка
Выражение приемникОснование
Обязательнаявыключено

Связь работает как левое соединение: заказы без отгрузок останутся в отчёте с пустыми полями приёмника. Флажок «Обязательная» превращает её во внутреннее соединение — включайте, только если нужны строго заказы с отгрузками.

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

В СКД поля с одинаковым именем в разных наборах склеиваются в одно. Назовите поле ссылки во втором наборе Реализация, а не Ссылка, иначе получите путаницу в группировках.

Параметры и отборы: отчёт по одному документу

Частая задача — показать цепочку одного выбранного заказа, как в структуре подчинённости, но со своими колонками.

  • 📌 В запросе первого уровня добавьте условие Заказ.Ссылка = &Документ. СКД сама создаст параметр Документ на вкладке «Параметры».
  • 🧾 В настройках варианта отчёта включите параметр в быстрые пользовательские настройки — он появится над отчётом.
  • 🔁 Для нескольких документов используйте В (&Документы) и в свойствах параметра включите «Доступен список значений».

Если отчёт открывается из формы документа, параметр задают программно через ФиксированныеНастройки или отбор при открытии формы отчёта. Тогда пользователь нажимает команду в документе и сразу видит его цепочку.

Отбор по периоду в СКД лучше вешать на основание (заказ), а не на подчинённые. Иначе заказ сентября с отгрузкой в октябре пропадёт из отчёта за сентябрь или октябрь — в зависимости от того, где стоит условие.

Группировки в макете: дерево «основание → подчинённые»

Визуальное дерево в СКД получается вложенными группировками.

  1. На вкладке «Настройки» добавьте группировку Заказ.
  2. Внутрь неё — группировку Реализация, а в неё — Оплата.
  3. Ресурсы СуммаОтгрузки и СуммаОплаты объявите на вкладке «Ресурсы» с функцией Сумма: итоги посчитаются по каждому уровню.
  4. В «Других настройках» задайте расположение группировок «Начало» и включите вывод итогов — получится отчёт с раскрывающимися строками.

Тип группировки «Иерархия» и «Только иерархия» здесь не поможет. Он работает для полей иерархических справочников (номенклатура с папками, подразделения). Для документов иерархию задаёт порядок вложенных группировок.

Если нужна иерархия номенклатуры внутри отгрузки, добавьте четвёртый уровень Номенклатура с типом «Иерархия». В языке запросов тот же эффект даёт ИТОГИ ... ПО Номенклатура ИЕРАРХИЯ.

Двойной клик по ячейке с документом в готовом отчёте открывает сам документ: СКД расшифровывает ссылочные поля без дополнительных настроек.

Медленный отчёт и пропавшие связи: что проверить

Диагностика: выберите симптом

Ещё один источник медленной работы — отбор НЕ Проведен или ПометкаУдаления по большим таблицам без отбора по периоду. Ограничивайте выборку датой основания: это первое, что сокращает объём чтения.

Частые вопросы

Можно ли подчинить один документ двум основаниям сразу?
Через один реквизит — нет, он хранит одну ссылку. Если оснований несколько, заведите табличную часть «Основания» с колонкой-ссылкой и включите её в критерий отбора для структуры подчинённости.
Как отвязать документ от основания?
Очистите поле основания в форме и запишите документ. Движения и табличная часть не изменятся, пропадёт только связь в структуре подчинённости и в отчётах.
Влияет ли подчинение на проведение?
Само по себе нет. Связь — просто ссылка. Контроль появляется, только если разработчик проверяет основание в ОбработкаПроведения или при записи.
Подчинённые документы удалятся вместе с основанием?
Нет. При удалении помеченного основания программа проверит ссылки и не даст удалить документ, на который ссылаются подчинённые. Сначала пометьте и удалите подчинённые или очистите в них поле основания.
Можно ли добавить ввод на основании в типовую конфигурацию без снятия с поддержки?
Да, через расширение конфигурации: в нём добавляют команду создания и обработчик заполнения. Основную конфигурацию с поддержки снимать не нужно.