При разработке внешних обработок часто возникает задача: сохранить подготовленные данные (например, таблицу значений или структуру с параметрами), чтобы при повторном запуске обработки или в другом сеансе быстро прочитать эту информацию. Иногда разработчики пытаются использовать для этого встроенный макет типа Двоичные данные, рассчитывая программно перезаписать его прямо во время работы.
Разберем, почему данный подход не сработает в платформе 1С:Предприятие, и рассмотрим надежные альтернативные варианты сохранения и чтения данных.
Проанализируем архитектуру работы с макетами и метаданными:
.epf и .erf), в режиме «1С:Предприятие» открываются исключительно для чтения.Таким образом, макет подходит только для хранения статичной информации, заранее помещенной туда на этапе разработки в конфигураторе. Для динамических данных необходимо использовать другие механизмы.
Если необходимо переносить данные между разными компьютерами или сохранять файл автономно от информационной базы, наиболее простым решением является запись данных во внешний файл.
1. Использование методов ЗначениеВФайл и ЗначениеИзФайла
Это самый быстрый встроенный способ сохранения произвольных сериализуемых типов платформы (включая таблицы значений) во внутреннем бинарном формате 1С:
// Запись таблицы значений в файл
ПутьКФайлу = "C:\Temp\ExportedData.dat";
ЗначениеВФайл(ПутьКФайлу, ТаблицаДанных);
// Чтение таблицы значений из файла
ТаблицаДанных = Новый ТаблицаЗначений;
Если ЗначениеИзФайла(ПутьКФайлу, ТаблицаДанных) Тогда
// Таблица успешно заполнена
КонецЕсли;
2. Сериализация в формат XML через СериализаторXDTO
Если требуется сохранить данные в текстовом формате, можно применить стандартный механизм сериализации:
// Запись в XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Temp\ExportedData.xml");
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаДанных);
ЗаписьXML.Закрыть();
// Чтение из XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\Temp\ExportedData.xml");
ТаблицаДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Когда данные необходимо сохранять в разрезе текущего пользователя без создания файлов на диске, отлично подходит объект ХранилищеОбщихНастроек. Механизм сохраняет данные непосредственно в системные таблицы информационной базы:
ИмяОбработки = "МояВнешняяОбработка";
КлючНастроек = "СохраненнаяТаблица";
// Сохранение таблицы значений
ХранилищеОбщихНастроек.Сохранить(ИмяОбработки, КлючНастроек, ТаблицаДанных);
// Загрузка таблицы значений
ТаблицаДанных = ХранилищеОбщихНастроек.Загрузить(ИмяОбработки, КлючНастроек);
Если сохраненные данные должны быть доступны сразу всем пользователям или централизованно храниться в конкретном документе или справочнике, используется объект ХранилищеЗначения:
// Упаковка таблицы значений в двоичные данные со сжатием
Хранилище = Новый ХранилищеЗначения(ТаблицаДанных, Новый СжатиеДанных(9));
// Извлечение данных обратно в таблицу значений
ТаблицаДанных = Хранилище.Получить();
В типовых конфигурациях на базе «Библиотеки стандартных подсистем» (БСП) внешние обработки чаще всего подключаются через справочник Дополнительные отчеты и обработки. В таком сценарии для хранения настроек и результатов работы рекомендуется использовать механизмы подсистемы «Варианты отчетов» или стандартные регистры сведений сохранения настроек пользователей БСП.