В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача интеграции, когда внешняя система присылает данные и файлы через HTTP-сервис. В контексте 1С:Документооборота (ДО) это обычно подразумевает автоматическое создание бизнес-процесса (БП) с прикрепленными файлами. Основная сложность заключается в том, что файлы должны не просто существовать в справочнике Файлы, но и быть корректно связаны с объектом процесса или документа, чтобы исполнители видели их в своих задачах.
Разберем, почему стандартное создание файлов может не приводить к их появлению в карточке процесса, и рассмотрим наиболее надежный архитектурный подход к решению этой задачи.
Проанализируем типичную ошибку: если мы просто создадим элемент в справочнике Файлы и укажем в качестве владельца ссылку на бизнес-процесс, файл может «потеряться». В 1С:Документообороте визуализация файлов в задачах и процессах управляется через механизм предметов. У каждого бизнес-процесса есть табличная часть Предметы, где регистрируются ссылки на объекты (документы, файлы, контрагенты) с указанием их роли (основной, вспомогательный и т.д.).
Если файл не добавлен в эту табличную часть с соответствующей ролью, механизмы распределения прав и отображения интерфейса его проигнорируют. Рассмотрим наиболее правильный путь реализации через создание внутреннего документа-контейнера.
Этот метод является наиболее «чистым» с точки зрения методологии 1С:ДО. Мы создаем внутренний документ, прикрепляем к нему файлы, регистрируем его, а система сама запускает процесс по заранее настроенному шаблону.
Рассмотрим реализацию этого алгоритма в коде HTTP-сервиса:
// 1. Создаем внутренний документ на основании данных из HTTP-запроса
Заявка = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
Заявка.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Заявка на доработку ИС");
// Заполняем реквизиты по шаблону, чтобы подтянулись настройки доступа и папки
ШаблонДока = Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на доработку ИС");
ШаблоныДокументов.ЗаполнитьРеквизитыДокументаПоШаблону(ШаблонДока, Заявка);
Заявка.ДатаСоздания = ТекущаяДата();
Заявка.Подготовил = Пользователи.ТекущийПользователь();
Заявка.Создал = Заявка.Подготовил;
Заявка.Содержание = "Текст заявки из HTTP-запроса";
Заявка.Записать();
// 2. Прикрепляем файл. Используем стандартный модуль для работы с файлами
// Предположим, ДвоичныеДанныеФайла получены из тела POST-запроса
ИмяФайла = "Приложение.pdf";
РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Заявка.Ссылка, ПутьКФайлуНаСервере, ИмяФайла, , Ложь);
После создания документа его необходимо программно зарегистрировать, так как многие шаблоны процессов в ДО настроены на автостарт именно после регистрации.
Выясним, как имитировать действия пользователя по нажатию кнопки «Зарегистрировать». Нам потребуется работа с нумераторами и регистрами состояний:
Нумератор = Нумерация.ПолучитьНумераторДокумента(Заявка);
Если ЗначениеЗаполнено(Нумератор) Тогда
Заявка.ДатаРегистрации = ТекущаяДата();
СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Заявка);
// Формируем номер документа
Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, Заявка.ЧисловойНомер);
ОписанияОшибок = Новый СписокЗначений;
Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, Заявка.РегистрационныйНомер, ОписанияОшибок);
Заявка.Зарегистрировал = ПараметрыСеанса.ТекущийПользователь;
// Записываем состояние в регистр сведений
Делопроизводство.ЗаписатьСостояниеДокумента(Заявка.Ссылка, ТекущаяДатаСеанса(),
Перечисления.СостоянияДокументов.Зарегистрирован, ПараметрыСеанса.ТекущийПользователь);
Заявка.Записать();
КонецЕсли;
Когда процесс стартует автоматически, пользователи часто жалуются, что в карточке задачи описание пустое, а текст заявки находится «где-то внутри документа». Чтобы исправить это, воспользуемся дополнительным обработчиком бизнес-событий на событие «Старт процесса».
Проанализируем код обработчика, который копирует Содержание документа в Описание бизнес-процесса и его первой задачи:
// Код вставляется в справочник "Дополнительные обработчики", событие "Старт процесса"
БП_Ссылка = Событие.Источник;
// Проверяем, что это нужный нам шаблон
Если БП_Ссылка.Шаблон.Наименование = "Исполнение Заявки" Тогда
БП_Объект = БП_Ссылка.ПолучитьОбъект();
// Получаем документ из предметов (обычно он первый в списке)
Если БП_Объект.Предметы.Количество() > 0 Тогда
ДокСсылка = БП_Объект.Предметы[0].Предмет;
Если ТипЗнч(ДокСсылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
ДокОбъект = ДокСсылка.ПолучитьОбъект();
// Копируем описание в сам бизнес-процесс
БП_Объект.Описание = ДокОбъект.Содержание;
БП_Объект.Записать();
// Если задачи уже сформировались, обновим описание и в них
// (Зависит от типа процесса, например, для "Исполнения")
// Для примера обновим описание в таблице результатов или активных задачах
Для Каждого СтрокаПредмета Из БП_Объект.Предметы Цикл
// Логика обновления связанных задач через модули управления процессами
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ваша задача не предполагает создание документа (например, короткое поручение), файлы нужно крепить напрямую к табличной части Предметы бизнес-процесса. Разберем, как это сделать правильно, чтобы избежать «пустых» карточек.
БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс().Файлы, где владельцем выступает ссылка на наш БП.Предметы объекта БП.РольПредмета (например, «Основной предмет» или «Вспомогательный»). Без роли файл не отобразится в формах задач.БП.Старт().Рассмотрим пример заполнения предметов:
НоваяСтрока = БизнесПроцессОбъект.Предметы.Добавить();
НоваяСтрока.Предмет = СсылкаНаСозданныйФайл;
НоваяСтрока.РольПредмета = Справочники.РолиПредметов.ОсновнойПредмет;
НоваяСтрока.ИмяПредмета = "Вложение из HTTP";
БизнесПроцессОбъект.Записать();
Подводя итоги, отметим, что наиболее стабильным решением для 1С:Документооборота является связка «Документ + Файл + Автостарт БП». Это гарантирует, что:
При использовании HTTP-сервисов всегда выполняйте код на сервере и помните, что работа с МультипредметностьКлиент или другими клиентскими модулями невозможна. Используйте только серверные методы общих модулей РаботаСФайлами и РаботаСБизнесПроцессами.