При переносе данных между информационными базами конфигурации 1С:Бухгалтерия 3.0 разработчики часто сталкиваются со сложностями, если реквизиты объектов имеют тип ХранилищеЗначения. В таких реквизитах могут храниться двоичные файлы, изображения, пользовательские настройки или произвольные структуры данных.
Проанализируем ситуацию: стандартная выгрузка не всегда очевидно отрабатывает с содержимым объекта ХранилищеЗначения. Выясним причину и подробно разберем доступные и проверенные способы переноса данных между идентичными информационными базами.
Рассмотрим первый и самый универсальный способ переноса — использование специализированной конфигурации 1С:Конвертация данных.
Разберем по шагам, как настроить перенос реквизита типа ХранилищеЗначения:
ХранилищеЗначения. Механизм конвертации данных автоматически сериализует содержимое хранилища при выгрузке и восстанавливает его в базе-приемнике.ТаблицаЗначений со ссылочными колонками), убедимся, что сопоставляемые элементы метаданных выгружаются совместно с основным объектом.Посмотрим на пример выгрузки данных через встроенные механизмы XML-сериализации платформы 1С. Объект ХранилищеЗначения штатно кодируется в XML-формат Base64, если в нем находятся примитивные типы или двоичные данные.
Рассмотрим пример кода для извлечения двоичных данных из хранилища источника и кодирования их в строку Base64:
ДвоичныеДанныеИзХранилища = ОбъектИсточник.РеквизитХранилище.Получить();
Если ТипЗнч(ДвоичныеДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда
СтрокаBase64 = Base64Строка(ДвоичныеДанныеИзХранилища);
КонецЕсли;
На стороне базы-приемника выполним обратное декодирование строки Base64 и запишем результат в реквизит объекта:
ДвоичныеДанныеПриемник = Base64Значение(СтрокаBase64);
ОбъектПриемник.РеквизитХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеПриемник);
ОбъектПриемник.Записать();
Разберем также использование универсального механизма СериализаторXDTO совместно с объектом ЗаписьXML для выгрузки реквизита целиком:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектИсточник.РеквизитХранилище);
СтрокаXML = ЗаписьXML.Закрыть();
Рассмотрим вариант, когда обе базы находятся в одной локальной сети. В этом случае можно установить прямое подключение через COMConnector без необходимости сохранения промежуточных файлов XML на диск.
Посмотрим на пример считывания и записи содержимого реквизита:
ДвоичныеДанныеФайла = СоединениеИсточник.ВыполнитьПолучениеДанных(СсылкаНаОбъект);
Если ДвоичныеДанныеФайла <> Неопределено Тогда
ОбъектПриемник.РеквизитХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
ОбъектПриемник.Записать();
КонецЕсли;
Проанализируем ключевые особенности, о которых необходимо помнить при перегрузке реквизитов типа ХранилищеЗначения:
Out of memory).ВСтрокуВнутр является устаревшим подходом и не гарантирует корректность переносимых ссылок между независимыми базами.ХранилищеЗначения содержит лишь техническую информацию. В этом случае потребуется также скопировать физические файлы из каталогов томов источника в каталог приемника.