При автоматизации бизнес-процессов в 1С:Документооборот часто возникает задача создания документов на основе шаблонов. Однако при программном создании ВнутреннегоДокумента с использованием метода ЗаполнитьРеквизитыДокументаПоШаблону мы сталкиваемся с тем, что файлы, прикрепленные к шаблону, не переносятся в созданный документ автоматически. Разберем, как правильно решить эту задачу, учитывая архитектуру системы.
Важно помнить, что в 1С:Документооборот файлы — это не просто ХранилищеЗначения в реквизите объекта. Все файлы являются самостоятельными элементами справочника Файлы. Система использует подсистему РаботаСФайлами, которая обеспечивает версионирование, права доступа и хранение (в базе или в томах). Попытки прямого копирования двоичных данных в реквизиты приведут к тому, что документ будет лишен функционала Документооборота (редактирование, история версий, электронная подпись).
Для корректного прикрепления файлов необходимо выполнить последовательность действий через методы подсистемы РаботаСФайлами. Рассмотрим алгоритм действий:
ВнутреннегоДокумента и заполнение его реквизитов из шаблона.ШаблонВнутреннегоДокумента.СоздатьФайлНаОсновеФайлаНаДиске или аналогичных методов модуля РаботаСФайламиВнешнийВызов для связки файла с новым документом.Проанализируем процедуру создания документа. После того как вы записали новый объект ВнутреннийДокумент, вы можете обратиться к файлам шаблона. Обратите внимание, что стандартная процедура ЗаполнитьФайлыДокументаПоШаблону может не сработать напрямую, так как она ожидает специфические параметры контекста.
Наиболее надежный путь — это перебор всех файлов, владельцем которых является ваш Шаблон, и создание новых записей в справочнике Файлы, где владельцем будет выступать ссылка на ваш новый документ.
Рассмотрим пример логики работы:
// Сначала создаем документ
НовыйДок = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
НовыйДок.Шаблон = Шаблон;
ШаблоныДокументов.ЗаполнитьРеквизитыДокументаПоШаблону(Шаблон, НовыйДок);
НовыйДок.Записать();
// Получаем список файлов шаблона
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Файлы ГДЕ Владелец = &Шаблон";
Запрос.УстановитьПараметр("Шаблон", Шаблон);
Результат = Запрос.Выполнить().Выбрать();
// Присоединяем каждый файл
Пока Результат.Следующий() Цикл
// Используем методы подсистемы РаботаСФайлами
РаботаСФайламиВнешнийВызов.КопироватьФайл(Результат.Ссылка, НовыйДок.Ссылка);
КонецЦикла;
При разработке данной функциональности, учитывайте следующие критические моменты:
НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это гарантирует, что при сбое во время копирования файла вы не получите «битый» документ.Файлы.1С:Документооборота. Всегда ищите функции в модулях РаботаСФайлами или РаботаСФайламиВнешнийВызов. Это обеспечит корректную работу с томами хранения, если они настроены в вашей базе.Следуя этим рекомендациям, вы сможете автоматизировать процесс создания документов, сохранив все возможности платформы по работе с версиями и хранением файлов. Для быстрой реализации аналогичной логики при обработке входящей почты можно использовать обработчик бизнес-событий для создания документов и прикрепления файлов.