Как программно загрузить файл в макет внешней обработки 1С и сохранить его настройки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке универсальных внешних обработок в среде «1С:Предприятие» перед программистом часто возникает задача сохранения пользовательских настроек. Хочется сделать так, чтобы обработка оставалась полностью автономной, легко переносилась между базами данных и сохраняла свое состояние (например, структуру колонок, пути к файлам или параметры заполнения документов). Логичным на первый взгляд решением кажется запись этих данных непосредственно внутрь макета самой обработки. Однако при попытке реализовать это программно разработчики сталкиваются с серьезными ограничениями платформы.

В этой статье мы подробно разберем, почему стандартными методами перезаписать макет в режиме «1С:Предприятие» невозможно, и рассмотрим практические, надежные альтернативы для решения этой задачи.

Почему напрямую перезаписать макет в памяти нельзя

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

Интерфейсные кнопки «Загрузить из файла» и «Выгрузить в файл», которые мы видим в Конфигураторе в окне редактирования макета двоичных данных, — это инструменты разработчика. В пользовательском режиме (в режиме предприятия) платформа блокирует любые попытки модификации структуры метаданных «на лету» в целях безопасности и стабильности системы. Программно записать новые двоичные данные в макет запущенного объекта в памяти невозможно.

Однако существуют проверенные обходные пути и архитектурные решения, позволяющие добиться нужного результата. Рассмотрим их по шагам.

Способ 1. Использование системного Хранилища общих настроек (Рекомендуемый)

Если наша цель — сделать универсальную обработку, которая не зависит от структуры метаданных конкретной информационной базы (будь то БП, ЗУП, ERP или пустая конфигурация), идеальным решением будет использование встроенного механизма ХранилищеОбщихНастроек.

Этот механизм является частью самой платформы «1С:Предприятие» и физически существует в абсолютно любой базе данных, даже если в ней нет ни одного справочника или регистра. Настройки сохраняются в специальной системной таблице СУБД.

Рассмотрим подробнее пример кода для сохранения и восстановления настроек через это хранилище. Мы можем упаковать все наши настройки (включая текстовые файлы, структуры и таблицы) в соответствие или структуру и записать их одной строкой кода.

Код для сохранения настроек:


Процедура СохранитьНастройкиВХранилище(ИмяНастройки, СтруктураПараметров) Экспорт
    
    // В качестве ключа объектов используем уникальный идентификатор нашей обработки
    КлючОбъекта = "УниверсальнаяОбработка_ЗагрузкаДанных";
    КлючНастройки = ИмяНастройки; // Например, "ПользовательскиеНастройки_txt"
    
    // Записываем структуру настроек в системное хранилище
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, СтруктураПараметров);
    
КонецПроцедуры

Код для получения (восстановления) настроек:


Функция ВосстановитьНастройкиИзХранилища(ИмяНастройки) Экспорт
    
    КлючОбъекта = "УниверсальнаяОбработка_ЗагрузкаДанных";
    КлючНастройки = ИмяНастройки;
    
    // Считываем данные. Если настроек нет, функция вернет Неопределено
    Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастройки);
    
    Если Настройки = Неопределено Тогда
        // Если настроек нет в базе, можно прочитать дефолтные параметры из нашего макета двоичных данных
        Настройки = ПолучитьНастройкиПоУмолчаниюИзМакета();
    КонецЕсли;
    
    Возврат Настройки;
    
КонецФункции

Этот способ максимально безопасен, быстр и полностью соответствует стандартам разработки фирмы «1С». Единственный его нюанс — настройки привязываются к конкретной информационной базе. Если вы перенесете файл обработки .epf на другой компьютер в другую базу, настройки придется вводить заново.

Способ 2. Хранение настроек в файле рядом с обработкой

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

Выясним, как это реализовать. При запуске внешней обработки мы можем программно определить путь к ее файлу на диске с помощью свойства ЭтотОбъект.ИспользуемоеИмяФайла (или через аналогичные свойства формы). Далее мы можем создать рядом файл с точно таким же именем, но с расширением .json или .xml.

Проанализируем пример реализации сохранения настроек в формат JSON:


Процедура СохранитьНастройкиВФайлРядом()
    
    // Проверяем, что обработка запущена как файл на диске
    ПутьКОбработке = ЭтотОбъект.ИспользуемоеИмяФайла;
    Если ПустаяСтрока(ПутьКОбработке) Тогда
        Возврат; // Обработка запущена из базы (например, через справочник Дополнительные отчеты и обработки)
    КонецЕсли;
    
    ФайлОбработки = Новый Файл(ПутьКОбработке);
    КаталогФайла = ФайлОбработки.Путь;
    ИмяБезРасширения = ФайлОбработки.ИмяБезРасширения;
    
    // Формируем путь к файлу настроек
    ПутьКНастройкам = КаталогФайла + ИмяБезРасширения + ".json";
    
    // Собираем данные для сохранения
    Настройки = Новый Структура;
    Настройки.Вставить("ДатаПоследнегоЗапуска", ТекущаяДата());
    Настройки.Вставить("КаталогВыгрузки", "C:\Temp");
    
    // Сериализуем в JSON и записываем на диск
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ОткрытьФайл(ПутьКНастройкам, , , Новый ПараметрыЗаписиJSON(,,,,,Истина));
    ЗаписатьJSON(ЗаписьJSON, Настройки);
    ЗаписьJSON.Закрыть();
    
