Работа с регламентированной отчетностью в конфигурации «1С:Управление производственным предприятием 1.3» (УПП) часто преподносит сюрпризы технического характера. Одна из самых раздражающих проблем — ситуация, когда программист вносит исправления во внешний отчет (файл .erf), загружает его в базу, но при формировании отчет продолжает выдавать старую ошибку. Мы можем перезапускать сеанс, чистить кэш платформы и даже перезагружать компьютер, но система упорно «цепляет» старую версию кода.
В этой статье мы подробно разберем, почему это происходит, проанализируем внутренние механизмы УПП и составим четкий алгоритм действий, который поможет гарантированно обновить отчет.
Давайте проанализируем ситуацию. Когда мы добавляем внешний отчет в справочник РегламентированныеОтчеты, система сохраняет его во внутреннее хранилище (двоичные данные). При попытке формирования отчета программа должна извлечь эти данные, сохранить их во временный файл и запустить. Однако в УПП этот процесс реализован с рядом особенностей, которые и приводят к сбоям.
Рассмотрим основные факторы, препятствующие обновлению:
РеглОтчеты() в общем модуле РеглОтчетность выполняет поиск по справочнику без учета пометки удаления. Если в базе существует несколько элементов с одинаковым источником или похожими наименованиями, система может выбрать первый попавшийся (часто — старый), даже если он помечен на удаление.%TEMP%. Если имя временного файла, генерируемого системой, совпадает с тем, что уже лежит в папке, перезаписи может не произойти..erf имеет внутреннее свойство «Имя» в метаданных. Если вы создали «Отчет Версия 2» простым копированием «Отчета Версия 1», их внутренние идентификаторы и имена будут идентичны, что вводит механизмы сопоставления 1С в заблуждение.Давайте посмотрим на корень проблемы в коде. В типовых конфигурациях прошлых поколений (УПП, КА 1.1) запрос к справочнику РегламентированныеОтчеты часто выглядит упрощенно. Проанализируем примерную логику, которая приводит к ошибке:
// Пример упрощенной логики в модуле РеглОтчетность
Функция НайтиВнешнийОтчет(ВыбранныйОтчет)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ТОП 1
| РеглОтчеты.Ссылка,
| РеглОтчеты.ФайлОтчета
|ИЗ
| Справочник.РегламентированныеОтчеты КАК РеглОтчеты
|ГДЕ
| РеглОтчеты.Наименование ПОДОБНО &Наименование";
Запрос.УстановитьПараметр("Наименование", ВыбранныйОтчет.Наименование);
// Здесь отсутствует фильтр ГДЕ НЕ ПометкаУдаления
// В итоге выбирается самая старая запись, созданная первой
КонецФункции
Поскольку фильтрация по ПометкаУдаления = Ложь отсутствует, создание нового элемента в справочнике не решает проблему — старый «битый» элемент все равно перехватывает управление.
Вместо создания новых элементов справочника, мы рекомендуем придерживаться следующей последовательности действий при обновлении кода отчета:
.erf.Чтобы система гарантированно восприняла отчет как новый, мы можем изменить его внутреннее имя. Проанализируем, как это сделать правильно:
Разберем по шагам:
.erf) в Конфигураторе через «Файл» -> «Открыть».Баланс на Баланс_Новый или добавьте текущую дату/версию.Такой подход заставляет механизмы 1С инициализировать объект «с нуля», не используя старые ссылки в оперативной памяти сеанса.
Если после всех манипуляций в базе отчет все равно не обновляется, необходимо вмешаться в работу файловой системы. Рассмотрим, как очистить «глубокий» кэш временных файлов:
При запуске внешнего регламентированного отчета 1С выполняет код, похожий на следующий:
ИмяВременногоФайла = КаталогВременныхФайлов() + "РеглОтчет_" + УникальныйИдентификатор + ".erf";
ДвоичныеДанныеОтчета.Записать(ИмяВременногоФайла);
ВнешниеОтчеты.Создать(ИмяВременногоФайла);
Иногда алгоритм формирования ИмяВременногоФайла дает сбой или права доступа мешают перезаписать существующий в папке Temp файл.
Рассмотрим порядок ручной очистки:
Win + R, введите %TEMP% и нажмите Enter..erf.v8_XXXX_XX.Мы выяснили причину аномального поведения УПП: это сочетание недоработок в коде типового модуля РеглОтчетность (отсутствие фильтрации по пометке удаления) и особенностей кэширования внешних файлов платформой.
Для гарантированного обновления регламентированного отчета следуйте этому чеклисту:
%TEMP% на рабочем месте пользователя.Использование этих методов позволит вам сэкономить время и избежать необходимости «перезагружать компьютер по три раза», когда проблема кроется в паре строк кода стандартного модуля конфигурации.