Возможно ли хранить и перезаписывать данные внутри внешней обработки 1С

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

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

Ограничения платформы 1С при работе с макетами и метаданными

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

Вызов метода ПолучитьМакет() объекта ВнешняяОбработкаОбъект возвращает копию макета в оперативной памяти. Изменение этой копии не оказывает никакого влияния на сам файл обработки на диске. Платформа 1С не предоставляет встроенного программного API для модификации внутренней структуры бинарного контейнера .epf во время работы пользователя. Программно перезаписать встроенный макет без использования Конфигуратора невозможно.

Посмотрим на практические альтернативы, которые позволяют обойти это ограничение и реализовать сохранение данных.

Вариант 1. Автоматическое сохранение данных в настройках формы

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

Разберем настройки формы по шагам:

  1. Откроем форму внешней обработки в режиме Конфигуратора.
  2. В палитре свойств формы установим флаг АвтоматическоеСохранениеДанныхВНастройках в значение Использовать.
  3. В свойстве СохраняемыеДанные выберем реквизиты формы, значения которых должны автоматически запоминаться при закрытии (например, таблица значений со списком штрихкодов или список значений).

Платформа 1С автоматически записывает значения указанных реквизитов в системное ХранилищеНастроек информационной базы. При повторном открытии обработки платформа восстанавливает сохраненные данные, исключая зависимость от чистки локального кэша пользователя.

Вариант 2. Локальное хранение данных во внешнем файле

Если обработка используется локально и данные должны храниться отдельно от информационной базы, можно организовать сохранение структуры данных в отдельный файл (например, JSON или XML), находящийся в той же директории, что и файл .epf, либо во временном каталоге пользователя.

Рассмотрим пример кода для записи и чтения данных с использованием функций платформы 1С:


// Пример записи таблицы или структуры данных в локальный файл
&НаСервере
Процедура СохранитьДанныеВФайл(ДанныеДляСохранения, ПутьКФайлу)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ОткрытьФайл(ПутьКФайлу);
    ЗаписатьJSON(ЗаписьJSON, ДанныеДляСохранения);
    ЗаписьJSON.Закрыть();
    
КонецПроцедуры

// Пример чтения данных из локального файла
&НаСервере
Функция ПрочитатьДанныеИзФайла(ПутьКФайлу)
    
    ФайлНаДиске = Новый Файл(ПутьКФайлу);
    Если НЕ ФайлНаДиске.Существует() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Возврат Результат;
    
КонецФункции

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

Вариант 3. Использование возможностей Библиотеки Стандартных Подсистем (БСП)

Когда внешняя обработка подключается к конфигурации через механизм дополнительных отчетов и обработок БСП, она регистрируется в справочнике ДополнительныеОтчетыИОбработки. В этом случае хранение пользовательских параметров организуется прямо в информационной базе.

Проанализируем основные подходы при работе с БСП:

  1. Хранение в параметрах обработки: БСП предоставляет механизм сохранения настроек дополнительной обработки в разрезе пользователей или организаций.
  2. Использование ХранилищаЗначения: Любая сложная структура (список штрихкодов, таблица соответствий) упаковывается в объект ХранилищеЗначения и записывается в сопутствующий регистр сведений или реквизит элемента справочника.

Пример упаковки и извлечения структуры данных:


// Упаковка данных для сохранения в базе
ДанныеДляЗаписи = Новый ХранилищеЗначения(ТаблицаШтрихкодов, Новый СжатиеДанных(9));

// Распаковка данных при открытии
ТаблицаШтрихкодов = ДанныеДляЗаписи.Получить();

Вариант 4. Формирование динамических макетов в памяти

Посмотрим на ситуацию, когда встроенный макет необходим лишь как начальный шаблон. В таком случае правильным подходом будет разделение шаблона и редактируемых данных.

  1. Исходный макет из внешней обработки считывается только один раз методом ПолучитьМакет() для инициализации структуры.
  2. Внесенные пользователем изменения фиксируются в реквизите формы типа ТаблицаЗначений.
  3. При выгрузке или печати новый ТабличныйДокумент формируется на лету в оперативной памяти на основе текущих данных из формы, не затрагивая исходный файл обработки.

Таким образом, попытка физической перезаписи макета внутри файла внешней обработки программным путем в 1С невозможно. Для решения задач хранения пользовательских изменений следует использовать системное ХранилищеНастроек, внешние JSON/XML файлы или механизмы сохранения параметров БСП.

← На главную