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