При разработке дополнительных инструментов часто возникает необходимость сохранить внесенные пользователем изменения прямо внутри внешней обработки (файла .epf). Например, пользователь открывает форму обработки, загружает данные из макета, добавляет или удаляет позиции (список штрихкодов, сопоставления или коэффициенты) и рассчитывает увидеть обновленные данные при следующем запуске. Разберем подробнее особенности платформы 1С:Предприятие, выясним причины существующих ограничений и проанализируем архитектурно верные способы решения этой задачи.
Платформа 1С накладывает жесткие правила на работу с метаданными внешних обработок в режиме 1С:Предприятие. Все объекты метаданных внешней обработки, включая макеты (например, ТабличныйДокумент, ДвоичныеДанные или ТекстовыйДокумент), доступны исключительно в режиме чтения.
Вызов метода ПолучитьМакет() объекта ВнешняяОбработкаОбъект возвращает копию макета в оперативной памяти. Изменение этой копии не оказывает никакого влияния на сам файл обработки на диске. Платформа 1С не предоставляет встроенного программного API для модификации внутренней структуры бинарного контейнера .epf во время работы пользователя. Программно перезаписать встроенный макет без использования Конфигуратора невозможно.
Посмотрим на практические альтернативы, которые позволяют обойти это ограничение и реализовать сохранение данных.
Если задача заключается в том, чтобы сохранить введенные пользователем данные (списки, таблицы, флаги) между сеансами работы, наиболее простым решением на управляемых формах является использование встроенного механизма сохранения настроек.
Разберем настройки формы по шагам:
Использовать.Платформа 1С автоматически записывает значения указанных реквизитов в системное ХранилищеНастроек информационной базы. При повторном открытии обработки платформа восстанавливает сохраненные данные, исключая зависимость от чистки локального кэша пользователя.
Если обработка используется локально и данные должны храниться отдельно от информационной базы, можно организовать сохранение структуры данных в отдельный файл (например, JSON или XML), находящийся в той же директории, что и файл .epf, либо во временном каталоге пользователя.
Рассмотрим пример кода для записи и чтения данных с использованием функций платформы 1С:
// Пример записи таблицы или структуры данных в локальный файл
&НаСервере
Процедура СохранитьДанныеВФайл(ДанныеДляСохранения, ПутьКФайлу)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ПутьКФайлу);
ЗаписатьJSON(ЗаписьJSON, ДанныеДляСохранения);
ЗаписьJSON.Закрыть();
КонецПроцедуры
// Пример чтения данных из локального файла
&НаСервере
Функция ПрочитатьДанныеИзФайла(ПутьКФайлу)
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если НЕ ФайлНаДиске.Существует() Тогда
Возврат Неопределено;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
Результат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат Результат;
КонецФункции
Для определения каталога хранения файла можно использовать свойства объекта обработки или системную функцию КаталогВременныхФайлов().
Когда внешняя обработка подключается к конфигурации через механизм дополнительных отчетов и обработок БСП, она регистрируется в справочнике ДополнительныеОтчетыИОбработки. В этом случае хранение пользовательских параметров организуется прямо в информационной базе.
Проанализируем основные подходы при работе с БСП:
ХранилищеЗначения и записывается в сопутствующий регистр сведений или реквизит элемента справочника.Пример упаковки и извлечения структуры данных:
// Упаковка данных для сохранения в базе
ДанныеДляЗаписи = Новый ХранилищеЗначения(ТаблицаШтрихкодов, Новый СжатиеДанных(9));
// Распаковка данных при открытии
ТаблицаШтрихкодов = ДанныеДляЗаписи.Получить();
Посмотрим на ситуацию, когда встроенный макет необходим лишь как начальный шаблон. В таком случае правильным подходом будет разделение шаблона и редактируемых данных.
ПолучитьМакет() для инициализации структуры.ТаблицаЗначений.ТабличныйДокумент формируется на лету в оперативной памяти на основе текущих данных из формы, не затрагивая исходный файл обработки.Таким образом, попытка физической перезаписи макета внутри файла внешней обработки программным путем в 1С невозможно. Для решения задач хранения пользовательских изменений следует использовать системное ХранилищеНастроек, внешние JSON/XML файлы или механизмы сохранения параметров БСП.