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