Как найти причину расхождения данных в отчетах на СКД и извлечь текст запроса

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

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

Откуда берется форма отчета, если она не создана в конфигураторе

Часто программисты сталкиваются с тем, что во внешнем отчете нет ни одной формы, но в режиме «Предприятие» он открывается с полноценным интерфейсом. Разберем, как это работает. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) реализован механизм автоматической подстановки форм. Если в объекте отчета не задана «Основная форма отчета», платформа 1С обращается к свойствам конфигурации. Там, в корневом узле, указаны стандартные формы (обычно это ОбщаяФорма.ФормаОтчета).

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

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

Чтобы понять, почему суммы расходятся, нужно проанализировать не исходный запрос, написанный в схеме компоновки, а тот, который реально выполняется на сервере БД после применения всех пользовательских фильтров. Рассмотрим основные методы получения этого запроса.

1. Использование Консоли системы компоновки данных

Это самый эффективный способ для визуального анализа. Проанализируем ситуацию: мы можем загрузить внешний отчет в консоль СКД. В консоли есть возможность просмотреть «Исполняемый запрос». Он отличается от исходного тем, что в него уже встроены условия (ГДЕ), параметры и выбранные поля, которые пользователь добавил в настройках отчета.

2. Программный перехват через отладчик

Выясним причину расхождений, посмотрев данные непосредственно в момент формирования отчета. Для этого нам нужно найти в коде или в общем модуле БСП место, где вызывается метод КомпоновщикМакета.Выполнить(). Объект МакетКомпоновки, который возвращает этот метод, содержит всю необходимую информацию. Посмотрим на пример кода, который можно использовать для отладки:


// В точке останова после выполнения КомпоновщикМакета.Выполнить()
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);

// Исследуем структуру Макета
Для Каждого НаборДанных Из МакетКомпоновки.НаборыДанных Цикл
    Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        // Переменная ТекстЗапроса содержит финальный текст SQL-подобного запроса 1С
        ТекстЗапроса = НаборДанных.Запрос;
    КонецЕсли;
КонецЦикла;

3. Включение отладки фоновых заданий

Важно помнить, что в управляемых формах отчеты часто формируются в фоновом задании. Чтобы «поймать» запрос в отладчике, необходимо в настройках отладки включить флажок «Автоматическое подключение фоновых заданий», иначе точка останова в момент формирования макета просто не сработает.

Особенности анализа отчета Валовая прибыль по оплаченным отгрузкам

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

  1. Связь регистров: Типовой отчет анализирует пересечение данных из регистра ВыручкаИСебестоимостьПродаж и регистров взаиморасчетов (например, РасчетыСКлиентамиПоДокументам). Сумма прибыли в нем признается только в части, которая была фактически оплачена клиентом.
  2. Метод распределения оплаты: Отчет опирается на распределение платежей по документам отгрузки (обычно по методу ФИФО). Если в базе не выполнено регламентное задание «Выполнение отложенных движений по расчетам с клиентами», данные в отчете будут неактуальными или нулевыми.
  3. Граница периода: В СКД важно проверять закладку «Параметры». Часто в запросах используются виртуальные таблицы остатков или оборотов, где границы периодов могут быть жестко заданы или иметь свои роли (НачалоПериода, КонецПериода).

Типовые причины расхождения сумм в СКД

Проанализируем ситуацию, когда запросы кажутся одинаковыми, но итоги разные. Разберем основные причины:

Роли полей: В СКД на закладке «Наборы данных» у каждого поля есть свойство Роль. Если для поля периода или измерения роль настроена неверно (например, не указано «Обязательное» или неверно задано «Игнорировать значения NULL»), СКД может некорректно группировать данные. Это приводит к дублированию строк при соединении таблиц (Left Join) или, наоборот, к исчезновению данных.

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

Настройки группировок: Иногда пользователи не могут найти возможность выбрать группу номенклатуры или изменить иерархию. Это делается в окне «Настройки» на вкладке «Группировки». Даже если формы нет, через стандартное меню «Еще — Настройки» можно управлять составом полей и группировками, что существенно меняет итоговую таблицу.

Методика проведения аудита данных

Разберем по шагам, как эффективно найти расхождение:

  1. Выгрузим оба отчета в Excel в максимально детальном виде (с группировкой по регистратору или конкретному документу продажи).
  2. Используем функцию ВПР (VLOOKUP) для сопоставления сумм по номерам документов.
  3. Найдем конкретные документы, по которым суммы не совпадают.
  4. В 1С откроем «Движения документа» по этим позициям и проверим, по каким регистрам прошли суммы (например, ВыручкаИСебестоимостьПродаж против РасчетыСКлиентами).
  5. Сравним условия в запросах: учитывает ли отчет только проведенные документы, исключает ли он определенные типы операций (например, возвраты или корректировки).

Таким образом, сочетание анализа итогового запроса через МакетКомпоновки и детального сравнения данных в Excel позволяет быстро локализовать программную или логическую ошибку в отчетах любой сложности.

← На главную