Ситуация, когда один и тот же отчет на базе Системы компоновки данных (СКД) выдает разные результаты при запуске из состава конфигурации и как внешнего файла (.erf), является классической проблемой для разработчиков 1С. Несмотря на идентичность схемы компоновки, параметров и отборов, цифры могут различаться в разы. Проанализируем причины этого явления и разберем по шагам методы диагностики и отладки проблемы.
Одной из наиболее вероятных причин расхождений является механизм сохранения пользовательских настроек. В системе 1С настройки отчетов (отборы, параметры, выбранные поля) сохраняются не только в локальном кэше пользователя на компьютере, но и непосредственно в базе данных в таблице SystemSettingsStorage (ХранилищеСистемныхНастроек). Эти настройки жестко привязаны к полному имени объекта метаданных, например, Отчет.РеестрПоЗаявкам.
Когда мы открываем внешний отчет, система воспринимает его как новый объект с уникальным (пустым) идентификатором, и настройки из базы данных к нему не применяются. Для встроенного же отчета могут подтягиваться «невидимые» настройки, которые не отображаются в пользовательском интерфейсе, но участвуют в компоновке результата. Разберем, как это проверить:
Имя (не синоним) объекта, например, с РеестрПоЗаявкам на РеестрПоЗаявкам_Тест.Разница в данных (например, в 1.5–2 раза) часто указывает на работу механизма RLS (Row Level Security — ограничение прав на уровне записей). Рассмотрим, как контекст выполнения влияет на выборку данных и проверим права доступа к объектам:
Встроенный отчет: Часто вызывается через специализированную команду или форму, в которой может быть прописан переход в привилегированный режим. Если отчет выполняется на сервере в модуле с установленным флажком «Привилегированный», система игнорирует ограничения RLS и показывает все данные.
Внешний отчет: При открытии через Файл — Открыть отчет всегда выполняется с правами текущего пользователя. Если у пользователя ограничены права на определенные организации, подразделения или склады, внешний отчет просто «отфильтрует» эти записи на уровне СУБД, в то время как внутренний может продолжать выводить полную картину, если используются избыточные права.
Проанализируем программный код вызова формы встроенного отчета и права на него. Посмотрим на типичный пример команды открытия:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура;
// Здесь могут быть неявно переданы параметры, ограничивающие выборку
ОткрытьФорму("Отчет.РеестрПоЗаявкам.Форма",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно,
ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Если в ПараметрыФормы или в логике самой формы прописаны дополнительные условия, они не будут действовать во внешнем файле, если вы не перенесли туда соответствующий код модуля формы.
Разберем ситуацию, когда логика отчета модифицируется программно перед выводом. В СКД существует предопределенное событие ПриКомпоновкеРезультата, которое находится в модуле объекта отчета. Разработчики часто используют его для динамической подстановки параметров или изменения текста запроса.
При сохранении отчета как внешнего (.erf), модуль объекта сохраняется вместе с ним. Однако, механизмы БСП (Библиотеки стандартных подсистем), активно используемые в УТ 11.5, могут по-разному инициализировать отчет. Например, встроенный отчет может использовать глобальные сеансовые параметры или специфические настройки расширений конфигурации, которые недоступны внешнему файлу в том же контексте.
Проверим наличие расширений в базе. Если расширение модифицирует схему встроенного отчета РеестрПоЗаявкам, то внешний отчет об этих изменениях знать не будет, так как он обращается к основной конфигурации. Это объясняет, почему данные во встроенном отчете могут быть «обрезаны» по сравнению с внешним.
Если визуальный анализ параметров и настроек не дает ответа, применим метод «контрольного сравнения» на уровне записей. Это позволит точно выяснить, какие именно документы или операции «теряются» или «дублируются» в одном из вариантов отчета. Выполним следующие шаги:
Регистратор (ссылка на документ) и, если возможно, номер строки или конкретную аналитику..mxl или .xlsx).Этот метод позволяет увидеть характер различий. Например, если во встроенном отчете отсутствуют документы по определенной организации, это явный признак влияния RLS или скрытого отбора. Если суммы в строках различаются на определенный коэффициент, стоит проверить параметры, влияющие на расчет (например, курсы валют или коэффициенты упаковок), которые могут инициализироваться по-разному.
Чтобы окончательно исключить влияние механизмов СКД (таких как автозаполнение или виртуальные таблицы), проанализируем «чистый» запрос. Выполним следующие действия:
Если результат в консоли совпадает с внешним отчетом, но отличается от встроенного — проблема на 100% в настройках или программном коде внутри конфигурации (модули, расширения, команды), которые модифицируют процесс компоновки встроенного объекта.
Подводя итог, для исправления ситуации выполним рекомендации в следующем порядке:
ПриСозданииНаСервере.Именно комплексный подход, от простого сброса настроек до детального сравнения MXL-файлов, позволяет быстро найти причину расхождений и гарантировать достоверность отчетности в 1С.