При работе с информационными системами 1С часто возникает необходимость автоматизировать рутинные задачи, одной из которых является программное прикрепление файлов к различным объектам конфигурации, таким как документы, справочники или задачи. Мы рассмотрим, как реализовать эту функциональность в системе 1С:Документооборот 3.0, основываясь на рекомендациях опытных разработчиков и используя встроенные механизмы платформы 1С:Предприятие и возможности БСП.
Задача программного прикрепления файла особенно актуальна при интеграции с внешними системами, массовой загрузке данных или создании специализированных обработок, которые формируют и прикрепляют отчеты или другие файлы без участия пользователя. В конфигурации 1С:Документооборот этот процесс имеет свои особенности, связанные с архитектурой работы с файлами, в том числе и использованием условий для шаблонов файлов в документах.
Для начала, давайте выясним основные принципы, лежащие в основе механизма присоединенных файлов в 1С. Важно понимать, что прямое создание элементов справочника Файлы, хотя и возможно, является лишь частью решения и не обеспечивает полной интеграции с системой учета файлов — здесь поможет универсальный инструмент управления прикрепленными файлами. Система 1С, особенно конфигурации на базе БСП, такие как 1С:Документооборот, используют специализированные общие модули и функции для корректной работы с файлами. Эти механизмы не только создают запись в справочнике Файлы, но и обеспечивают сохранение двоичных данных файла в хранилище, а также поддерживают версионирование и контроль доступа.
Наш подход будет заключаться в использовании этих специализированных механизмов для обеспечения надежности и корректной работы с файлами.
Рассмотрим подробный алгоритм действий и необходимые фрагменты кода для программного прикрепления файла к объекту (например, документу ВходящийДокумент) в 1С:Документооборот 3.0 — для обратной задачи есть обработка массовой выгрузки файлов из 1С:Документооборот 3.0. Мы разберем как клиентское, так и серверное взаимодействие, поскольку файл может находиться как на локальном диске пользователя, так и быть уже доступным на сервере.
Прежде чем прикрепить файл, нам нужно получить его содержимое в виде двоичных данных. Это универсальный формат для работы с файлами в 1С. Если файл находится на локальном диске пользователя, нам потребуется путь к нему. Если файл уже где-то хранится (например, получен по сети или из другого источника), мы можем сразу работать с его двоичными данными.
Для получения двоичных данных файла с диска используем объект ДвоичныеДанные:
// Предполагаем, что "ИмяФайлаНаДиске" - это полный путь к файлу на локальном компьютере пользователя.
// Например: "C:\МоиДокументы\Отчет.pdf"
ИмяФайлаНаДиске = "C:\МоиДокументы\Отчет.pdf";
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаНаДиске);
Важно помнить, что этот код выполняется на клиенте, если файл находится на клиентском компьютере. Для передачи этих данных на сервер для дальнейшей обработки потребуется механизм временного хранилища.
В конфигурации 1С:Документооборот (и в других конфигурациях на БСП) не рекомендуется напрямую манипулировать справочником Файлы. Вместо этого следует использовать общие модули, предоставляемые конфигурацией. Например, при настройке системы часто используется групповая проверка скриптов и параметров заполнения файлов, что подтверждает сложность внутренней структуры хранения.
Для 1С:Документооборот 3.0 основным модулем для работы с файлами является ФайлыДокументооборота. Он содержит функции, которые позволяют корректно создавать и прикреплять файлы к объектам. Рассмотрим функцию СоздатьНовыйФайлДляОбъекта.
Эта функция ожидает структуру параметров, в которой мы передаем всю необходимую информацию о файле и его владельце. Давайте подготовим эту структуру.
// ВладелецФайла - ссылка на документ, к которому прикрепляем файл (например, СсылкаНаВходящийДокумент).
// ПолноеИмяФайлаНаСервере - полный путь к файлу на сервере 1С.
// ИмяФайлаБезРасширения - имя файла без расширения (для отображения в интерфейсе).
Функция ПрикрепитьФайлКДокументуСервер(СсылкаНаДокумент, ПолноеИмяФайлаНаСервере, ИмяФайлаДляОтображения) Экспорт
// Получаем двоичные данные файла, который уже находится на сервере
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПолноеИмяФайлаНаСервере);
// Подготавливаем структуру параметров для создания файла
ПараметрыФайла = Новый Структура;
ПараметрыФайла.Вставить("ВладелецФайла", СсылкаНаДокумент);
ПараметрыФайла.Вставить("Наименование", ИмяФайлаДляОтображения); // Наименование файла для пользователя
ПараметрыФайла.Вставить("ИмяФайла", ОбщегоНазначения.ИмяБезРасширения(ПолноеИмяФайлаНаСервере)); // Имя файла для записи
ПараметрыФайла.Вставить("РасширениеФайла", ОбщегоНазначения.ПолучитьРасширениеФайла(ПолноеИмяФайлаНаСервере));
ПараметрыФайла.Вставить("Размер", ДвоичныеДанныеФайла.Размер());
ПараметрыФайла.Вставить("ДвоичныеДанные", ДвоичныеДанныеФайла);
// Вызываем стандартную функцию Документооборота для создания и прикрепления файла
Возврат ФайлыДокументооборота.СоздатьНовыйФайлДляОбъекта(ПараметрыФайла);
КонецФункции
Эта функция должна быть размещена в серверном общем модуле. Она возвращает ссылку на вновь созданный элемент справочника Файлы.
Если файл находится на локальном диске пользователя, нам потребуется организовать его передачу. Подобная логика часто применяется в автоматизированных системах, например, когда создается дополнительный обработчик для бизнес-события "Поступление входящей почты", который автоматически прикладывает файлы из писем к создаваемым документам.
Для передачи файла с клиента на сервер используются функции ПоместитьФайл на клиенте и ПолучитьИзВременногоХранилища на сервере.
// Процедура на стороне клиента
Процедура ПрикрепитьФайлКДокументуКлиент(СсылкаНаДокументВладелец)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если ДиалогВыбораФайла.Выбрать() Тогда
ПолноеИмяФайлаНаКлиенте = ДиалогВыбораФайла.ПолноеИмяФайла;
ИмяФайлаБезРасширения = ОбщегоНазначенияКлиент.ИмяБезРасширения(ПолноеИмяФайлаНаКлиенте);
// Помещаем файл во временное хранилище
АдресВХранилище = ПоместитьФайл(ПолноеИмяФайлаНаКлиенте, "", , Ложь);
// Вызываем серверную функцию
Попытка
НовыйПрикрепленныйФайл = ВызватьСервернуюФункциюДляПрикрепления(
СсылкаНаДокументВладелец,
АдресВХранилище,
ИмяФайлаБезРасширения,
ПолноеИмяФайлаНаКлиенте
);
Сообщить("Файл '" + НовыйПрикрепленныйФайл.Наименование + "' успешно прикреплен.");
Исключение
Сообщить("Ошибка при прикреплении файла: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВызватьСервернуюФункциюДляПрикрепления(СсылкаНаДокумент, АдресВХранилище, ИмяФайлаДляОтображения, ПолноеИмяФайлаНаКлиенте)
ДвоичныеДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяВременногоФайлаНаСервере = ПолучитьИмяВременногоФайла();
ДвоичныеДанныеИзХранилища.Записать(ИмяВременногоФайлаНаСервере);
Возврат ПрикрепитьФайлКДокументуСервер(
СсылкаНаДокумент,
ИмяВременногоФайлаНаСервере,
ИмяФайлаДляОтображения
);
КонецФункции
Если вы работаете не с 1С:Документооборотом, а с другой конфигурацией на БСП, подход будет похожим. Чтобы быстро сориентироваться в методах, рекомендуем использовать справочник по методам БСП с примерами использования, где описаны функции модуля ПрисоединенныеФайлыКлиентСервер.
Пример использования функций БСП:
// СсылкаНаПрисоединенныйФайл = ПрисоединенныеФайлыКлиентСервер.ПрикрепитьФайлКОбъекту(
// ВладелецФайла,
// АдресВХранилище,
// Ложь,
// Новый УникальныйИдентификатор(),
// ИмяФайлаДляОтображения,
// "pdf",
// ДвоичныеДанные.Размер()
// );
При реализации программного прикрепления файлов необходимо учитывать несколько важных моментов:
Файлы.Мы рассмотрели детальный подход к программному прикреплению файлов в 1С:Документооборот 3.0. Следуя этим рекомендациям и используя возможности современных расширений, вы сможете успешно реализовать автоматизацию любой сложности.