В практике разработчика 1С часто возникает загадочная ситуация: один и тот же запрос, выполненный в Системе компоновки данных (СКД), возвращает корректные данные, но при запуске в обычной консоли запросов возвращает абсолютно пустой результат. Кажется, что параметры переданы верно, связи настроены правильно, но консоль упорно показывает пустую таблицу.
В этой статье мы подробно разберем, почему возникает такое поведение, проанализируем различия в работе СУБД при выполнении прямых запросов и запросов через СКД, а также научимся правильно работать с группами счетов бухгалтерского учета и просматривать временные таблицы в консоли запросов.
Для начала давайте детально проанализируем запрос, который вызвал затруднения у автора темы. В запросе происходит обращение к виртуальной таблице оборотов регистра бухгалтерии Единого плана счетов бухгалтерского учета (ЕПСБУ):
ВЫБРАТЬ
Обороты_Оплата.Организация КАК Организация,
ВЫРАЗИТЬ(Обороты_Оплата.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ВЫРАЗИТЬ(Обороты_Оплата.Субконто2 КАК Справочник.Договоры) КАК Договор,
Обороты_Оплата.Субконто3 КАК ДокументРасчетов,
Обороты_Оплата.СуммаОборот КАК СуммаОплаты,
Обороты_Оплата.Регистратор КАК Регистратор,
"Платежное поручение" КАК ВидПодтверждающегоДокумента,
СостояниеПлатежноРасчетныхДокументов.НомерПодтверждающегоДокумента КАК НомерПодтверждающегоДокумента,
СостояниеПлатежноРасчетныхДокументов.ДатаПодтверждающегоДокумента КАК ДатаПодтверждающегоДокумента,
Обороты_Оплата.Период КАК ДатаОтработки,
Обороты_Оплата.ИФО КАК ИФО,
Обороты_Оплата.КФО КАК КФО,
Обороты_Оплата.КПС КАК КПС,
ПОДСТРОКА(Обороты_Оплата.Субконто2.КраткоеСодержание, 1, 300) КАК КраткоеСодержание
ИЗ
РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты(&НачалоПериода, &КонецПериода, Регистратор, Счет В (&СчетРасчетов), , , КорСчет В (&СчетаОплаты), ) КАК Обороты_Оплата
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеПлатежноРасчетныхДокументов КАК СостояниеПлатежноРасчетныхДокументов
ПО (Обороты_Оплата.Регистратор = СостояниеПлатежноРасчетныхДокументов.ПлатежноРасчетныйДокумент)
В параметрах СКД для заполнения параметра &СчетРасчетов используется вызов функции общего модуля: БухгалтерскийУчетПовтИсп.ПолучитьМассивСчетов("206.00"). Именно здесь и скрывается первопричина проблемы.
Выясним причину, по которой консоль запросов возвращает пустое значение при указании счета 206.00.
В планах счетов (особенно в ЕПСБУ для государственных учреждений) счет 206.00 («Расчеты по авансам выданным») является счетом-группой. В системе 1С проводки физически никогда не записываются непосредственно на счета-группы. Все движения в базе данных совершаются строго по подчиненным субсчетам субсчетов (например, 206.11, 206.21, 206.34 и так далее).
Когда мы пишем условие в запросе:
Счет В (&СчетРасчетов)
и передаем в параметр массив, содержащий только элемент-группу 206.00, платформа транслирует это в SQL-запрос как точное совпадение. СУБД ищет записи, у которых в поле Счет записана ссылка именно на группу 206.00. Поскольку физических проводок по этой группе нет, СУБД возвращает пустой результат.
Для решения этой проблемы необходимо заставить систему искать не только сам счет, но и все его подчиненные субсчета. Для этого в языке запросов 1С предусмотрен специальный оператор В ИЕРАРХИИ. Перепишем условие в виртуальной таблице:
РегистрБухгалтерии.ЖурналПроводокЕПСБУ.Обороты(
&НачалоПериода,
&КонецПериода,
Регистратор,
Счет В ИЕРАРХИИ (&СчетРасчетов),
,
,
КорСчет В ИЕРАРХИИ (&СчетаОплаты),
) КАК Обороты_Оплата
Использование конструкции В ИЕРАРХИИ заставляет платформу автоматически развернуть группу 206.00 до всего списка подчиненных счетов и субсчетов при формировании итогового SQL-запроса.
Теперь ответим на логичный вопрос: почему же в отчете СКД этот же запрос с оператором В работал корректно и выводил данные?
Дело в том, что Система компоновки данных — это не просто инструмент для выполнения запросов, а мощный генератор отчетов со своей внутренней логикой оптимизации. Если в схеме компоновки данных включено свойство Автозаполнение, СКД берет на себя управление полями и отборами:
Счет имеет тип ПланСчетовСсылка.ЕПСБУ.В) для группы не имеет практического смысла.В на В ИЕРАРХИИ (в терминах компоновщика — отбор «В группе») перед отправкой результирующего запроса в СУБД.Обычная консоль запросов лишена этой магии. Она выполняет запрос ровно в том виде, в каком его написал программист, без каких-либо автоматических корректировок структуры метаданных.
Еще один важный аспект, из-за которого результаты в консоли и СКД могут не совпадать — это заполнение параметров дат &НачалоПериода и &КонецПериода.
Рассмотрим, как происходит работа с периодами в обеих системах:
23:59:59. Благодаря этому все документы, проведенные в последний день периода, гарантированно попадают в отчет.&КонецПериода дату 31.12.2026 без указания точного времени, платформа воспримет это как начало дня — 31.12.2026 00:00:00. В результате все операции, совершенные в течение этого дня, просто «выпадут» из выборки в консоли запросов.Совет: Всегда проверяйте время в параметрах-датах внутри консоли запросов или используйте в коде функции приведения даты, например, КонецПериода(&КонецПериода, ДЕНЬ) непосредственно в тексте запроса.
В процессе обсуждения на форуме возник важный вопрос: как отлаживать сложные пакетные запросы и просматривать промежуточное содержимое временных таблиц?
По умолчанию стандартный объект платформы Запрос удаляет все временные таблицы из оперативной памяти СУБД после завершения работы пакета, если они не были возвращены в качестве финального результата. Чтобы посмотреть, что находится внутри временной таблицы, можно воспользоваться специальными инструментами.
Современные консоли запросов (особенно работающие на управляемых формах из состава инструментов разработчика) имеют встроенный функционал для просмотра временных таблиц. Разберем по шагам, как это работает:
МенеджерВременныхТаблиц.
ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы
Если вы используете продвинутую консоль запросов, найдите на панели инструментов кнопку «Показать временные таблицы» (или аналогичную кнопку настройки отладки пакета). Это позволит вам мгновенно увидеть структуру и наполнение каждой ВТ без необходимости вручную переписывать пакетный запрос.
Для отладки временных таблиц, формируемых внутри СКД, рекомендуется использовать специализированную Консоль компоновки данных. Она позволяет перехватить реальный макет компоновки непосредственно перед выполнением и выгрузить все промежуточные таблицы, которые СКД создает в процессе оптимизации на уровне СУБД.