Перенос данных между идентичными конфигурациями 1С — задача, казалось бы, тривиальная, особенно при использовании универсальных инструментов. Однако стандартная обработка ВыгрузкаЗагрузкаДанныхXML иногда ограничивает возможности маневра, поэтому в ряде случаев лучше использовать адаптивную выгрузку и загрузку данных XML с гибкими отборами (есть готовая обмен данными XML с гибкими отборами и COM), которая позволяет более тонко настраивать процесс обмена. Часто при переносе присоединенных файлов (сканов договоров, изображений товаров, документов) специалисты сталкиваются с ситуацией: карточка файла в базе-приемнике появляется, но при попытке открытия программа выдает ошибку, сообщая об отсутствии данных. Сам файл физически не открывается.
В этой статье мы подробно разберем, как устроена подсистема хранения файлов в современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем), почему возникает эта ошибка и какие существуют надежные способы переноса файлового архива.
Давайте проанализируем, как 1С хранит файлы. В старых конфигурациях файлы часто хранились в реквизите типа ХранилищеЗначения непосредственно в справочнике файлов. В современных решениях (БП 3.0, УТ 11, ERP, ЗУП 3.0 и отраслевых решениях на их основе) архитектура стала сложнее и модульной. Чтобы разобраться в физическом расположении данных на уровне СУБД, можно изучить структуру хранения базы данных, что поможет понять взаимосвязи таблиц.
Когда вы отмечаете в обработке выгрузки справочник, например, ДоговорыКонтрагентовПрисоединенныеФайлы, вы переносите только метаданные файла:
Сами же двоичные данные (тело файла) часто лежат совершенно в других объектах метаданных, связанных с этим справочником неочевидными ссылками. Если не добавить эти связанные объекты в выгрузку, вы получите "пустышку" — карточку файла без содержимого.
Чтобы успешно перенести файлы, нам нужно понять, где именно лежат данные. В зависимости от версии БСП и истории обновлений базы, данные могут находиться в разных местах. Рассмотрим основные варианты.
Это самый распространенный вариант по умолчанию. Структура хранения выглядит следующим образом:
НоменклатураПрисоединенныеФайлы). Хранит заголовок и настройки.ДвоичныеДанныеФайлов). Именно здесь, в реквизите типа ХранилищеЗначения, лежат зашифрованные байты вашего файла (изображения, PDF и т.д.).Важный нюанс: В старых версиях или после обновления конфигурации могут встречаться объекты с префиксом Удалить... (например, УдалитьДвоичныеДанныеФайлов). Иногда данные могут "застрять" там, если процедура реструктуризации не прошла до конца.
Если в настройках базы включено "Хранить файлы в томах на диске" (поможет перенос файлов из базы 1С в тома на диске), то в базе данных хранятся только пути к файлам (например, D:\1C_Files\Volume1\2023\...\file.pdf). Сами файлы лежат в папке Windows (или Linux).
Если ваши файлы хранятся непосредственно в базе данных, и вы хотите использовать универсальную обработку обмена, необходимо вручную выбрать все связанные объекты. В ситуациях, когда требуется дополнительная защита данных при передаче, может быть полезна универсальная выгрузка и загрузка данных с возможностью шифрования. Давайте разберем алгоритм действий.
При настройке выгрузки в источнике обязательно отметьте следующие объекты:
ДоговорыКонтрагентовПрисоединенныеФайлы.Совет по диагностике: Если вы не знаете точно, где лежат данные, откройте конфигуратор или используйте функцию "Поиск ссылок на объект" в режиме Предприятия на конкретном присоединенном файле. Посмотрите, какие регистры ссылаются на карточку файла.
Если после переноса файл не открывается, проверьте регистр ХранилищеФайлов в базе-приемнике. Если он пуст или в нем нет записей для конкретного файла, значит, связь разорвана.
Перенос двоичных данных через XML (Base64) — плохая идея для больших баз. XML-файл получается огромным, процесс потребляет много оперативной памяти. Однако для общего архива документов более надежный и быстрый способ — использование файловых томов.
Рассмотрим этот метод пошагово:
В исходной базе зайдите в раздел Администрирование — Настройки работы с файлами.
C:\1C_Volumes\Source).Скопируйте папку с файлами (C:\1C_Volumes\Source) с сервера источника на сервер приемника (например, в D:\1C_Volumes\Target).
Теперь используйте обработку ВыгрузкаЗагрузкаДанныхXML. Выгружайте только справочники ...ПрисоединенныеФайлы. Регистры с двоичными данными выгружать не нужно, так как данных там уже нет — они на диске.
D:\1C_Volumes\Target).Этот метод гарантирует, что "битых" файлов не будет, так как вы копируете их средствами операционной системы.
Если по каким-то причинам файлы не переносятся стандартными средствами, можно написать небольшую обработку. Для реализации этой задачи рекомендуем использовать справочник по методам БСП с примерами использования, который поможет быстро найти нужные функции для работы с файлами.
Логика работы такой обработки (псевдокод):
РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл).Пример получения данных через функцию общего модуля (на стороне источника):
// Пример кода для понимания логики получения данных
Попытка
// Используем штатный метод БСП, который сам знает, где лежат данные
ДанныеФайла = РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);
Если ДанныеФайла <> Неопределено Тогда
// ДанныеФайла - это ДвоичныеДанные, которые можно сохранить на диск или передать
КонецЕсли;
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
КонецПопытки;
Если вы уже перенесли данные и столкнулись с ошибкой открытия, необходимо проверить целостность ссылок.
Откройте справочник присоединенных файлов (через "Функции для технического специалиста"). Найдите проблемный файл. Проверьте реквизит ТипХраненияФайла.
Если вы уверены, что выгрузили все регистры, но данных нет, проверьте следующие объекты в конфигураторе:
РегистрСведений.ДвоичныеДанныеФайловСправочник.ВерсииФайлов (данные могут быть привязаны к версии)РегистрСведений.ХранилищеФайловВ сложных случаях всегда надежнее использовать Способ №2 (через тома), так как штатная процедура переноса в тома точно знает, откуда забирать данные, независимо от специфики конфигурации.
Для успешного переноса присоединенных файлов:
ХранилищеФайлов, ДвоичныеДанныеФайлов, ВерсииФайлов и ХранилищеДвоичныхДанных.