Как правильно перенести присоединенные файлы между конфигурациями 1С, если стандартная выгрузка переносит только ссылки?

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

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

В этой статье мы подробно разберем, как устроена подсистема хранения файлов в современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем), почему возникает эта ошибка и какие существуют надежные способы переноса файлового архива.

Понимание проблемы: почему файлы не переносятся "сами"?

Давайте проанализируем, как 1С хранит файлы. В старых конфигурациях файлы часто хранились в реквизите типа ХранилищеЗначения непосредственно в справочнике файлов. В современных решениях (БП 3.0, УТ 11, ERP, ЗУП 3.0 и отраслевых решениях на их основе) архитектура стала сложнее и модульной. Чтобы разобраться в физическом расположении данных на уровне СУБД, можно изучить структуру хранения базы данных, что поможет понять взаимосвязи таблиц.

Когда вы отмечаете в обработке выгрузки справочник, например, ДоговорыКонтрагентовПрисоединенныеФайлы, вы переносите только метаданные файла:

Сами же двоичные данные (тело файла) часто лежат совершенно в других объектах метаданных, связанных с этим справочником неочевидными ссылками. Если не добавить эти связанные объекты в выгрузку, вы получите "пустышку" — карточку файла без содержимого.

Анализ архитектуры хранения файлов в БСП

Чтобы успешно перенести файлы, нам нужно понять, где именно лежат данные. В зависимости от версии БСП и истории обновлений базы, данные могут находиться в разных местах. Рассмотрим основные варианты.

1. Хранение в информационной базе

Это самый распространенный вариант по умолчанию. Структура хранения выглядит следующим образом:

  1. Справочник "ПрисоединенныеФайлы" (например, НоменклатураПрисоединенныеФайлы). Хранит заголовок и настройки.
  2. Регистр сведений "ХранилищеФайлов" (или аналогичный). Это связующее звено. Измерением обычно выступает ссылка на справочник присоединенных файлов (владелец), а ресурсом — ссылка на место физического хранения данных.
  3. Справочник "ХранилищеДвоичныхДанных" (или регистр сведений ДвоичныеДанныеФайлов). Именно здесь, в реквизите типа ХранилищеЗначения, лежат зашифрованные байты вашего файла (изображения, PDF и т.д.).

Важный нюанс: В старых версиях или после обновления конфигурации могут встречаться объекты с префиксом Удалить... (например, УдалитьДвоичныеДанныеФайлов). Иногда данные могут "застрять" там, если процедура реструктуризации не прошла до конца.

2. Хранение в томах на диске

Если в настройках базы включено "Хранить файлы в томах на диске" (поможет перенос файлов из базы 1С в тома на диске), то в базе данных хранятся только пути к файлам (например, D:\1C_Files\Volume1\2023\...\file.pdf). Сами файлы лежат в папке Windows (или Linux).

Способ №1: Перенос с помощью "ВыгрузкаЗагрузкаДанныхXML" (если файлы в базе)

Если ваши файлы хранятся непосредственно в базе данных, и вы хотите использовать универсальную обработку обмена, необходимо вручную выбрать все связанные объекты. В ситуациях, когда требуется дополнительная защита данных при передаче, может быть полезна универсальная выгрузка и загрузка данных с возможностью шифрования. Давайте разберем алгоритм действий.

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

  1. Справочник владельца файлов: Например, ДоговорыКонтрагентовПрисоединенныеФайлы.
  2. Регистр сведений "ПрисоединенныеФайлы" или "НаличиеФайлов": В некоторых конфигурациях он отвечает за флаг наличия файла.
  3. Регистр сведений "ХранилищеФайлов": Проверьте наличие этого регистра. Он критически важен.
  4. Справочник "ХранилищеДвоичныхДанных": Без него перенесутся ссылки, указывающие "в никуда".
  5. Регистр сведений "ДвоичныеДанныеФайлов": В более новых версиях БСП данные переехали сюда из справочника.

Совет по диагностике: Если вы не знаете точно, где лежат данные, откройте конфигуратор или используйте функцию "Поиск ссылок на объект" в режиме Предприятия на конкретном присоединенном файле. Посмотрите, какие регистры ссылаются на карточку файла.

