Почему данные в отчете СКД различаются при запуске из конфигурации и как внешнего файла?

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

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

Влияние хранилища системных настроек

Одной из наиболее вероятных причин расхождений является механизм сохранения пользовательских настроек. В системе 1С настройки отчетов (отборы, параметры, выбранные поля) сохраняются не только в локальном кэше пользователя на компьютере, но и непосредственно в базе данных в таблице SystemSettingsStorage (ХранилищеСистемныхНастроек). Эти настройки жестко привязаны к полному имени объекта метаданных, например, Отчет.РеестрПоЗаявкам.

Когда мы открываем внешний отчет, система воспринимает его как новый объект с уникальным (пустым) идентификатором, и настройки из базы данных к нему не применяются. Для встроенного же отчета могут подтягиваться «невидимые» настройки, которые не отображаются в пользовательском интерфейсе, но участвуют в компоновке результата. Разберем, как это проверить:

  1. Переименуем отчет в конфигураторе. Достаточно изменить Имя (не синоним) объекта, например, с РеестрПоЗаявкам на РеестрПоЗаявкам_Тест.
  2. Если после переименования данные во встроенном отчете стали совпадать с внешним — значит, проблема в сохраненных настройках.
  3. Для решения проблемы в пользовательском режиме необходимо перейти в раздел Администрирование — Настройки пользователей и прав — Очистка настроек. Выберем нужного пользователя и удалим все настройки, связанные с проблемным отчетом. Простого нажатия кнопки «Установить стандартные настройки» в самом отчете часто бывает недостаточно, так как она не всегда затрагивает скрытые параметры СКД.

Различия в правах доступа и механизме RLS

Разница в данных (например, в 1.5–2 раза) часто указывает на работу механизма RLS (Row Level Security — ограничение прав на уровне записей). Рассмотрим, как контекст выполнения влияет на выборку данных и проверим права доступа к объектам:

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

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

Проанализируем программный код вызова формы встроенного отчета и права на него. Посмотрим на типичный пример команды открытия:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ПараметрыФормы = Новый Структура;
    // Здесь могут быть неявно переданы параметры, ограничивающие выборку
    ОткрытьФорму("Отчет.РеестрПоЗаявкам.Форма", 
                 ПараметрыФормы, 
                 ПараметрыВыполненияКоманды.Источник, 
                 ПараметрыВыполненияКоманды.Уникальность, 
                 ПараметрыВыполненияКоманды.Окно, 
                 ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры

Если в ПараметрыФормы или в логике самой формы прописаны дополнительные условия, они не будут действовать во внешнем файле, если вы не перенесли туда соответствующий код модуля формы.

Программная модификация в модуле объекта

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

При сохранении отчета как внешнего (.erf), модуль объекта сохраняется вместе с ним. Однако, механизмы БСП (Библиотеки стандартных подсистем), активно используемые в УТ 11.5, могут по-разному инициализировать отчет. Например, встроенный отчет может использовать глобальные сеансовые параметры или специфические настройки расширений конфигурации, которые недоступны внешнему файлу в том же контексте.

Проверим наличие расширений в базе. Если расширение модифицирует схему встроенного отчета РеестрПоЗаявкам, то внешний отчет об этих изменениях знать не будет, так как он обращается к основной конфигурации. Это объясняет, почему данные во встроенном отчете могут быть «обрезаны» по сравнению с внешним.

Методика детального сравнения данных

Если визуальный анализ параметров и настроек не дает ответа, применим метод «контрольного сравнения» на уровне записей. Это позволит точно выяснить, какие именно документы или операции «теряются» или «дублируются» в одном из вариантов отчета. Выполним следующие шаги:

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

Этот метод позволяет увидеть характер различий. Например, если во встроенном отчете отсутствуют документы по определенной организации, это явный признак влияния RLS или скрытого отбора. Если суммы в строках различаются на определенный коэффициент, стоит проверить параметры, влияющие на расчет (например, курсы валют или коэффициенты упаковок), которые могут инициализироваться по-разному.

Использование консоли запросов для диагностики

Чтобы окончательно исключить влияние механизмов СКД (таких как автозаполнение или виртуальные таблицы), проанализируем «чистый» запрос. Выполним следующие действия:

  1. Откроем схему компоновки данных и скопируем текст основного запроса.
  2. Воспользуемся инструментом Консоль запросов.
  3. Вставим запрос и вручную установим те же значения параметров (начало и конец периода), которые используются в отчете.
  4. Сравним результат консоли с результатами обоих отчетов.

Если результат в консоли совпадает с внешним отчетом, но отличается от встроенного — проблема на 100% в настройках или программном коде внутри конфигурации (модули, расширения, команды), которые модифицируют процесс компоновки встроенного объекта.

Итоги и рекомендации

Подводя итог, для исправления ситуации выполним рекомендации в следующем порядке:

Именно комплексный подход, от простого сброса настроек до детального сравнения MXL-файлов, позволяет быстро найти причину расхождений и гарантировать достоверность отчетности в 1С.

← На главную