КонецПроцедуры

При открытии обработки мы выполняем обратную операцию: проверяем наличие файла .json рядом с обработкой, считываем его данные, а если файл удален — инициализируем настройки по умолчанию из нашего встроенного макета.

Способ 3. Локальный профиль пользователя (AppData)

Когда внешняя обработка регистрируется в базе данных через стандартный механизм БСП «Дополнительные отчеты и обработки», физически файл .epf при каждом запуске копируется во временный каталог операционной системы на стороне клиента. Хранить настройки рядом с ним в этом случае бессмысленно, так как временная папка регулярно очищается.

В такой ситуации отличным решением будет запись конфигурационного текстового файла в постоянный рабочий каталог пользователя на компьютере. Для этого идеально подходит системная папка документов или каталог данных приложений (AppData).

Рассмотрим, как получить безопасный путь для записи файла настроек:


Функция ПолучитьПутьКЛокальномуФайлуНастроек()
    
    // Получаем путь к папке "Документы" текущего пользователя Windows/Linux
    КаталогДокументов = КаталогДокументов();
    
    // Создаем отдельную подпапку для нашей обработки, чтобы не мусорить в корне каталога
    ИмяПапкиНастроек = "1C_UniversalLoader_Settings";
    ПолныйПутьКПапке = КаталогДокументов + ИмяПапкиНастроек + ИнициализироватьРазделительПути();
    
    ФайлПапки = Новый Файл(ПолныйПутьКПапке);
    Если Не ФайлПапки.Существует() Тогда
        СоздатьКаталог(ПолныйПутьКПапке);
    КонецЕсли;
    
    Возврат ПолныйПутьКПапке + "settings.txt";
    
    // Примечание: Функция "ИнициализироватьРазделительПути" возвращает "\" или "/" в зависимости от ОС
КонецФункции

Функция ИнициализироватьРазделительПути()
    Возврат ПолучитьРазделительПути();
КонецФункции

Получив этот путь, мы можем без труда записывать туда текстовые параметры или сериализованные двоичные данные, используя стандартные объекты ТекстовыйДокумент или ЗаписьДанных.

Способ 4. Низкоуровневая модификация файла .epf на диске

Для полноты картины разберем самый сложный и нетривиальный способ, который упоминали опытные разработчики в обсуждении. Это программное изменение структуры самого файла внешней обработки на жестком диске.

Файл с расширением .epf (как и .erf, .cf) представляет собой структурированный компаунд-архив (особый формат контейнера 1С). Внутри этого контейнера все элементы обработки (формы, модули, макеты) хранятся в виде отдельных файлов, упакованных по определенным правилам.

Чтобы программно записать новые данные непосредственно в макет внутри файла .epf, разработчики используют следующие подходы:

  1. Использование внешних утилит (например, v8unpack): Из кода 1С через команду запуска приложений ЗапуститьПриложение вызывается консольная утилита, которая распаковывает файл обработки во временную директорию. Затем текстовый или двоичный файл макета заменяется новым файлом с настройками. После этого утилита упаковывает файлы обратно в .epf, заменяя исходный файл на диске.
  2. Пакетный режим Конфигуратора: Платформа 1С поддерживает специальные ключи командной строки для выгрузки и загрузки внешних обработок в исходные XML-файлы: /DumpExternalDataProcessorOrReportToFiles и /LoadExternalDataProcessorOrReportFromFiles. Мы можем запустить сеанс Конфигуратора в фоновом режиме, выгрузить обработку, перезаписать файлы макетов и собрать обратно. Однако этот метод требует установленного Конфигуратора и соответствующих прав, что делает его невозможным при работе в облачных сервисах (например, 1С:Фреш).
  3. Парсинг контейнера средствами встроенного языка: Существуют открытые библиотеки и алгоритмы (некоторые из них опубликованы на профильных ресурсах), которые умеют читать двоичный поток файла .epf, находить заголовки блоков макета по их сигнатурам, заменять поток байтов макета на новые данные и корректно пересчитывать контрольные суммы контейнера без использования стороннего софта.

Важное предупреждение: Использование низкоуровневой модификации файлов контейнеров связано с высокими рисками повреждения структуры файла обработки. При изменении формата контейнера платформой в новых релизах ваш алгоритм записи может дать сбой, что приведет к невозможности открыть обработку. Настоятельно рекомендуется использовать более надежные и документированные методы — ХранилищеОбщихНастроек или локальные файлы конфигурации в профиле пользователя.

Резюме

Мы подробно разобрали проблему программного изменения макетов и выяснили, что архитектурные ограничения платформы «1С:Предприятие» не позволяют напрямую писать данные в макеты запущенных объектов.

Для решения вашей задачи выберите один из надежных путей:

← На главную