Ситуация, когда один и тот же запрос выдает корректные данные в консоли запросов, но возвращает странные или неверные результаты в Системе компоновки данных (СКД), — это классическая проблема, с которой сталкиваются разработчики 1С. Разберем по шагам, почему это происходит, и проанализируем технические нюансы, которые приводят к таким расхождениям.
Рассмотрим пример сложного запроса, который использует временные таблицы, группировки и функции агрегации. В подобных конструкциях чаще всего и кроется корень проблемы при переносе в СКД.
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры) КАК ВидНоменклатуры1,
НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, МЕСЯЦ) КАК ПериодМесяц,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры.Родитель = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.ПустаяСсылка)
ТОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.ПустаяСсылка)
ТОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры.Родитель
ИНАЧЕ РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры.Родитель.Родитель
КОНЕЦ
КОНЕЦ) КАК ВидНоменклатуры2
ПОМЕСТИТЬ ВТ_Ассортимент
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Проведен
И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка,
НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, МЕСЯЦ);
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Ассортимент.ПериодМесяц КАК ПериодМесяц,
СРЕДНЕЕ(ВЫРАЗИТЬ(ВТ_Ассортимент.ВидНоменклатуры1 КАК ЧИСЛО(16, 2))) КАК ВидНоменклатуры1,
СРЕДНЕЕ(ВЫРАЗИТЬ(ВТ_Ассортимент.ВидНоменклатуры2 КАК ЧИСЛО(16, 2))) КАК ВидНоменклатуры2
ИЗ
ВТ_Ассортимент КАК ВТ_Ассортимент
СГРУППИРОВАТЬ ПО
ВТ_Ассортимент.ПериодМесяц
В данном случае мы видим использование КОЛИЧЕСТВО(РАЗЛИЧНЫЕ) во временной таблице и последующее вычисление СРЕДНЕЕ в основном запросе. В консоли это отрабатывает линейно, а СКД вносит свои коррективы.
Одной из самых частых причин является включенный флаг Автозаполнение в наборе данных. Выясним, как это влияет на результат:
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ) нарушится.Рекомендация: попробуйте отключить Автозаполнение и вручную настроить поля и роли на вкладке «Компоновка данных» в конструкторе запроса.
Проанализируем ситуацию с параметрами &Дата1 и &Дата2. В консоли запросов мы часто вручную выбираем дату и время (например, 31.12.2023 23:59:59). В СКД параметры могут передаваться как Дата (начало дня) или через стандартные периоды.
Если в консоли установлена дата конца периода с секундами, а в СКД — только дата (00:00:00), то документы за последний день периода просто не попадут в отчет СКД. Чтобы избежать этой ошибки, используйте функции в тексте запроса:
И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
Это гарантирует, что границы периода будут интерпретированы одинаково в обоих инструментах.
Посмотрим на поле ВидНоменклатуры2. В запросе автора используется СРЕДНЕЕ. Если в СКД на вкладке Ресурсы для этого поля также указана функция Среднее, может возникнуть «математический диссонанс».
СКД рассчитывает итоги не по результатам выборки запроса, а выполняя дополнительные запросы для каждой группировки. Если в самом запросе уже есть группировка (как во временной таблице ВТ_Ассортимент), а в настройках СКД стоят свои группировки, данные могут «удваиваться» или некорректно усредняться.
Правильный подход: в запросе выбирать детальные данные, а все расчеты (сумма, количество, среднее) выносить исключительно на вкладку Ресурсы схемы компоновки. Это позволит СКД корректно вычислять итоги на разных уровнях иерархии.
Разберем ситуацию, когда изменения в схеме (запросе) сделаны, но в режиме «1С:Предприятие» отчет все равно выдает старые данные. Это связано с тем, что 1С сохраняет варианты отчета и настройки пользователя в системных таблицах или кэше.
Чтобы исключить влияние старых настроек, выполним следующие действия:
Важно помнить, что консоль запросов часто запускается под полными правами, а отчет СКД — под правами обычного пользователя. Если в базе настроен RLS (Record Level Security), система автоматически добавит скрытые условия в запрос СКД. Это приведет к тому, что часть документов будет отсечена из-за отсутствия прав на конкретную организацию, склад или контрагента.
Для того чтобы окончательно выяснить причину, воспользуемся Консолью компоновки данных (из состава ИТС или инструментов разработчика). В отличие от обычной консоли запросов, она позволяет увидеть Итоговый запрос, который генерирует СКД после применения всех настроек, отборов и прав доступа. Сравните этот итоговый текст с тем, что вы запускаете в обычной консоли — различия в секции ГДЕ или СОЕДИНЕНИЕ сразу укажут на проблему.
Подводя итог, можно сказать: расхождение данных — это не ошибка платформы, а следствие гибкости СКД, которая «достраивает» ваш запрос под нужды пользователя. Контроль параметров, аккуратная работа с агрегатами в ресурсах и проверка итогового текста запроса помогут вам добиться идентичности результатов.