При разработке в среде 1С программисты часто используют механизм копирования существующих объектов для экономии времени. Однако при создании нового внешнего отчета на основе старого шаблона (путем копирования файла .erf) возникает неприятная ситуация: при открытии нового отчета в пользовательском режиме в нем внезапно появляются настройки, фильтры и варианты отчета от его «прародителя». Даже если вы очистили схему компоновки данных (СКД), платформа продолжает восстанавливать старое состояние интерфейса.
В этой статье мы подробно разберем, почему 1С идентифицирует разные файлы как один и тот же объект, и изучим пошаговые алгоритмы, которые помогут сделать скопированный отчет полностью независимым.
Рассмотрим самую распространенную ошибку начинающих разработчиков. Платформа 1С:Предприятие при сохранении пользовательских настроек ориентируется не на имя файла на диске (например, Отчет_Продажи_Новый.erf), а на внутреннее свойство Имя, заданное в конфигураторе.
Проанализируем ситуацию: если вы взяли файл Отчет1.erf, скопировали его средствами Windows в Отчет2.erf, но не открыли его в конфигураторе для правки свойств, то внутри обоих файлов свойство Имя будет одинаковым (например, МойОтчет). Для платформы это сигнал, что оба файла — это один и тот же объект, и для них нужно использовать одну и ту же ветку в хранилище настроек.
Что необходимо сделать:
Выясним, где именно 1С хранит те самые «старые» настройки. В современных конфигурациях (особенно на базе БСП) используется механизм ХранилищеОбщихНастроек или ХранилищеВариантовОтчетов. Настройки привязываются к уникальному ключу, который состоит из имени объекта и имени пользователя.
Даже если вы удалите локальный кэш (папки в AppData), при открытии отчета система обратится к базе данных и подтянет сохраненные настройки по имени объекта. В управляемых формах за это отвечает свойство Хранилище настроек. Если там указано стандартное хранилище, отчет будет всегда «пачкаться» старыми данными, пока имя самого отчета остается прежним.
Для принудительной очистки настроек в конфигурациях на БСП (например, УТ 11, БП 3.0, ERP) проделаем следующие шаги:
В зависимости от того, используете вы обычные или управляемые формы, механизмы сохранения ведут себя по-разному. Разберем оба случая.
Для обычных форм:
В свойствах формы отчета существует флажок Восстанавливать значения при открытии. Если он включен, форма принудительно считывает последние сохраненные данные из системного реестра или базы данных. Чтобы разорвать связь, этот флажок необходимо снять. Также полезно проверить список Сохраняемые значения, где указаны конкретные реквизиты, подлежащие восстановлению.
Для управляемых форм:
Здесь аналогичную роль играет свойство формы Автосохранение данных в настройках (AutoSave). Оно может принимать значения Использовать или Не использовать. Если вы хотите, чтобы отчет каждый раз открывался «чистым», установите значение Не использовать. Однако помните, что это лишит пользователей возможности сохранять свои фильтры.
Иногда имя отчета изменено, флажки сняты, но настройки все равно «прилетают». Проанализируем настройки самой схемы компоновки данных. В СКД настройки привязываются не только к отчету, но и к конкретному варианту.
Если в старом отчете был вариант с именем «Основной» и вы оставили его без изменений в новом отчете, платформа может сопоставить их. Рассмотрим алгоритм исправления:
Платформа 1С активно кэширует структуру внешних отчетов и обработок для ускорения работы. Часто возникает эффект, когда разработчик внес изменения в программный код или макет СКД, но при запуске видит старую картину. Это происходит потому, что 1С хранит временную копию файла во внутреннем каталоге временных файлов.
Посмотрим, как можно обойти это поведение:
Во-первых, при разработке внешнего отчета рекомендуется периодически менять версию в имени самого файла (например, Отчет_v1.erf, Отчет_v2.erf). Это гарантирует, что платформа воспримет файл как новый.
Во-вторых, можно использовать программное открытие отчета, чтобы исключить влияние интерактивных механизмов кэширования:
ИмяФайла = "C:\Reports\MyNewReport.erf";
ВнешнийОтчетОбъект = ВнешниеОтчеты.Создать(ИмяФайла, Ложь);
ВнешнийОтчетОбъект.ПолучитьФорму().Открыть();
Параметр Ложь в методе Создать отключает безопасный режим (если это необходимо) и иногда помогает обойти некоторые механизмы платформенного кэширования метаданных.
Если вы используете механизм БСП для подключения внешних отчетов, то идентификация происходит по ссылке в справочнике ДополнительныеОтчетыИОбработки. Если вы обновляете существующий элемент справочника, загружая в него новый файл с измененным внутренним именем, настройки могут «перемешаться».
Для полной чистоты эксперимента при создании нового отчета на базе шаблона всегда создавайте новый элемент в справочнике дополнительных обработок, а не перезаписывайте существующий.
Если ни один из вышеперечисленных способов не помогает и отчет «намертво» запомнил старые настройки, применим метод «стерилизации» объекта через выгрузку в XML. Этот способ позволяет избавиться от скрытых идентификаторов, которые могли сохраниться в бинарных данных файла .erf.
Выполним следующие действия:
schema.xml.Файл — Новый — Внешний отчет.Этот метод гарантированно разрывает связь со старыми GUID и внутренними идентификаторами настроек, так как мы создаем объект «с нуля», используя только логическую структуру старого отчета.
Таким образом, мы выяснили, что проблема «старых настроек» — это не ошибка платформы, а следствие работы механизмов кэширования и идентификации объектов. Главное правило при работе с шаблонами: всегда менять внутреннее имя объекта в конфигураторе и следить за состоянием флагов автосохранения в формах.