При разработке и кастомизации отчетов в системе «1С:Предприятие 8.3» программисты часто сталкиваются с неочевидным поведением платформы. Типичная ситуация: вы открываете внешний отчет (файл с расширением .erf), вносите изменения в запрос схемы компоновки данных (СКД), запускаете его в режиме «1С:Предприятие», но отчет упорно продолжает выводить старые данные. Более того, при попытке найти логику управления отчетом вы обнаруживаете, что у него отсутствует модуль менеджера, хотя в аналогичном встроенном отчете он был.
В этой статье мы подробно разберем, почему у внешних отчетов нет модуля менеджера, как правильно перенести его функции и как решить проблему кэширования СКД, когда система «игнорирует» ваши изменения в запросах.
Разберем архитектурные особенности платформы «1С:Предприятие». В конфигурации у любого отчета или обработки есть два основных модуля кода:
ПриКомпоновкеРезультата) и экспортные методы, доступные у конкретной ссылки на объект.Для внешних отчетов (файлов .erf) и внешних обработок (файлов .epf) модуль менеджера физически не предусмотрен платформой 1С. Когда вы сохраняете встроенный отчет во внешний файл, платформа автоматически и безвозвратно удаляет модуль менеджера. Обратиться к менеджеру внешнего отчета через стандартные механизмы метаданных невозможно, так как объект не зарегистрирован в самой конфигурации.
Если вам необходимо адаптировать отчет, содержащий важный код в модуле менеджера, выполните следующие шаги по переносу кода:
Шаг 1. Перенос стандартных обработчиков событий.
Обработчики событий компоновки данных, такие как ПриКомпоновкеРезультата, должны располагаться исключительно в Модуле объекта внешнего отчета. Убедитесь, что эта процедура объявлена с ключевым словом Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) в модуле объекта вашего файла .erf.
Шаг 2. Перенос экспортных методов менеджера.
Если в модуле менеджера содержались ваши собственные экспортные функции или процедуры, перенесите их в модуль объекта внешнего отчета. При этом вызов этих процедур из внешнего кода изменится. Вместо обращения к менеджеру конфигурации вам потребуется сначала создать объект отчета:
// Было во встроенном отчете:
Отчеты.МойОтчет.ВыполнитьЭкспортнуюЛогику();
// Стало для внешнего отчета:
ОбъектОтчета = ВнешниеОтчеты.Создать("C:\Reports\МойОтчет.erf");
ОбъектОтчета.ВыполнитьЭкспортнуюЛогику();
Шаг 3. Использование расширений конфигурации (альтернативный путь).
Если конфигурация находится на поддержке, но вам критически важно сохранить структуру отчета вместе с модулем менеджера (например, для интеграции с подсистемами БСП), откажитесь от использования внешнего файла .erf. Вместо этого добавьте отчет в расширение конфигурации. В расширении отчет сохраняет полноценную структуру конфигурации, включая модуль менеджера, где вы сможете переопределить логику через аннотации &Вместо, &Перед или &После.
Рассмотрим ситуацию, описанную автором темы: разработчик меняет запрос в схеме компоновки данных (например, жестко прописывает миллионные показатели для проверки), но отчет продолжает выводить корректные реальные данные из базы. Кажется, что выполняется какой-то скрытый код, перехватывающий запрос. На самом деле причина кроется в платформенных механизмах оптимизации и кэширования.
Существует две основные причины этого эффекта:
1. Платформенное кэширование настроек (Хранилище настроек)
Платформа 1С сохраняет пользовательские настройки отчетов в системные таблицы базы данных. Важно понимать: система привязывает сохраненный кэш к внутреннему имени объекта метаданных (свойство «Имя» в конфигураторе), а не к физическому имени файла на диске. Если вы открываете внешний отчет с тем же именем (например, ВнешнийОтчет1), платформа находит в кэше сохраненную структуру старой схемы СКД и программно накладывает ее поверх вашей новой схемы, полностью игнорируя изменения в запросе.
2. Механизмы Библиотеки стандартных подсистем (БСП)
Если ваша база работает на БСП (УТ 11, ERP, КА, БП 3.0, ЗУП 3), подсистема «Варианты отчетов» берет управление отображением на себя. БСП регистрирует варианты отчетов в справочнике ВариантыОтчетов (или ПредопределенныеВариантыОтчетов). При открытии внешнего отчета БСП может перехватить построение формы и подгрузить настройки и схему напрямую из справочника в базе данных, проигнорировав код внутри физического файла .erf на вашем диске.
Проанализируем практические способы сброса кэша и принудительного обновления схемы компоновки данных во внешнем отчете.
Это самый быстрый, простой и надежный способ во время разработки и отладки отчета. Выполните следующие шаги:
АнализСебестоимости, сделайте АнализСебестоимости_Новый или АнализСебестоимости_v2). Физическое имя файла на диске менять при этом не требуется.Поскольку имя изменилось, платформа посчитает этот отчет абсолютно новым объектом, проигнорирует все старые кэши настроек из базы данных и выполнит ваш новый запрос СКД.
Иногда достаточно принудительно очистить текущие настройки в пользовательском режиме:
Если отчет ранее регистрировался в системе как дополнительный отчет или обработка, необходимо очистить системные справочники:
Варианты отчетов или Предопределенные варианты отчетов. Удалите сохраненные варианты для этого отчета, чтобы БСП перестала подставлять старую структуру из базы данных.Если вы хотите гарантированно очистить кэш настроек конкретного отчета для текущего пользователя без изменения имени отчета, можно выполнить следующий программный код (например, через внешнюю обработку или в модуле объекта отчета при открытии):
// Задайте внутреннее имя вашего внешнего отчета
ИмяОтчета = "ВнешнийОтчет.АнализСебестоимости";
ИмяПользователяТекущего = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
// Очищаем кэш настроек формы и вариантов
ХранилищеСистемныхНастроек.Удалить("Общее/НастройкиФормыОтчета/" + ИмяОтчета, "", ИмяПользователяТекущего);
ХранилищеСистемныхНастроек.Удалить("Отчеты/Настройки/" + ИмяОтчета, "", ИмяПользователяТекущего);
Предупреждение("Кэш настроек отчета успешно очищен! Переоткройте отчет.");
Применяя данные методы, вы всегда сможете держать под контролем поведение внешних отчетов, легко переносить логику работы с данными и избегать распространенных проблем с кэшированием компоновщика настроек 1С.