При разработке и автоматизации бизнес-процессов в конфигурациях на базе 1С:Предприятие 8.3, таких как 1С:Управление торговлей 11, часто возникает задача автоматического прикрепления внешних файлов к документам. Это могут быть печатные формы, договоры в формате PDF, спецификации в Excel или изображения, полученные от поставщиков. Для задач роботизации действий пользователя в закрытых системах без API применяется автоматизация переноса данных между окнами и формирования документов на базе платформы RPA.
В этой статье мы подробно разберем, как правильно реализовать программное добавление файлов к документам-владельцам. Мы рассмотрим работу на клиенте и на сервере, научимся обновлять существующие файлы, избегая дублирования информации, а также разберем важные настройки метаданных для нетиповых документов.
В конфигурациях, построенных на основе Библиотеки Стандартных Подсистем (БСП), файлы хранятся по особым правилам. В зависимости от настроек системы, файлы могут находиться непосредственно в базе данных (в виде двоичных данных) либо на внешних томах (в сетевых папках на сервере).
Если мы попытаемся создать элемент справочника присоединенных файлов (например, ПриобретениеТоваровУслугПрисоединенныеФайлы) простым методом СоздатьЭлемент(), система не выполнит необходимые процедуры распределения данных. В результате файл не запишется на диск, не получит уникальный идентификатор и не будет отображаться в стандартных формах прикрепленных файлов.
Именно поэтому для работы с файлами всегда следует использовать стандартные программные интерфейсы (API) БСП, а именно функции общего модуля РаботаСФайлами.
Рассмотрим наиболее гибкий и распространенный сценарий, когда файл сначала считывается программно (или формируется в коде), помещается во временное хранилище, а затем привязывается к документу-владельцу на стороне сервера.
Для корректной инициализации параметров добавления файла в БСП предусмотрен стандартный конструктор РаботаСФайлами.ПараметрыДобавленияФайла(). Его использование гарантирует совместимость вашего кода при последующих обновлениях конфигурации.
Ниже представлен детальный пример реализации этого механизма:
// 1. Считываем двоичные данные файла с диска или сервера
ПутьКФайлуНаДиске = "C:\Files\Dogovor_12.pdf";
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлуНаДиске);
// 2. Помещаем двоичные данные во временное хранилище
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
// 3. Инициализируем стандартную структуру параметров БСП
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.Автор = Пользователи.ТекущийПользователь();
ПараметрыФайла.ВладелецФайлов = СсылкаНаДокумент; // Ссылка на ваш документ-владелец
ПараметрыФайла.ИмяБезРасширения = "Договор_поставки_№12";
ПараметрыФайла.РасширениеБезТочки = "pdf";
// 4. Вызываем API БСП для создания записи и автоматического размещения файла в томах или ИБ
СсылкаНаНовыйФайл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресВХранилище);
Этот метод самостоятельно проанализирует настройки хранения файлов, создаст карточку в соответствующем справочнике присоединенных файлов, перенесет двоичные данные в целевое место хранения и свяжет его с документом.
Если файл уже физически сохранен на жестком диске сервера (например, во временном каталоге операционной системы) и вам не требуется вручную обрабатывать его двоичные данные, можно воспользоваться упрощенной функцией БСП.
Метод РаботаСФайлами.ДобавитьФайлСДиска берет всю рутину на себя. Он самостоятельно определит имя файла, его расширение, автоматически поместит его во временное хранилище и прикрепит к документу:
ПутьКФайлуНаСервере = "D:\Temp\Spec_150.xlsx";
СсылкаНаНовыйФайл = РаботаСФайлами.ДобавитьФайлСДиска(СсылкаНаДокумент, ПутьКФайлуНаСервере);
Данный вариант идеально подходит для фоновых заданий, регламентных обработок или интеграций с внешними системами, где файлы предварительно выгружаются в общую папку обмена. При получении данных из нескольких внешних источников настраивают автоматический сбор файлов из электронной почты, FTP и HTTP для их последующей загрузки в 1С.
Если задача требует, чтобы пользователь самостоятельно выбрал файл на своем компьютере и прикрепил его к открытому документу из формы, следует задействовать клиентские методы БСП.
Важное правило: прикрепить файл можно только к уже записанному документу, так как незаписанный объект не имеет ссылки (уникального идентификатора), к которому привязываются файлы. Проанализируем, как правильно написать код на управляемой форме документа:
&НаКлиенте
Процедура ПрикрепитьФайл(Команда)
// Проверяем, записан ли документ в базе данных
Если Объект.Ссылка.Пустая() Тогда
ТекстВопроса = НСтр("ru = 'Прикрепление файлов возможно только после записи документа. Записать?'");
Обработчик = Новый ОписаниеОповещения("ПрикрепитьПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена);
Возврат;
КонецЕсли;
// Запускаем стандартный диалог выбора и добавления файлов БСП
РаботаСФайламиКлиент.ДобавитьФайлы(Объект.Ссылка, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПрикрепитьПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт
Если Ответ <> КодВозвратаДиалога.ОК Тогда
Возврат;
КонецЕсли;
// Пытаемся записать форму документа
Если Не Записать() Тогда
Возврат;
КонецЕсли;
// Если запись прошла успешно, открываем диалог добавления файлов
РаботаСФайламиКлиент.ДобавитьФайлы(Объект.Ссылка, УникальныйИдентификатор);
КонецПроцедуры
При вызове метода РаботаСФайламиКлиент.ДобавитьФайлы пользователю откроется стандартное окно выбора файлов, а система автоматически свяжет выбранные элементы с текущим документом.
При регулярном автоматическом формировании документов (например, при ежедневном обновлении прайс-листов или перегенерации счетов) простое добавление файлов приведет к тому, что в карточке документа будет копиться множество одинаковых файлов с разными версиями. Для автоматизации переоценки товаров в УТ 11 может использоваться парсинг цен на маркетплейсах и цен конкурентов через готовую обработку.
Чтобы избежать захламления базы данных, перед добавлением нового файла рекомендуется проверять, нет ли у этого документа файла с аналогичным именем. Если файл найден, его нужно перезаписать (обновить), а не создавать заново.
Выясним, как это реализовать программно:
ИмяФайла = "PriceList.pdf";
// 1. Проверяем наличие файла с таким именем у нашего документа
ЕстьФайл = РаботаСФайламиВызовСервера.ЕстьФайлСТакимИменем(СсылкаНаДокумент, ИмяФайла);
Если ЕстьФайл Тогда
// Получаем ссылку на существующий файл (напишем собственный запрос или поиск)
СсылкаНаСтарыйФайл = НайтиПрисоединенныйФайлПоИмени(СсылкаНаДокумент, ИмяФайла);
// Подготавливаем структуру обновления
ИнформацияОФайле = Новый Структура;
ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", АдресНовыхДанныхВХранилище);
ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", "");
// Обновляем данные существующего файла
РаботаСФайлами.ОбновитьФайл(СсылкаНаСтарыйФайл, ИнформацияОФайле);
Иначе
// Если файла нет, добавляем его как новый (способом 1 или 2)
// ... Код добавления нового файла ...
КонецЕсли;
Если вы пытаетесь прикрепить файл к типовому документу (например, Реализация товаров и услуг или Заказ клиента), то вся необходимая структура уже настроена разработчиками 1С. Но если вы добавили свой собственный документ в конфигурацию или через расширение, БСП выдаст ошибку при вызове методов работы с файлами.
Чтобы подсистема БСП "узнала" ваш новый документ, выполните следующие шаги в конфигураторе:
[ИмяВашегоДокумента]ПрисоединенныеФайлы. Шаблоном для него может послужить любой аналогичный справочник присоединенных файлов в базе.ВладелецФайла в этом справочнике имеет тип ссылки на ваш новый документ.ВладелецПрисоединенныхФайлов — сюда добавляется ссылка на ваш документ;ПрисоединенныйФайл — сюда добавляется ссылка на созданный справочник присоединенных файлов;ПрисоединенныйФайлОбъект — сюда добавляется тип "Объект" вашего нового справочника присоединенных файлов;УстановитьПометкуУдаленияПрисоединенныхФайловДокументов — сюда добавляется объект вашего документа (это обеспечит автоматическую пометку на удаление всех файлов при удалении самого документа).После настройки определяемых типов стандартные механизмы добавления файлов заработают корректно и без ошибок.