Разработка сложных отчетов на системе компоновки данных (СКД) в 1С — это процесс, который часто сопровождается проверкой промежуточных результатов через консоль запросов. Однако многие разработчики сталкиваются с парадоксальной ситуацией: один и тот же текст запроса, выполняемый в консоли и в составе схемы компоновки, выдает разные результаты. Особенно критично это проявляется в отчетах по расчету НДФЛ или налоговых баз, где малейшее расхождение ведет к недостоверности отчетности. Проанализируем причины этого явления и разберем по шагам, как устранить «фантомное» дублирование данных.
Рассмотрим типичную ситуацию. У нас есть сложный запрос с использованием временных таблиц, где рассчитываются показатели налоговой базы и суммы налога. В консоли запросов (даже если выгрузить текст запроса напрямую из отладчика в момент выполнения отчета) цифры корректны. Но при формировании самого отчета значение одного поля (например, ПроверкаНДФЛ_НУ) почему-то полностью копирует значение другого поля (например, РазницаНДФЛ_БУ), хотя в запросе для них прописаны разные формулы.
Выясним причину такого поведения. СКД — это не просто исполнитель запросов, это сложный процессор, который модифицирует исходный текст запроса, добавляет свои параметры, накладывает роли полей и управляет выборкой на уровне метаданных. Даже если вы отключили свойство Автозаполнение, система все равно накладывает свои механизмы компоновки на результирующий набор данных.
Посмотрим на пример кода, в котором чаще всего возникают подобные сложности. Проанализируем расчет налоговой базы в блоке временной таблицы ВТ_НалоговаяБаза:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_Итоги.МесяцНалоговогоПериода, ВТ_Итоги.Период), ГОД) КАК ПериодГод,
ВТ_Итоги.Организация КАК Организация,
ВТ_Итоги.ФизическоеЛицо КАК ФизическоеЛицо,
СУММА(ВТ_Итоги.Доход) - (СУММА(ВТ_Итоги.Вычет) + СУММА(ВТ_Итоги.СтандартныйВычетНУ)) КАК НалоговаяБазаНУ,
СУММА(ВТ_Итоги.СуммаНалога) КАК СуммаНалога
ПОМЕСТИТЬ ВТ_НалоговаяБаза
ИЗ
ВТ_Итоги КАК ВТ_Итоги
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_Итоги.МесяцНалоговогоПериода, ВТ_Итоги.Период), ГОД),
ВТ_Итоги.Организация,
ВТ_Итоги.ФизическоеЛицо;
Далее в следующей таблице ВТ_ПроверкаНДФЛ мы рассчитываем контрольные показатели, используя условные конструкции ВЫБОР для разных налоговых периодов (до и после 2025 года):
ВЫБРАТЬ
ВТ_НалоговаяБаза.ПериодГод КАК ПериодГод,
ВТ_НалоговаяБаза.ФизическоеЛицо КАК ФизическоеЛицо,
ВЫБОР
КОГДА ВТ_НалоговаяБаза.ПериодГод < ДАТАВРЕМЯ(2025, 1, 1)
ТОГДА ВТ_НалоговаяБаза.НалоговаяБазаНУ * 13 / 100
ИНАЧЕ ВТ_НалоговаяБаза.НалоговаяБазаНУ * 15 / 100
КОНЕЦ КАК ПроверкаНДФЛ_НУ,
ВЫБОР
КОГДА ВТ_НалоговаяБаза.ПериодГод < ДАТАВРЕМЯ(2025, 1, 1)
ТОГДА ВЫРАЗИТЬ(ВТ_НалоговаяБаза.СуммаНалога - ВТ_НалоговаяБаза.НалоговаяБазаНУ * 0.13 КАК ЧИСЛО(15, 0))
ИНАЧЕ ВЫРАЗИТЬ(ВТ_НалоговаяБаза.СуммаНалога - ВТ_НалоговаяБаза.НалоговаяБазаНУ * 0.15 КАК ЧИСЛО(15, 0))
КОНЕЦ КАК РазницаНДФЛ_НУ
ПОМЕСТИТЬ ВТ_ПроверкаНДФЛ
ИЗ
ВТ_НалоговаяБаза КАК ВТ_НалоговаяБаза;
Несмотря на то что в коде поля ПроверкаНДФЛ_НУ и РазницаНДФЛ_НУ считаются по разным алгоритмам, в СКД они могут начать дублироваться. Рассмотрим, почему это происходит и как это лечить.
Как показывает практика, часто проблема кроется во внутренней структуре XML-схемы компоновки. При копировании полей или частом изменении псевдонимов в конструкторе запроса, СКД может сохранить ошибочные внутренние идентификаторы (GUID). В этом случае система начинает считать два разных по названию поля одной и той же сущностью.
Разберем алгоритм действий:
ПроверкаНДФЛ_НУ напишем КонтрольНалогаНУ_Новый).Это действие заставляет СКД создать новую запись в XML-структуре схемы с чистыми идентификаторами, что в 90% случаев решает проблему «дублирования» соседних колонок.
Если переименование не помогло, проанализируем настройки на вкладке Наборы данных. В СКД есть колонка Роль, которая критически важна для корректного отображения итогов.
На что обратить внимание:
ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)). Нетипизированные поля в ВТ могут привести к тому, что СКД неверно определит длину или точность, что вызовет ошибки при агрегации в ресурсах.Разберем ситуацию с параметрами и модификацией текста. Даже если вы используете ВЫКЛЮЧЕННОЕ автозаполнение, СКД может изменять запрос, если используются стандартные имена параметров, такие как НачалоПериода или КонецПериода. Если в одной из временных таблиц эти параметры используются неявно, СКД может «подмешать» данные из других виртуальных таблиц.
Чтобы убедиться, что проблема не в этом, проанализируем итоговый запрос в отладчике. Для этого используем следующий метод в модуле объекта отчета:
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
// В этот момент МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос содержит
// финальный текст запроса, который пойдет в СУБД.
Сравним этот текст с тем, что мы писали изначально. Если мы видим расхождения в секции ВЫБРАТЬ, значит, СКД оптимизирует запрос. В таком случае стоит попробовать изменить структуру запроса, вынося расчеты из временных таблиц непосредственно в Выражения полей на вкладке «Вычисляемые поля» или в «Ресурсы».
Часто «дублирование» — это результат неправильной настройки ресурсов. Если поле РазницаНДФЛ_БУ добавлено в ресурсы с выражением СУММА(РазницаНДФЛ_БУ), а поле ПроверкаНДФЛ_НУ просто выводится в группировках без добавления в ресурсы, СКД может взять для него значение из первой попавшейся строки группировки или продублировать итог соседнего числового поля.
Рекомендация: Все поля, которые должны выводиться в итогах или на уровне детальных записей как числовые показатели, обязательно должны быть добавлены на вкладку Ресурсы. Убедитесь, что выражения для ресурсов написаны корректно:
ПроверкаНДФЛ_НУ выражение должно быть СУММА(ПроверкаНДФЛ_НУ).Если вы столкнулись с тем, что СКД «живет своей жизнью» и показывает не те данные, что выдает консоль запросов, не спешите переписывать всю логику. Проанализируем ситуацию последовательно: от простого пересоздания полей в схеме до детальной проверки ролей и типов данных. Создание нового поля с уникальным именем — это самый быстрый способ победить внутренние ошибки кэширования метаданных 1С. Помните, что СКД — это мощный инструмент, но иногда его «интеллектуальные» механизмы оптимизации требуют ручной корректировки через явное указание типов и ролей.