Как перенести данные реквизита ХранилищеЗначения между идентичными базами 1С:Бухгалтерия 3.0?

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

При переносе данных между информационными базами конфигурации 1С:Бухгалтерия 3.0 разработчики часто сталкиваются со сложностями, если реквизиты объектов имеют тип ХранилищеЗначения. В таких реквизитах могут храниться двоичные файлы, изображения, пользовательские настройки или произвольные структуры данных.

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

Использование правил обмена в Конвертации данных

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

Разберем по шагам, как настроить перенос реквизита типа ХранилищеЗначения:

  1. Создаем правила конвертации объектов (ПКО) для нужного справочника или документа.
  2. В правилах конвертации свойств (ПКС) сопоставляем реквизит с типом ХранилищеЗначения. Механизм конвертации данных автоматически сериализует содержимое хранилища при выгрузке и восстанавливает его в базе-приемнике.
  3. Если внутри хранилища находится объект, содержащий ссылки на другие элементы базы (например, ТаблицаЗначений со ссылочными колонками), убедимся, что сопоставляемые элементы метаданных выгружаются совместно с основным объектом.

Перенос данных через сериализацию XML и Base64

Посмотрим на пример выгрузки данных через встроенные механизмы XML-сериализации платформы 1С. Объект ХранилищеЗначения штатно кодируется в XML-формат Base64, если в нем находятся примитивные типы или двоичные данные.

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


ДвоичныеДанныеИзХранилища = ОбъектИсточник.РеквизитХранилище.Получить();
Если ТипЗнч(ДвоичныеДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда
    СтрокаBase64 = Base64Строка(ДвоичныеДанныеИзХранилища);
КонецЕсли;

На стороне базы-приемника выполним обратное декодирование строки Base64 и запишем результат в реквизит объекта:


ДвоичныеДанныеПриемник = Base64Значение(СтрокаBase64);
ОбъектПриемник.РеквизитХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеПриемник);
ОбъектПриемник.Записать();

Разберем также использование универсального механизма СериализаторXDTO совместно с объектом ЗаписьXML для выгрузки реквизита целиком:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектИсточник.РеквизитХранилище);
СтрокаXML = ЗаписьXML.Закрыть();

Прямой перенос через COM-соединение

Рассмотрим вариант, когда обе базы находятся в одной локальной сети. В этом случае можно установить прямое подключение через COMConnector без необходимости сохранения промежуточных файлов XML на диск.

Посмотрим на пример считывания и записи содержимого реквизита:


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

Важные нюансы и ограничения платформы

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

  1. Переполнение оперативной памяти: Если в хранилище находятся файлы большого размера (сотни мегабайт), их кодирование в текстовую строку XML Base64 существенно увеличивает объём данных и может привести к ошибке нехватки памяти (Out of memory).
  2. Устаревшие функции: Использование функции ВСтрокуВнутр является устаревшим подходом и не гарантирует корректность переносимых ссылок между независимыми базами.
  3. Особенности БСП и томов хранения: В конфигурациях на базе БСП (включая 1С:Бухгалтерия 3.0), если включено хранение файлов в томах на диске, сам реквизит ХранилищеЗначения содержит лишь техническую информацию. В этом случае потребуется также скопировать физические файлы из каталогов томов источника в каталог приемника.
← На главную