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