Как программно присоединить файл к документу в 1С?

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

В типовых конфигурациях 1С (УТ 11, ERP, БП 3.0 и др.) существует стандартный механизм «Присоединенные файлы», который доступен пользователям через команду «Перейти» или соответствующую гиперссылку на форме. Однако часто возникает задача автоматизировать этот процесс: например, программно сформировать печатную форму в формате PDF и сразу прикрепить её к документу или загрузить файлы из определенной папки на диске. Рассмотрим подробно, как это реализовать, используя возможности платформы и Библиотеки стандартных подсистем (БСП).

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

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

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

Решение для современных конфигураций (БСП 3.0 и выше)

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

Предположим, у нас уже есть сформированный ТабличныйДокумент (например, если в него добавлены факсимиле подписей ответственных лиц), который мы хотим сохранить как PDF и прикрепить к документу-владельцу. Разберем процесс по шагам:


// 1. Формируем временный файл на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);

// 2. Читаем данные файла в двоичный формат и помещаем во временное хранилище
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

// 3. Подготавливаем параметры для БСП
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.Автор = ПараметрыСеанса.ТекущийПользователь;
ПараметрыФайла.ВладелецФайлов = СсылкаНаОбъект; // Ссылка на ваш документ
ПараметрыФайла.ИмяБезРасширения = "Печатная форма документа";
ПараметрыФайла.РасширениеБезТочки = "pdf";

// 4. Вызываем программный интерфейс БСП для создания файла (перед этим возможна установка штампа или подписи в PDF)
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВХранилище);

// 5. Очищаем за собой временный файл
УдалитьФайлы(ИмяВременногоФайла);

Важный нюанс: Обратите внимание, что метод РаботаСФайлами.ДобавитьФайл является предпочтительным. Попытки использовать РаботаСФайлами.ДобавитьФайлСДиска для обычных документов часто приводят к ошибкам типа «Не заполнен владелец», так как эта функция предназначена для работы с общим справочником Файлы (используется в задачах и бизнес-процессах), а не с индивидуальными справочниками присоединенных файлов документов.

Прикрепление существующего файла с диска

Если файл уже существует на диске (например, скан в формате Excel или PDF), алгоритм немного упрощается. Нам не нужно записывать табличный документ, достаточно просто прочитать файл по указанному пути.

Проанализируем пример функции для прикрепления файла PDF из конкретного каталога:


&НаСервере
Процедура ПрикрепитьФайлСДискаНаСервере(ПутьКФайлу, СсылкаНаДокумент)
    
    // Проверяем существование файла
    ФайлНаДиске = Новый Файл(ПутьКФайлу);
    Если Не ФайлНаДиске.Существует() Тогда
        Возврат;
    КонецЕсли;

    // Читаем данные в память
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

    // Заполняем структуру параметров
    ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
    ПараметрыФайла.ВладелецФайлов = СсылкаНаДокумент;
    ПараметрыФайла.ИмяБезРасширения = ФайлНаДиске.ИмяБезРасширения;
    ПараметрыФайла.РасширениеБезТочки = "pdf";
    ПараметрыФайла.Автор = ПараметрыСеанса.ТекущийПользователь;

    // Добавляем файл через БСП
    РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВХранилище);
    
КонецПроцедуры

Тонкости и рекомендации по реализации

Выясним причины, по которым код может не срабатывать или работать некорректно, и как этого избежать:

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

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

← На главную