В типовых конфигурациях 1С (УТ 11, ERP, БП 3.0 и др.) существует стандартный механизм «Присоединенные файлы», который доступен пользователям через команду «Перейти» или соответствующую гиперссылку на форме. Однако часто возникает задача автоматизировать этот процесс: например, программно сформировать печатную форму в формате PDF и сразу прикрепить её к документу или загрузить файлы из определенной папки на диске. Рассмотрим подробно, как это реализовать, используя возможности платформы и Библиотеки стандартных подсистем (БСП).
Прежде чем переходить к коду, проанализируем, как 1С хранит эти данные. В современных конфигурациях для каждого объекта (например, Документ.РеализацияТоваровУслуг) создается отдельный справочник, например, Справочник.РеализацияТоваровУслугПрисоединенныеФайлы. Владельцем элементов этого справочника является сам документ.
Механизм БСП предоставляет программный интерфейс, который скрывает сложность создания записей в этих справочниках и физического размещения файла (в базе данных или в томах на диске). Мы будем опираться именно на этот универсальный подход.
Рассмотрим наиболее правильный и надежный способ добавления файла через модуль РаботаСФайлами. Этот метод автоматически учитывает настройки версионирования, права доступа и места хранения.
Предположим, у нас уже есть сформированный ТабличныйДокумент (например, если в него добавлены факсимиле подписей ответственных лиц), который мы хотим сохранить как PDF и прикрепить к документу-владельцу. Разберем процесс по шагам:
// 1. Формируем временный файл на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
// 2. Читаем данные файла в двоичный формат и помещаем во временное хранилище
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
// 3. Подготавливаем параметры для БСП
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.Автор = ПараметрыСеанса.ТекущийПользователь;
ПараметрыФайла.ВладелецФайлов = СсылкаНаОбъект; // Ссылка на ваш документ
ПараметрыФайла.ИмяБезРасширения = "Печатная форма документа";
ПараметрыФайла.РасширениеБезТочки = "pdf";
// 4. Вызываем программный интерфейс БСП для создания файла (перед этим возможна установка штампа или подписи в PDF)
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВХранилище);
// 5. Очищаем за собой временный файл
УдалитьФайлы(ИмяВременногоФайла);
Важный нюанс: Обратите внимание, что метод РаботаСФайлами.ДобавитьФайл является предпочтительным. Попытки использовать РаботаСФайлами.ДобавитьФайлСДиска для обычных документов часто приводят к ошибкам типа «Не заполнен владелец», так как эта функция предназначена для работы с общим справочником Файлы (используется в задачах и бизнес-процессах), а не с индивидуальными справочниками присоединенных файлов документов.
Если файл уже существует на диске (например, скан в формате Excel или PDF), алгоритм немного упрощается. Нам не нужно записывать табличный документ, достаточно просто прочитать файл по указанному пути.
Проанализируем пример функции для прикрепления файла PDF из конкретного каталога:
&НаСервере
Процедура ПрикрепитьФайлСДискаНаСервере(ПутьКФайлу, СсылкаНаДокумент)
// Проверяем существование файла
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если Не ФайлНаДиске.Существует() Тогда
Возврат;
КонецЕсли;
// Читаем данные в память
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
// Заполняем структуру параметров
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = СсылкаНаДокумент;
ПараметрыФайла.ИмяБезРасширения = ФайлНаДиске.ИмяБезРасширения;
ПараметрыФайла.РасширениеБезТочки = "pdf";
ПараметрыФайла.Автор = ПараметрыСеанса.ТекущийПользователь;
// Добавляем файл через БСП
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВХранилище);
КонецПроцедуры
Выясним причины, по которым код может не срабатывать или работать некорректно, и как этого избежать:
ПрисоединенныеФайлы.ТипСправочникаПрисоединенныхФайлов(ВладелецФайлов). Если возвращается Неопределено, значит, справочник присоединенных файлов не создан или не подключен в метаданных.ПараметрыСеанса.ТекущийПользователь может быть не заполнено. В этом случае необходимо явно указывать ссылку на пользователя (например, системного администратора), который будет значиться автором файла.РаботаСФайлами.УникальноеИмяФайлаВладельца().ДобавитьФайл сам определит, куда положить данные, но при отсутствии прав доступа возникнет системная ошибка.УдалитьФайлы() после помещения данных в хранилище. Это предотвратит разрастание временных папок на сервере 1С.Рассмотренные подходы позволяют гибко управлять документацией внутри системы, обеспечивая целостность данных и соблюдение стандартов разработки 1С. Мы рекомендуем всегда отдавать предпочтение методам БСП, так как они гарантируют корректное обновление системы в будущем и правильную работу всех сопутствующих механизмов (версионирование, ЭЦП, шифрование).