Разработка и Конфигурация · 11 мин
Как получить основание документа в 1С
Как программно получить основание документа в 1С: реквизит Основание, критерий отбора СвязанныеДокументы, запрос по табличной части. Примеры кода и типичные ошибки.
Основание документа — это документ, на базе которого создан текущий: например, «Реализация товаров и услуг» введена на основании «Заказа покупателя», а «Поступление на расчетный счет» — на основании «Счета на оплату». Получить основание требуется и пользователю в интерфейсе, и разработчику в коде: для отчетов, печатных форм, проверок заполнения и построения цепочек документов.
Проблема в том, что в типовых конфигурациях 1С нет единого стандартного реквизита «Основание» у всех видов документов. В одних объектах связь хранится в реквизите шапки (например, «ДокументОснование» или «ЗаказПокупателя»), в других — в табличной части, а универсальный механизм поиска реализован через критерий отбора «Связанные документы». Поэтому способ получения основания зависит от конфигурации и конкретного вида документа.
Ниже разобраны рабочие способы: через структуру подчиненности в интерфейсе, через реквизит объекта, через критерий отбора и через запрос. Для каждого способа указаны условия применения и ограничения.
Как устроена связь документов в 1С
При вводе документа «на основании» платформа не создает какого-то единого служебного поля связи. Разработчик конфигурации сам решает, где хранить ссылку: в реквизите шапки, в табличной части или в нескольких местах сразу. Например, в «1С:Бухгалтерии» у многих документов есть реквизит «ДокументОснование», а в «Управлении торговлей» связь часто идет через реквизиты «ЗаказПокупателя», «Сделка» или табличную часть «Товары» с колонкой «Заказ».
Чтобы пользователь мог видеть цепочку независимо от того, где физически лежит ссылка, в типовых конфигурациях используется критерий отбора «Связанные документы» (в некоторых конфигурациях — «ПодчиненныеДокументы» или аналог). Критерий отбора объединяет реквизиты разных видов документов, и платформа умеет быстро находить все объекты, где в этих реквизитах встречается заданная ссылка.
Как посмотреть основание в интерфейсе без программирования
Пользователю чаще всего достаточно встроенных средств. Откройте документ и нажмите кнопку «Еще» → «Структура подчиненности» (в ряде конфигураций — «Связанные документы»). Откроется дерево: выше текущего документа показаны основания, ниже — документы, введенные на его основании. Двойной щелчок по строке открывает нужный объект.
Второй вариант — поле «Основание» прямо в форме документа, если оно выведено разработчиком. В «1С:Бухгалтерии» оно часто доступно по гиперссылке внизу формы или на закладке «Дополнительно». Если поле не видно, проверьте настройки формы: кнопка «Еще» → «Изменить форму» позволяет включить отображение скрытого реквизита, если у вас есть права на изменение формы.
- 1Откройте нужный документ в режиме просмотра
- 2Нажмите «Еще» → «Структура подчиненности» (или «Связанные документы»)
- 3В дереве найдите ветку выше текущего документа — это основания
- 4Откройте основание двойным щелчком и проверьте его номер и дату
Как получить основание через реквизит документа
Если у вида документа есть явный реквизит основания, самый быстрый способ — обратиться к нему через объект или ссылку. Состав реквизитов смотрите в конфигураторе: откройте метаданные документа и проверьте список реквизитов шапки и табличных частей.
// Прямое обращение к реквизиту шапки
Основание = ДокументОбъект.ДокументОснование;
// Через ссылку (платформа сама получит данные из базы)
Если ЗначениеЗаполнено(СсылкаНаДокумент.ДокументОснование) Тогда
Сообщить("Основание: " + СсылкаНаДокумент.ДокументОснование);
КонецЕсли;
Если основание хранится в табличной части (типично для реализаций и поступлений, где каждая строка может ссылаться на свой заказ), прямого обращения к «ДокументОснование» не будет. В этом случае основания собирают перебором строк табличной части или запросом с группировкой по колонке заказа.
Как получить основание через критерий отбора «Связанные документы»
Это универсальный механизм, который работает независимо от того, в каком реквизите хранится ссылка. Критерий отбора доступен в коде через менеджер критериев отбора.
// Найти все документы, связанные с текущим
Связанные = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаДокумент);
Для Каждого Док Из Связанные Цикл
// Отбираем только те, что являются основанием:
// обычно это документы с датой раньше текущей
Сообщить(Док.Метаданные().Имя + " №" + Док.Номер);
КонецЦикла;
Важный нюанс: критерий возвращает и основания, и подчиненные документы — платформа не разделяет направление связи. Чтобы отличить основание от «потомка», сравнивайте даты документов (основание почти всегда раньше по дате) или проверяйте вид документа по известной логике цепочки: например, для реализации основанием может быть заказ или счет, а подчиненными — счет-фактура и оплата.
Имя критерия отбора зависит от конфигурации. В «1С:Бухгалтерии» и многих типовых это «СвязанныеДокументы», но в отраслевых решениях название может отличаться. Точное имя смотрите в конфигураторе в ветке «Критерии отбора».
Как получить основание запросом
Запрос — оптимальный способ, когда основания нужны для списка документов сразу: в отчетах, обработках, динамических списках. Обращение к реквизиту через точку в цикле по выборке порождает отдельные обращения к базе и замедляет работу, а запрос получает все за одно обращение.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ,
| Реализация.ДокументОснование КАК Основание
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Основание = Выборка.Основание;
КонецЕсли;
Для оснований из табличной части запрос строится по табличной части документа с группировкой или сверткой по полю заказа. Если в строках могут быть разные заказы, результатом будет несколько оснований — учитывайте это в логике отчета или печатной формы.
Основания = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаДокумент);Как вывести основание в печатную форму или отчет
В печатных формах типовых конфигураций реквизиты основания (номер, дата) обычно уже доступны через макет. Если нужно добавить их самостоятельно, получите данные основания в модуле менеджера документа или в процедуре печати и передайте в область макета как параметры.
Если ЗначениеЗаполнено(Шапка.ДокументОснование) Тогда
РеквизитыОснования = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Шапка.ДокументОснование, "Номер, Дата");
Область.Параметры.НомерОснования = РеквизитыОснования.Номер;
Область.Параметры.ДатаОснования = Формат(РеквизитыОснования.Дата, "ДЛФ=D");
КонецЕсли;
Для отчетов на СКД удобнее не вычислять основание кодом, а добавить поле реквизита в набор данных запроса — тогда номер и дату основания можно выводить через точку от поля «Основание» прямо в настройках отчета, без программирования.
Как выбрать способ получения основания
Частые ошибки и как проверить результат
Самая распространенная ошибка — предположение, что у всех документов есть реквизит «ДокументОснование». Во многих видах документов его нет вовсе, и код падает с ошибкой обращения к несуществующему полю. Всегда проверяйте состав реквизитов в конфигураторе для конкретного вида документа.
Вторая ошибка — игнорировать табличные части. Если заказ указан в строках товаров, а не в шапке, попытка прочитать основание из шапки даст пустое значение, и логика «основания нет» будет неверной. Третья ошибка — считать, что основание всегда одно: ввод на основании нескольких документов (например, одна реализация по трем заказам) дает несколько оснований, и код, рассчитанный на одно значение, теряет данные.
Как проверить результат
Документ-основание в дереве совпадает с тем, что вернул ваш код
Код вернул пусто или другой документ
Ссылка на документ ожидаемого вида (заказ, счет)
Неопределено или документ более поздней даты (это подчиненный)
Код обрабатывает все найденные основания
Учитывается только первое значение
FAQ
Почему критерий отбора «СвязанныеДокументы» не находит мой документ?
Скорее всего, реквизит, в котором хранится ссылка, не включен в состав критерия отбора. Откройте критерий в конфигураторе и проверьте список «Состав»: туда должны входить все реквизиты, по которым нужно искать связи. После добавления реквизита потребуется обновление конфигурации базы данных.
Как отличить основание от подчиненного документа в коде?
Критерий отбора возвращает связи в обе стороны. Практический признак — дата: основание обычно имеет более раннюю дату. Надежнее проверять вид документа по известной цепочке: для реализации основаниями являются заказы и счета, а подчиненными — счета-фактуры и оплаты.
Можно ли получить реквизиты основания, не получая объект целиком?
Да. Используйте функцию типа ЗначенияРеквизитовОбъекта из общего модуля «ОбщегоНазначения» в типовых конфигурациях или запрос — оба способа читают только нужные поля без вызова обработчиков объекта и работают быстрее, чем метод ПолучитьОбъект().
Что делать, если у документа несколько оснований?
Собирайте основания в массив или таблицу значений: перебором строк табличной части с группировкой по полю заказа или запросом со сверткой. В печатных формах такие основания обычно выводят списком через запятую в одной строке.
Работает ли поиск основания для помеченных на удаление документов?
Да, критерий отбора и запросы по умолчанию находят и помеченные документы. Если в отчете или печатной форме они не нужны, добавьте в запрос условие «НЕ ПометкаУдаления» и проверяйте проведенность основания отдельно.
Что важно запомнить
Единого реквизита «Основание» в 1С нет: связь хранится в реквизитах шапки или табличных частей. Для просмотра используйте структуру подчиненности, в коде — прямое чтение реквизита или критерий отбора «СвязанныеДокументы», для списков и отчетов — запрос. Всегда проверяйте состав реквизитов конкретного вида документа и учитывайте возможность нескольких оснований.