Как программно перенести прикрепленные файлы из документа в справочник?

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

В процессе развития конфигурации 1С часто возникает необходимость изменить тип объекта для хранения данных. Например, когда объект, изначально созданный как Документ, перерастает свои функции и должен стать Справочником (как в нашем случае — «Каталог решений»). Основная сложность при такой миграции заключается не в переносе реквизитов, а в сохранении привязки присоединенных файлов. Давайте разберем, как реализовать этот процесс программно, учитывая архитектуру типовых конфигураций на базе БСП.

Понимание архитектуры присоединенных файлов

В современных конфигурациях, таких как 1С:УНФ, файлы хранятся не «внутри» документа, а через специализированный механизм БСП (Библиотеки стандартных подсистем). Для реализации этой логики система использует:

  1. Справочник-владелец: Объект, к которому прикреплен файл (в нашем случае — «Решение задачи»).
  2. Справочник «Присоединенные файлы»: Содержит метаданные файла (имя, расширение, автор, дата создания) и ссылку на данные.
  3. Справочник «Версии файлов»: Содержит непосредственно двоичные данные или ссылку на том хранения.

Важно понимать, что связь файла с документом определяется реквизитом Владелец в справочнике присоединенных файлов. Следовательно, для переноса нам не нужно копировать сами двоичные данные, достаточно переназначить владельца.

Алгоритм переноса файлов

Разберем процесс по шагам. Мы будем перебирать старые документы, создавать новые элементы справочника «Каталог решений» и перепривязывать к ним файлы.

  1. Выборка объектов: Получаем выборку всех документов «Решение задачи», подлежащих переносу.
  2. Поиск присоединенных файлов: Для каждого документа ищем связанные с ним файлы в справочнике присоединенных файлов.
  3. Перепривязка владельца: Меняем значение реквизита Владелец у найденных файлов на ссылку нового элемента справочника.
  4. Обновление ссылочной целостности: Актуализируем записи в регистрах сведений (например, НаличиеФайлов), если это требуется для корректной работы интерфейса.

Пример программной реализации

Рассмотрим пример кода, который помогает выполнить перепривязку. Предположим, что у нас есть старая ссылка СтарыйВладелец и новая ссылка НовыйВладелец.


// Предположим, что справочник присоединенных файлов называется ФайлыДокумента
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ФайлыДокумента.Ссылка КАК Файл
    |ИЗ
    |    Справочник.ФайлыДокумента КАК ФайлыДокумента
    |ГДЕ
    |    ФайлыДокумента.Владелец = &СтарыйВладелец";

Запрос.УстановитьПараметр("СтарыйВладелец", СтарыйВладелец);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    ОбъектФайл = Выборка.Файл.ПолучитьОбъект();
    ОбъектФайл.Владелец = НовыйВладелец;
    ОбъектФайл.Записать();
КонецЦикла;

Важные нюансы при переносе

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

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

← На главную