Подчинённые документы в 1С 8.3: связь с основанием и отчёт по цепочке
Содержание
Подчинить документ в 1С — значит записать в него ссылку на документ-основание. Пользователь делает это командой Создать на основании в форме или списке исходного документа, а разработчик — настройкой вкладки «Ввод на основании» в Конфигураторе и реквизитом типа «ДокументСсылка». После этого связь видна в структуре подчинённости и доступна в запросах и в системе компоновки данных (СКД).
Способов три, и выбирают их по задаче. Нужна связь в типовой базе — хватает ввода на основании. Нужна связь в своей конфигурации — настраивают метаданные и обработчик заполнения. Нужен отчёт «заказ → отгрузка → оплата» — строят запрос и группировки в СКД. Ниже все три уровня по порядку, с кодом.
Как устроено подчинение документов в 1С 8.3
В платформе нет отдельного объекта «иерархия документов». Связь «основание → подчинённый» — это обычный реквизит подчинённого документа, в котором хранится ссылка на основание. Обычно его называют Основание или ДокументОснование.
Из этого следуют три практических вывода:
- 🔗 Связь направлена в одну сторону. Подчинённый документ знает своё основание, основание о подчинённых не знает. Чтобы найти «детей», нужен запрос с отбором по реквизиту.
- 🌳 Цепочка бывает любой глубины. Заказ → реализация → счёт-фактура → возврат. Каждый уровень — отдельный реквизит в своём документе.
- 🧩 Тип реквизита часто составной. Реализацию можно ввести на основании заказа, счёта или поступления. В запросах это влияет на скорость (подробно в разделе про оптимизацию).
Иерархия справочников — другое дело. Там есть встроенное поле Родитель, конструкция В ИЕРАРХИИ и тип группировки «Иерархия» в СКД. Для документов этих инструментов нет: «дерево» строят сами, через соединения и группировки.
| Что нужно | Где делается | Кто делает |
|---|---|---|
| Создать документ по основанию | Форма или список документа | Пользователь |
| Привязать уже созданный документ | Поле основания в форме | Пользователь |
| Разрешить ввод на основании в своей конфигурации | Конфигуратор, свойства документа | Разработчик |
| Показать цепочку в отчёте | Запрос, СКД | Разработчик |
Подчинить документ в типовой базе: ввод на основании
В БП 3.0, ЗУП 3.1, УТ 11 связь создаётся из документа, который станет основанием.
- Откройте исходный документ (например, счёт покупателю) или выделите его в списке.
- В командной панели нажмите
Создать на основании. - Выберите тип документа из списка — в нём только те виды, которые разрешила конфигурация.
- Новый документ откроется заполненным: контрагент, договор, табличная часть, ссылка на основание.
- Проверьте данные и проведите документ.
Если документ уже создан вручную, подчинить его можно задним числом. Откройте его и найдите поле, в которое выбирается основание (в разных документах оно подписано по-разному: «Основание», «Счёт», «Заказ»). Выберите документ, запишите. Табличную часть при этом программа не перезаполнит — связь появится, данные останутся прежними.
Если в списке Создать на основании нет нужного вида документа, это не ошибка прав. Значит, разработчики конфигурации такую пару не предусмотрели. Добавить её можно только доработкой (следующий раздел) или расширением.
Посмотреть результат удобно через команду «Структура подчинённости» в форме документа. В типовых конфигурациях она вынесена значком на командную панель; если значка нет, ищите её в меню Ещё. Откроется дерево: основание сверху, подчинённые ниже, с датой, номером и признаком проведения.
Настройка в Конфигураторе: ввод на основании и реквизит-основание
Своя конфигурация или доработка требуют трёх шагов. Перед правкой рабочей базы сделайте выгрузку .dt или работайте в копии.
Шаг 1. Реквизит для ссылки на основание
В подчинённом документе (пусть это Реализация) добавьте реквизит Основание. Тип — ДокументСсылка.ЗаказПокупателя или составной, если оснований несколько. В свойствах реквизита включите Индексировать: по этому полю пойдут отборы, и индекс заметно ускорит поиск подчинённых.
Шаг 2. Вкладка «Ввод на основании»
Откройте свойства документа Реализация, вкладку «Ввод на основании»:
- в списке «Вводится на основании» добавьте
ЗаказПокупателя; - у документа
ЗаказПокупателяэта же связь отобразится в списке «Является основанием для».
Платформа сама добавит команду Создать на основании в формы заказа. Если форма заказа своя и командная панель настроена вручную, проверьте, что группа команд «Создать на основании» на ней не скрыта.
Шаг 3. Обработчик заполнения
Связь в метаданных только разрешает ввод. Чем заполнить новый документ, решает процедура ОбработкаЗаполнения в модуле объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
Основание = ДанныеЗаполнения;
Контрагент = ДанныеЗаполнения.Контрагент;
Договор = ДанныеЗаполнения.Договор;
Для Каждого СтрокаЗаказа Из ДанныеЗаполнения.Товары Цикл
НоваяСтрока = Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗаказа);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Имена документов и реквизитов здесь условные — подставьте свои. ЗаполнитьЗначенияСвойств копирует колонки с совпадающими именами, поэтому названия колонок табличных частей лучше держать одинаковыми.
Шаг 4. Структура подчинённости на БСП
В конфигурациях на Библиотеке стандартных подсистем дерево подчинённости строится по критерию отбора СвязанныеДокументы. Добавьте в его состав новый реквизит Реализация.Основание — иначе подчинённый документ не появится в дереве, хотя связь в данных есть.
После правок выполните Обновить конфигурацию базы данных (F7).
Запрос для отчёта по подчинённым документам
Когда связь записана, цепочку можно выбрать запросом. Для фиксированной глубины (2–3 уровня) хватает левых соединений. Соберите его в Конструкторе запроса: добавьте таблицы, на вкладке «Связи» задайте условия по реквизиту основания и снимите флажок «Все» у подчинённых таблиц — так получится ЛЕВОЕ СОЕДИНЕНИЕ.
ВЫБРАТЬ
Заказ.Ссылка КАК Заказ,
Заказ.Контрагент КАК Контрагент,
Реализация.Ссылка КАК Реализация,
Реализация.СуммаДокумента КАК СуммаОтгрузки,
Оплата.Ссылка КАК Оплата,
Оплата.СуммаДокумента КАК СуммаОплаты
ИЗ
Документ.ЗаказПокупателя КАК Заказ
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация КАК Реализация
ПО (Реализация.Основание = Заказ.Ссылка)
И (НЕ Реализация.ПометкаУдаления)
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеОплаты КАК Оплата
ПО (Оплата.Основание = Реализация.Ссылка)
И (НЕ Оплата.ПометкаУдаления)
ГДЕ
Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Заказ.Проведен
Условие на пометку удаления стоит именно в ПО, а не в ГДЕ. Если перенести его в ГДЕ, заказы без отгрузки выпадут из результата: у них Реализация.ПометкаУдаления равно NULL, и условие не выполнится.
Глубина неизвестна заранее? Запросом с соединениями её не обойти — язык запросов 1С не поддерживает рекурсию. Тогда подчинённых собирают в цикле, уровень за уровнем:
Функция ВсеПодчиненные(Корень) Экспорт
Найденные = Новый Соответствие;
Результат = Новый Массив;
Текущие = Новый Массив;
Текущие.Добавить(Корень);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.Реализация КАК Док
|ГДЕ
| Док.Основание В (&Основания)";
Пока Текущие.Количество() > 0 Цикл
Запрос.УстановитьПараметр("Основания", Текущие);
Выборка = Запрос.Выполнить().Выбрать();
Текущие = Новый Массив;
Пока Выборка.Следующий() Цикл
Если Найденные[Выборка.Ссылка] = Неопределено Тогда
Найденные.Вставить(Выборка.Ссылка, Истина);
Результат.Добавить(Выборка.Ссылка);
Текущие.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Соответствие Найденные защищает от зацикливания: если в данных случайно образовалось кольцо (документ А — основание Б, Б — основание А), цикл всё равно завершится. Если подчинённые бывают разных видов, объедините таблицы через ОБЪЕДИНИТЬ ВСЕ с одинаковым полем Ссылка.
Связи наборов данных в СКД
Тот же отчёт в СКД можно собрать не одним запросом, а несколькими наборами со связями. Это удобно, когда уровни приходят из разных источников или запрос с пятью соединениями становится нечитаемым.
- На вкладке «Наборы данных» создайте набор-запрос
Заказыс полямиСсылка,Контрагент,Дата. - Создайте второй набор
Реализациис полямиСсылка,Основание,СуммаДокумента. - На вкладке «Связи наборов данных» добавьте строку:
| Колонка связи | Значение |
|---|---|
| Набор данных источник | Заказы |
| Набор данных приемник | Реализации |
| Выражение источник | Ссылка |
| Выражение приемник | Основание |
| Обязательная | выключено |
Связь работает как левое соединение: заказы без отгрузок останутся в отчёте с пустыми полями приёмника. Флажок «Обязательная» превращает её во внутреннее соединение — включайте, только если нужны строго заказы с отгрузками.
Поле Параметр в той же строке передаёт значения источника в параметр запроса приёмника. Тогда второй набор читает только реализации нужных заказов, а не всю таблицу.
В СКД поля с одинаковым именем в разных наборах склеиваются в одно. Назовите поле ссылки во втором наборе Реализация, а не Ссылка, иначе получите путаницу в группировках.
Параметры и отборы: отчёт по одному документу
Частая задача — показать цепочку одного выбранного заказа, как в структуре подчинённости, но со своими колонками.
- 📌 В запросе первого уровня добавьте условие
Заказ.Ссылка = &Документ. СКД сама создаст параметрДокументна вкладке «Параметры». - 🧾 В настройках варианта отчёта включите параметр в быстрые пользовательские настройки — он появится над отчётом.
- 🔁 Для нескольких документов используйте
В (&Документы)и в свойствах параметра включите «Доступен список значений».
Если отчёт открывается из формы документа, параметр задают программно через ФиксированныеНастройки или отбор при открытии формы отчёта. Тогда пользователь нажимает команду в документе и сразу видит его цепочку.
Отбор по периоду в СКД лучше вешать на основание (заказ), а не на подчинённые. Иначе заказ сентября с отгрузкой в октябре пропадёт из отчёта за сентябрь или октябрь — в зависимости от того, где стоит условие.
Группировки в макете: дерево «основание → подчинённые»
Визуальное дерево в СКД получается вложенными группировками.
- На вкладке «Настройки» добавьте группировку
Заказ. - Внутрь неё — группировку
Реализация, а в неё —Оплата. - Ресурсы
СуммаОтгрузкииСуммаОплатыобъявите на вкладке «Ресурсы» с функциейСумма: итоги посчитаются по каждому уровню. - В «Других настройках» задайте расположение группировок «Начало» и включите вывод итогов — получится отчёт с раскрывающимися строками.
Тип группировки «Иерархия» и «Только иерархия» здесь не поможет. Он работает для полей иерархических справочников (номенклатура с папками, подразделения). Для документов иерархию задаёт порядок вложенных группировок.
Если нужна иерархия номенклатуры внутри отгрузки, добавьте четвёртый уровень Номенклатура с типом «Иерархия». В языке запросов тот же эффект даёт ИТОГИ ... ПО Номенклатура ИЕРАРХИЯ.
Двойной клик по ячейке с документом в готовом отчёте открывает сам документ: СКД расшифровывает ссылочные поля без дополнительных настроек.
Медленный отчёт и пропавшие связи: что проверить
Основание.Дата) порождает соединение со всеми таблицами документов из его типа. Приведите тип: ВЫРАЗИТЬ(Реализация.Основание КАК Документ.ЗаказПокупателя).Дата. Проверьте, что реквизит основания индексирован.СвязанныеДокументы (конфигурации на БСП) или поле основания в документе пустое — документ создавали вручную.ОбработкаЗаполнения не обрабатывает этот тип основания. Добавьте ветку для нужного ДокументСсылка.Ещё один источник медленной работы — отбор НЕ Проведен или ПометкаУдаления по большим таблицам без отбора по периоду. Ограничивайте выборку датой основания: это первое, что сокращает объём чтения.
Частые вопросы
Можно ли подчинить один документ двум основаниям сразу?
Как отвязать документ от основания?
Влияет ли подчинение на проведение?
ОбработкаПроведения или при записи.