Перенос справочника номенклатуры между одинаковыми конфигурациями «1С:Управление торговлей 11» кажется тривиальной задачей до тех пор, пока дело не доходит до изображений. Часто программисты сталкиваются с ситуацией: справочник НоменклатураПрисоединенныеФайлы успешно перенесен, ссылки в карточке товара присутствуют, но при попытке открыть картинку система выдает ошибку: «Файл не найден в хранилище файлов». Рассмотрим подробнее, почему это происходит и как настроить корректную конвертацию данных.
Для начала проанализируем, как именно реализовано хранение файлов в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). Ошибка «Файл не найден» возникает из-за того, что в 1С:УТ 11 информация о файле разделена на несколько составляющих, которые хранятся в разных местах информационной базы. Простая выгрузка справочника присоединенных файлов переносит только «карточку» файла (метаданные), но не сами двоичные данные (байты картинки).
В типовом решении задействованы следующие объекты:
ДанныеФайла (тип ХранилищеЗначения) лежат реальные данные картинки, если выбран тип хранения «В информационной базе».Если мы перенесем только первый пункт, ссылка в базе появится, но «наполнения» у нее не будет. Поэтому при открытии формы 1С пытается обратиться к регистру или к тому на диске, не находит там данных и выводит ошибку.
Выясним причину неудачи: при использовании «Конвертации данных 2.1» программисты часто забывают создать правило выгрузки данных (ПВД) для регистра ДвоичныеДанныеФайлов. Чтобы изображения «ожили», необходимо выполнить следующие действия в базе-источнике:
ДвоичныеДанныеФайлов.Файл (которое является ссылкой на присоединенный файл) сопоставляется корректно.Проанализируем ситуацию, если файлов очень много. Выгрузка огромного регистра через XML может привести к ошибке нехватки памяти (Out of memory). В этом случае рекомендуется выгружать данные порциями или использовать обработчики для программного извлечения данных.
Как было отмечено в обсуждении, работа с файлами в коде 1С завязана на специализированные функции. Посмотрим на пример кода, который вызывается системой при интерактивном добавлении файла:
Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
РаботаСФайламиСлужебный.ЗаписатьФайлВИнформационнуюБазу(НоваяСсылкаНаФайл, ДвоичныеДанные);
КонецЕсли;
Для того чтобы при загрузке данных в целевую базу файл корректно «прописался» во всех регистрах, мы можем воспользоваться обработчиком «После загрузки» в правилах конвертации объекта НоменклатураПрисоединенныеФайлы.
Рассмотрим алгоритм действий в обработчике:
Важно помнить, что в новых версиях БСП метод ЗаписатьФайлВИнформационнуюБазу может быть скрыт во внутренние модули, поэтому лучше использовать программный интерфейс общего модуля РаботаСФайлами.
Разберем ситуацию, когда в базе включена опция «Хранить файлы в томах на диске». В этом случае ДвоичныеДанныеФайлов будут пустыми, а в справочнике присоединенных файлов в реквизите ТипХраненияФайла будет стоять значение ВТомахНаДиске.
Проанализируем необходимые действия для этого сценария:
ТомаХраненияФайлов.ТомаХраненияФайлов и обновить «Полный путь» для каждого тома (отдельно для Windows и, если актуально, для Linux).Без соответствия путей в справочнике и реального расположения файлов на диске, система продолжит выдавать ошибку отсутствия файла, даже если вы перенесли все записи справочников.
При работе с изображениями через «Конвертацию данных» советуем придерживаться следующих правил, чтобы избежать типичных ошибок:
ТекущаяВерсия в справочнике присоединенных файлов. Если оно ссылается на «битую» ссылку (несуществующую версию), картинка не отобразится.Расширение заполнен (например, "jpg" или "png"). 1С использует его для определения способа визуализации двоичных данных.Таким образом, для успешного переноса изображений номенклатуры в УТ 11 недостаточно просто перенести один справочник. Необходимо обеспечить связку между Присоединенными файлами, их Версиями и Двоичными данными в регистре или на диске. Только комплексный перенос этих трех составляющих гарантирует корректную работу системы после миграции данных.