Почему данные в консоли запросов и отчете на СКД могут различаться и как исправить дублирование полей

Программист 1С v8.3 (Управляемые формы) Налоговый учет IT и автоматизация бизнеса
← На главную

Разработка сложных отчетов на системе компоновки данных (СКД) в 1С — это процесс, который часто сопровождается проверкой промежуточных результатов через консоль запросов. Однако многие разработчики сталкиваются с парадоксальной ситуацией: один и тот же текст запроса, выполняемый в консоли и в составе схемы компоновки, выдает разные результаты. Особенно критично это проявляется в отчетах по расчету НДФЛ или налоговых баз, где малейшее расхождение ведет к недостоверности отчетности. Проанализируем причины этого явления и разберем по шагам, как устранить «фантомное» дублирование данных.

Анализ проблемы: расхождение между консолью и СКД

Рассмотрим типичную ситуацию. У нас есть сложный запрос с использованием временных таблиц, где рассчитываются показатели налоговой базы и суммы налога. В консоли запросов (даже если выгрузить текст запроса напрямую из отладчика в момент выполнения отчета) цифры корректны. Но при формировании самого отчета значение одного поля (например, ПроверкаНДФЛ_НУ) почему-то полностью копирует значение другого поля (например, РазницаНДФЛ_БУ), хотя в запросе для них прописаны разные формулы.

Выясним причину такого поведения. СКД — это не просто исполнитель запросов, это сложный процессор, который модифицирует исходный текст запроса, добавляет свои параметры, накладывает роли полей и управляет выборкой на уровне метаданных. Даже если вы отключили свойство Автозаполнение, система все равно накладывает свои механизмы компоновки на результирующий набор данных.

Изучение исходного кода запроса

Посмотрим на пример кода, в котором чаще всего возникают подобные сложности. Проанализируем расчет налоговой базы в блоке временной таблицы ВТ_НалоговаяБаза:


ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_Итоги.МесяцНалоговогоПериода, ВТ_Итоги.Период), ГОД) КАК ПериодГод,
    ВТ_Итоги.Организация КАК Организация,
    ВТ_Итоги.ФизическоеЛицо КАК ФизическоеЛицо,
    СУММА(ВТ_Итоги.Доход) - (СУММА(ВТ_Итоги.Вычет) + СУММА(ВТ_Итоги.СтандартныйВычетНУ)) КАК НалоговаяБазаНУ,
    СУММА(ВТ_Итоги.СуммаНалога) КАК СуммаНалога
ПОМЕСТИТЬ ВТ_НалоговаяБаза
ИЗ
    ВТ_Итоги КАК ВТ_Итоги
СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_Итоги.МесяцНалоговогоПериода, ВТ_Итоги.Период), ГОД),
    ВТ_Итоги.Организация,
    ВТ_Итоги.ФизическоеЛицо;

Далее в следующей таблице ВТ_ПроверкаНДФЛ мы рассчитываем контрольные показатели, используя условные конструкции ВЫБОР для разных налоговых периодов (до и после 2025 года):


ВЫБРАТЬ
    ВТ_НалоговаяБаза.ПериодГод КАК ПериодГод,
    ВТ_НалоговаяБаза.ФизическоеЛицо КАК ФизическоеЛицо,
    ВЫБОР
        КОГДА ВТ_НалоговаяБаза.ПериодГод < ДАТАВРЕМЯ(2025, 1, 1)
            ТОГДА ВТ_НалоговаяБаза.НалоговаяБазаНУ * 13 / 100
        ИНАЧЕ ВТ_НалоговаяБаза.НалоговаяБазаНУ * 15 / 100
    КОНЕЦ КАК ПроверкаНДФЛ_НУ,
    ВЫБОР
        КОГДА ВТ_НалоговаяБаза.ПериодГод < ДАТАВРЕМЯ(2025, 1, 1)
            ТОГДА ВЫРАЗИТЬ(ВТ_НалоговаяБаза.СуммаНалога - ВТ_НалоговаяБаза.НалоговаяБазаНУ * 0.13 КАК ЧИСЛО(15, 0))
        ИНАЧЕ ВЫРАЗИТЬ(ВТ_НалоговаяБаза.СуммаНалога - ВТ_НалоговаяБаза.НалоговаяБазаНУ * 0.15 КАК ЧИСЛО(15, 0))
    КОНЕЦ КАК РазницаНДФЛ_НУ
