Как записать файл в хранилище значения и изменить его в 1С

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

При разработке и настройке конфигураций на платформе 1С:Предприятие часто возникает необходимость хранить пользовательские файлы (файлы настроек, схемы XML, макеты или внешние документы) непосредственно в базе данных. Для решения этой задачи используется специальный тип данных — ХранилищеЗначения.

Рассмотрим особенности этого типа данных: ХранилищеЗначения не позволяет модифицировать бинарные данные частично или «на месте». Чтобы внести изменения в файл, хранящийся в базе, его необходимо полностью извлечь, отредактировать и поместить обновленный объект обратно. Разберем по шагам, как правильно реализовать этот процесс в управляемом приложении.

Алгоритм работы с файлом через ХранилищеЗначения

Проанализируем базовую схему работы с бинарным файлом настроек. Процесс включает в себя следующие этапы:

  1. Извлечение объекта ДвоичныеДанные из реквизита типа ХранилищеЗначения.
  2. Запись двоичных данных во временный каталог на локальном диске пользователя.
  3. Открытие и редактирование файла (вручную пользователем или программно).
  4. Чтение модифицированного файла с диска обратно в объект ДвоичныеДанные.
  5. Создание нового объекта ХранилищеЗначения и его сохранение в реквизит базы данных.

Посмотрим на пример программного кода для сервера, выполняющего запись и чтение файла:


// 1. Помещение файла с диска в ХранилищеЗначения
ДвоичныеДанныеФайла = Новый ДвоичныеДанные("C:\Settings\config.xml");
НовоеХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9));

// Запись в реквизит объекта (например, справочника)
ОбъектНастроек = Справочники.НастройкиПользователей.СоздатьЭлемент();
ОбъектНастроек.Наименование = "Файл конфигурации";
ОбъектНастроек.ХранилищеФайла = НовоеХранилище;
ОбъектНастроек.Записать();

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

Обратите внимание: При создании объекта ХранилищеЗначения рекомендуется использовать второй параметр — СжатиеДанных. Для текстовых конфигураций, JSON и XML-файлов это существенно уменьшает размер базы данных.

Особенности клиент-серверного взаимодействия

В управляемом приложении тонкий клиент не имеет прямого доступа к реквизитам базы данных с типом ХранилищеЗначения. Передачу бинарного содержимого между клиентом и сервером необходимо организовывать через временное хранилище.

Разберем по шагам правильную схему работы в управляемых формах:

  1. На сервере: извлекаем ДвоичныеДанные из ХранилищеЗначения и помещаем их во временное хранилище методом ПоместитьВоВременноеХранилище, получая адрес.
  2. На клиенте: скачиваем данные по адресу временного хранилища (например, с помощью метода ПолучитьФайлССервера) во временную папку клиентского компьютера и выполняем редактирование.
  3. На клиенте: отправляем отредактированный файл обратно на сервер с помощью вызова ПоместитьФайлНаСервер.
  4. На сервере: извлекаем обновленные ДвоичныеДанные из временного хранилища, оборачиваем их в Новый ХранилищеЗначения(...) и сохраняем элемент базы данных.

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

Альтернативные способы хранения настроек

Выясним, какие существуют альтернативы созданию собственных реквизитов с типом ХранилищеЗначения:

  1. Прямое сохранение структур 1С: Если настройки представляют собой словарь параметров, совсем не обязательно создавать текстовый файл. Платформа 1С умеет сериализовать объекты типа Структура или Соответствие напрямую в ХранилищеЗначения. В этом случае данные можно изменять прямо в коде BSL без взаимодействия с файловой системой.
  2. Системное ХранилищеОбщихНастроек: Для сохранения пользовательских параметров и конфигурационных файлов не требуется создавать отдельные справочники. Платформа предоставляет встроенное ХранилищеОбщихНастроек, работающее по ключевым строкам. В него можно записывать как структуры, так и ДвоичныеДанные.
  3. Подсистема «Работа с файлами» (БСП): В типовых конфигурациях (например, Управление торговлей 11, ERP, Комплексная автоматизация) уже встроен механизм БСП. Использование готового справочника Файлы предоставляет встроенное версионирование (справочник ВерсииФайлов), а также блокировку файла статусом ЗанятоПользователем для предотвращения одновременного редактирования несколькими пользователями.
← На главную