Если после переноса файл не открывается, проверьте регистр ХранилищеФайлов в базе-приемнике. Если он пуст или в нем нет записей для конкретного файла, значит, связь разорвана.

Способ №2: Перенос через Тома (Рекомендуемый для больших объемов)

Перенос двоичных данных через XML (Base64) — плохая идея для больших баз. XML-файл получается огромным, процесс потребляет много оперативной памяти. Однако для общего архива документов более надежный и быстрый способ — использование файловых томов.

Рассмотрим этот метод пошагово:

Шаг 1. Перенос файлов в тома в базе-источнике

В исходной базе зайдите в раздел Администрирование — Настройки работы с файлами.

  1. Создайте новый Том хранения файлов (укажите папку на диске сервера, например C:\1C_Volumes\Source).
  2. Нажмите кнопку или запустите регламентное задание "Перенос файлов в тома".
  3. Дождитесь окончания процесса. Теперь база данных "похудела", а все файлы лежат в папке в обычном виде.

Шаг 2. Копирование файлов

Скопируйте папку с файлами (C:\1C_Volumes\Source) с сервера источника на сервер приемника (например, в D:\1C_Volumes\Target).

Шаг 3. Перенос справочников

Теперь используйте обработку ВыгрузкаЗагрузкаДанныхXML. Выгружайте только справочники ...ПрисоединенныеФайлы. Регистры с двоичными данными выгружать не нужно, так как данных там уже нет — они на диске.

Шаг 4. Настройка в базе-приемнике

  1. Загрузите XML с данными о файлах.
  2. В базе-приемнике зайдите в справочник Тома хранения файлов.
  3. Скорее всего, там перенесется запись о томе с путем источника. Измените путь на актуальный для сервера приемника (D:\1C_Volumes\Target).

Этот метод гарантирует, что "битых" файлов не будет, так как вы копируете их средствами операционной системы.

Способ №3: Программное восстановление или перенос (COM-соединение)

Если по каким-то причинам файлы не переносятся стандартными средствами, можно написать небольшую обработку. Для реализации этой задачи рекомендуем использовать справочник по методам БСП с примерами использования, который поможет быстро найти нужные функции для работы с файлами.

Логика работы такой обработки (псевдокод):

  1. Подключаемся к базе-источнике через COM-соединение (V83.COMConnector).
  2. Выбираем в источнике нужные элементы справочника присоединенных файлов.
  3. Для каждого файла используем функцию БСП источника РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл).
  4. В базе-приемнике находим (или создаем) соответствующий элемент справочника.
  5. Записываем полученные данные в приемник, используя аналогичный метод или напрямую через реквизиты, если структура известна.

Пример получения данных через функцию общего модуля (на стороне источника):


// Пример кода для понимания логики получения данных
Попытка
    // Используем штатный метод БСП, который сам знает, где лежат данные
    ДанныеФайла = РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);
    Если ДанныеФайла <> Неопределено Тогда
        // ДанныеФайла - это ДвоичныеДанные, которые можно сохранить на диск или передать
    КонецЕсли;
Исключение
    Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
КонецПопытки;

Диагностика ошибок после переноса

Если вы уже перенесли данные и столкнулись с ошибкой открытия, необходимо проверить целостность ссылок.

1. Проверка типа хранения

Откройте справочник присоединенных файлов (через "Функции для технического специалиста"). Найдите проблемный файл. Проверьте реквизит ТипХраненияФайла.

2. Поиск "потерянных" данных

Если вы уверены, что выгрузили все регистры, но данных нет, проверьте следующие объекты в конфигураторе:

В сложных случаях всегда надежнее использовать Способ №2 (через тома), так как штатная процедура переноса в тома точно знает, откуда забирать данные, независимо от специфики конфигурации.

Резюме

Для успешного переноса присоединенных файлов:

  1. Избегайте переноса двоичных данных внутри XML при больших объемах.
  2. Лучший способ — переключить хранение на "В томах на диске", перенести папки вручную, а через XML перекинуть только ссылки.
  3. Если перенос в тома невозможен, убедитесь, что в состав выгрузки включены ВСЕ служебные регистры: ХранилищеФайлов, ДвоичныеДанныеФайлов, ВерсииФайлов и ХранилищеДвоичныхДанных.
← На главную