ПОМЕСТИТЬ ВТ_ПроверкаНДФЛ
ИЗ
    ВТ_НалоговаяБаза КАК ВТ_НалоговаяБаза;

Несмотря на то что в коде поля ПроверкаНДФЛ_НУ и РазницаНДФЛ_НУ считаются по разным алгоритмам, в СКД они могут начать дублироваться. Рассмотрим, почему это происходит и как это лечить.

Решение 1: Физическое пересоздание полей (самый эффективный метод)

Как показывает практика, часто проблема кроется во внутренней структуре XML-схемы компоновки. При копировании полей или частом изменении псевдонимов в конструкторе запроса, СКД может сохранить ошибочные внутренние идентификаторы (GUID). В этом случае система начинает считать два разных по названию поля одной и той же сущностью.

Разберем алгоритм действий:

  1. Зайдем в конструктор запроса в СКД.
  2. Полностью удалим «проблемное» поле из списка выборки.
  3. Перейдем на вкладку Наборы данных и убедимся, что поле исчезло из списка.
  4. Сохраним отчет и закроем конфигуратор (или закроем схему).
  5. Снова откроем схему и добавим поле в запрос заново, но обязательно зададим ему совершенно новый псевдоним (например, вместо ПроверкаНДФЛ_НУ напишем КонтрольНалогаНУ_Новый).
  6. В настройках отчета на вкладке Выбранные поля заменим старое поле на новое.

Это действие заставляет СКД создать новую запись в XML-структуре схемы с чистыми идентификаторами, что в 90% случаев решает проблему «дублирования» соседних колонок.

Решение 2: Проверка ролей полей и иерархии

Если переименование не помогло, проанализируем настройки на вкладке Наборы данных. В СКД есть колонка Роль, которая критически важна для корректного отображения итогов.

На что обратить внимание:

Решение 3: Проверка механизмов модификации текста запроса

Разберем ситуацию с параметрами и модификацией текста. Даже если вы используете ВЫКЛЮЧЕННОЕ автозаполнение, СКД может изменять запрос, если используются стандартные имена параметров, такие как НачалоПериода или КонецПериода. Если в одной из временных таблиц эти параметры используются неявно, СКД может «подмешать» данные из других виртуальных таблиц.

Чтобы убедиться, что проблема не в этом, проанализируем итоговый запрос в отладчике. Для этого используем следующий метод в модуле объекта отчета:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
// В этот момент МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос содержит 
// финальный текст запроса, который пойдет в СУБД.

Сравним этот текст с тем, что мы писали изначально. Если мы видим расхождения в секции ВЫБРАТЬ, значит, СКД оптимизирует запрос. В таком случае стоит попробовать изменить структуру запроса, вынося расчеты из временных таблиц непосредственно в Выражения полей на вкладке «Вычисляемые поля» или в «Ресурсы».

Решение 4: Особенности ресурсов и итогов

Часто «дублирование» — это результат неправильной настройки ресурсов. Если поле РазницаНДФЛ_БУ добавлено в ресурсы с выражением СУММА(РазницаНДФЛ_БУ), а поле ПроверкаНДФЛ_НУ просто выводится в группировках без добавления в ресурсы, СКД может взять для него значение из первой попавшейся строки группировки или продублировать итог соседнего числового поля.

Рекомендация: Все поля, которые должны выводиться в итогах или на уровне детальных записей как числовые показатели, обязательно должны быть добавлены на вкладку Ресурсы. Убедитесь, что выражения для ресурсов написаны корректно:

  1. Для ПроверкаНДФЛ_НУ выражение должно быть СУММА(ПроверкаНДФЛ_НУ).
  2. В колонке Рассчитывать по должно стоять «Все поля», если не требуется иное.

Резюме

Если вы столкнулись с тем, что СКД «живет своей жизнью» и показывает не те данные, что выдает консоль запросов, не спешите переписывать всю логику. Проанализируем ситуацию последовательно: от простого пересоздания полей в схеме до детальной проверки ролей и типов данных. Создание нового поля с уникальным именем — это самый быстрый способ победить внутренние ошибки кэширования метаданных 1С. Помните, что СКД — это мощный инструмент, но иногда его «интеллектуальные» механизмы оптимизации требуют ручной корректировки через явное указание типов и ролей.

← На главную