Разработчики 1С часто сталкиваются с ситуацией: написанный запрос идеально отрабатывает в «Консоли запросов», возвращая нужные цифры, но стоит перенести его в Схему компоновки данных (СКД) и запустить внешний отчет — результат оказывается пустым. Это классическая проблема, которая особенно часто проявляется в сложных конфигурациях вроде 1С:КА 2.5 или 1С:ERP. Разберем по шагам, почему это происходит и как заставить отчет работать.
Одной из главных причин «исчезновения» данных является работа оптимизатора СКД. В отличие от консоли, которая выполняет запрос «как есть», СКД анализирует настройки отчета (выбранные поля, группировки) и перестраивает текст запроса перед отправкой на SQL-сервер. Проанализируем типичную ситуацию: когда мы обращаемся к реквизиту через несколько точек, например, ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер.Наименование, система может посчитать такое обращение избыточным и исключить его из итогового исполнения, если поле не выбрано в настройках компоновки или не является частью группировки.
Рассмотрим пример запроса, который может вести себя нестабильно:
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер.Наименование КАК Наименование,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер КАК ОсновнойМенеджер,
СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиБезНДСОборот) КАК СуммаВыручкиБезНДС,
ЕСТЬNULL(ДопПлан.Значение, "Нет плана") КАК План
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты({(НАЧАЛОПЕРИОДА(&ПериодНачало, ДЕНЬ))}, {(КОНЕЦПЕРИОДА(&ПериодКонец, ДЕНЬ))}) КАК ВыручкаИСебестоимостьПродажОбороты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.ДополнительныеРеквизиты КАК ДопПлан
ПО (ДопПлан.Ссылка = ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер)
И (ДопПлан.Свойство.Наименование = "2026")
СГРУППИРОВАТЬ ПО
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер.Наименование,
ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер,
ЕСТЬNULL(ДопПлан.Значение, "Нет плана")
В данном случае обращение через три точки (к партнеру через аналитику учета) — это «красная тряпка» для оптимизатора. Посмотрим, как это исправить: всегда используйте явные соединения (JOIN) вместо длинных цепочек через точку. Это гарантирует, что таблица будет включена в запрос независимо от настроек вывода полей.
Обратим внимание на конструкцию {(НАЧАЛОПЕРИОДА(&ПериодНачало, ДЕНЬ))}. В консоли запросов текст внутри фигурных скобок игнорируется, и запрос выполняется по значениям параметров &ПериодНачало и &ПериодКонец напрямую. Однако в СКД эти скобки означают расширение функционала компоновки.
Выясним причину пустого результата: если в параметрах схемы СКД для этих переменных не установлена галочка «Использование» или если пользователь не заполнил их в настройках отчета, СКД может подставить пустые даты или вообще исключить условия из виртуальной таблицы. Если виртуальная таблица Обороты получает неопределенный период, она может вернуть пустой набор записей.
Рекомендуем следующий алгоритм проверки:
Дата).&СтандартныйПериод.ДатаНачала).В консоли запросов мы обязаны писать СГРУППИРОВАТЬ ПО, если используем агрегатные функции (СУММА, КОЛИЧЕСТВО). В СКД логика иная. Рассмотрим правильный подход к проектированию схемы:
СуммаВыручкиБезНДС с функцией Сумма().Если оставить ГРУППИРОВАТЬ ПО в самом запросе, СКД может некорректно суммировать данные при наложении пользовательских фильтров, что приведет к визуальному отсутствию строк.
Проанализируем ситуацию с правами доступа. Консоль запросов часто запускается под полными правами или в привилегированном режиме. СКД во внешнем отчете работает под правами текущего пользователя с учетом RLS (Record Level Security). В типовых конфигурациях (КА, ERP) включенный RLS автоматически добавляет в запрос скрытые фильтры по группам доступа партнеров или подразделениям. Если пользователь не имеет прав на чтение конкретных записей, результат в СКД будет пустым, хотя в консоли под администратором данные видны.
В представленном запросе используется условие: ДопПлан.Свойство.Наименование = "2026". Это крайне ненадежный способ. Разберем почему:
Поля дополнительных реквизитов не индексируются по наименованию свойства. Кроме того, если в базе два свойства с одинаковым именем (для разных наборов), соединение может отработать непредсказуемо. Посмотрим на правильное решение: в СКД лучше передавать конкретную ссылку на элемент Плана видов характеристик «Дополнительные реквизиты и сведения» через параметр. Это не только ускорит запрос, но и сделает его работу стабильной в контексте компоновки данных.
В 1С:Комплексная автоматизация многие поля (например, аналитика учета или характеристики) жестко привязаны к функциональным опциям. Если в настройках системы опция выключена, СКД при генерации макета может полностью вырезать «неактивные» поля из выборки. Обычный запрос в консоли зачастую игнорирует состояние функциональных опций, что и создает иллюзию «работающего» запроса.
ЛЕВОЕ СОЕДИНЕНИЕ.Число (план продаж), а в доп. реквизите хранится Строка, соединение не сработает.Следуя этим рекомендациям, мы сможем добиться идентичности результатов в консоли и в итоговом отчете СКД, обеспечив при этом высокую производительность и корректность данных.