При разработке в среде 1С:Предприятие 8.2 часто возникает необходимость проследить цепочку документов. Например, у нас есть последовательность: Документ1 (основание) -> Документ2 -> Документ3. Задача состоит в том, чтобы, находясь в Документ3, получить номер самого первого документа (Документ1) и записать его в табличную часть.
Давайте разберем, как реализовать это эффективно с помощью языка запросов.
Прежде чем приступать к написанию кода, важно осознать, как 1С хранит ссылки. По умолчанию каждый документ, созданный «на основании», содержит реквизит ДокументОснование. Таким образом, Документ3 хранит ссылку на Документ2, а Документ2 — на Документ1.
Проблема заключается в том, что в реквизите ДокументОснование обычно используется составной тип данных. Это значит, что там может быть ссылка на любой документ, предусмотренный конфигуратором, а не только на конкретный вид. Прямое обращение через точку в запросе может не сработать или вызвать ошибку, если платформа не сможет однозначно определить тип ссылки.
Рассмотрим самый надежный способ получения данных — использование левого соединения в запросе. Этот метод позволяет нам «пройти» по цепочке ссылок от текущего документа вверх.
Для реализации этой задачи нам потребуется выполнить следующие шаги:
Документ3.Документ3 с таблицей Документ2 по полю ДокументОснование.Документ1, используя реквизит ДокументОснование уже у второго документа.Пример реализации запроса будет выглядеть следующим образом:
ВЫБРАТЬ
Док3.Ссылка КАК СсылкаНаДок3,
Док3.ДокументОснование.ДокументОснование.Номер КАК НомерДок1
ИЗ
Документ.Документ3 КАК Док3
ГДЕ
Док3.Ссылка = &СсылкаНаТекущийДокумент
Если при попытке обращения «через точку» (как в примере выше) запрос выдает ошибку или возвращает пустые значения, это верный признак того, что платформа не может автоматически распознать тип объекта в реквизите ДокументОснование.
В этом случае необходимо явно указать системе, с каким типом документа мы работаем. Используем конструкцию ВЫРАЗИТЬ. Это «принудительное» приведение типа, которое говорит запросу: «Рассматривай это значение как ссылку на конкретный тип документа».
Рассмотрим структуру запроса с использованием ВЫРАЗИТЬ:
ВЫБРАТЬ
ВЫРАЗИТЬ(Док3.ДокументОснование КАК Документ.Документ2).ДокументОснование.Номер КАК НомерДок1
ИЗ
Документ.Документ3 КАК Док3
ГДЕ
Док3.Ссылка = &СсылкаНаТекущийДокумент
Такой подход делает запрос более устойчивым к ошибкам и гарантирует, что система корректно интерпретирует составной тип данных реквизита ДокументОснование.
Если ваша конфигурация активно использует «Структуру подчиненности» и стандартные реквизиты не всегда заполнены или их недостаточно, можно обратиться к системному регистру сведений СвязиДокументов. В нем хранятся все записи о создании документов на основании других.
Работая с этим регистром, вы можете найти Документ1, отфильтровав записи по ДокументРезультат, который является вашим Документ3 или Документ2. Однако первый описанный выше способ (через реквизиты) является более быстрым для типовых задач, так как не требует обращения к дополнительным таблицам регистра.
Для того чтобы получить номер прародителя, всегда старайтесь:
ДокументОснование в конфигураторе.ВЫРАЗИТЬ, если реквизит составной — это лучший способ избежать неопределенности в запросе.Теперь вы можете смело применять эти методы в своей работе с КА 1.1. Использование запросов для получения данных — это профессиональный стандарт, который позволяет делать код чистым, понятным и производительным.