Как программно прикрепить файлы к бизнес-процессу в 1С:Документообороте при старте из HTTP-сервиса

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача интеграции, когда внешняя система присылает данные и файлы через HTTP-сервис. В контексте 1С:Документооборота (ДО) это обычно подразумевает автоматическое создание бизнес-процесса (БП) с прикрепленными файлами. Основная сложность заключается в том, что файлы должны не просто существовать в справочнике Файлы, но и быть корректно связаны с объектом процесса или документа, чтобы исполнители видели их в своих задачах.

Разберем, почему стандартное создание файлов может не приводить к их появлению в карточке процесса, и рассмотрим наиболее надежный архитектурный подход к решению этой задачи.

Анализ архитектуры хранения файлов в 1С:Документообороте

Проанализируем типичную ошибку: если мы просто создадим элемент в справочнике Файлы и укажем в качестве владельца ссылку на бизнес-процесс, файл может «потеряться». В 1С:Документообороте визуализация файлов в задачах и процессах управляется через механизм предметов. У каждого бизнес-процесса есть табличная часть Предметы, где регистрируются ссылки на объекты (документы, файлы, контрагенты) с указанием их роли (основной, вспомогательный и т.д.).

Если файл не добавлен в эту табличную часть с соответствующей ролью, механизмы распределения прав и отображения интерфейса его проигнорируют. Рассмотрим наиболее правильный путь реализации через создание внутреннего документа-контейнера.

Решение 1: Создание документа-основания с автоматическим стартом процесса

Этот метод является наиболее «чистым» с точки зрения методологии 1С:ДО. Мы создаем внутренний документ, прикрепляем к нему файлы, регистрируем его, а система сама запускает процесс по заранее настроенному шаблону.

Рассмотрим реализацию этого алгоритма в коде HTTP-сервиса:


// 1. Создаем внутренний документ на основании данных из HTTP-запроса
Заявка = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
Заявка.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Заявка на доработку ИС");

// Заполняем реквизиты по шаблону, чтобы подтянулись настройки доступа и папки
ШаблонДока = Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на доработку ИС");
ШаблоныДокументов.ЗаполнитьРеквизитыДокументаПоШаблону(ШаблонДока, Заявка);

Заявка.ДатаСоздания = ТекущаяДата();
Заявка.Подготовил = Пользователи.ТекущийПользователь();
Заявка.Создал = Заявка.Подготовил;
Заявка.Содержание = "Текст заявки из HTTP-запроса";
Заявка.Записать();

// 2. Прикрепляем файл. Используем стандартный модуль для работы с файлами
// Предположим, ДвоичныеДанныеФайла получены из тела POST-запроса
ИмяФайла = "Приложение.pdf";
РаботаСФайламиВнешнийВызов.СоздатьФайлНаОсновеФайлаНаДиске(Заявка.Ссылка, ПутьКФайлуНаСервере, ИмяФайла, , Ложь);

После создания документа его необходимо программно зарегистрировать, так как многие шаблоны процессов в ДО настроены на автостарт именно после регистрации.

Программная регистрация документа

Выясним, как имитировать действия пользователя по нажатию кнопки «Зарегистрировать». Нам потребуется работа с нумераторами и регистрами состояний:


Нумератор = Нумерация.ПолучитьНумераторДокумента(Заявка);
Если ЗначениеЗаполнено(Нумератор) Тогда
    Заявка.ДатаРегистрации = ТекущаяДата();
    СтруктураПараметров = НумерацияКлиентСервер.ПолучитьПараметрыНумерации(Заявка);
    
    // Формируем номер документа
    Нумерация.СформироватьЧисловойНомерДокумента(СтруктураПараметров, Заявка.ЧисловойНомер);
    ОписанияОшибок = Новый СписокЗначений;
    Нумерация.СформироватьСтроковыйНомерДокумента(СтруктураПараметров, Заявка.РегистрационныйНомер, ОписанияОшибок);
    
    Заявка.Зарегистрировал = ПараметрыСеанса.ТекущийПользователь;
    
    // Записываем состояние в регистр сведений
    Делопроизводство.ЗаписатьСостояниеДокумента(Заявка.Ссылка, ТекущаяДатаСеанса(), 
        Перечисления.СостоянияДокументов.Зарегистрирован, ПараметрыСеанса.ТекущийПользователь);
    
    Заявка.Записать();
КонецЕсли;

Синхронизация описания между документом и задачами

Когда процесс стартует автоматически, пользователи часто жалуются, что в карточке задачи описание пустое, а текст заявки находится «где-то внутри документа». Чтобы исправить это, воспользуемся дополнительным обработчиком бизнес-событий на событие «Старт процесса».

Проанализируем код обработчика, который копирует Содержание документа в Описание бизнес-процесса и его первой задачи:


// Код вставляется в справочник "Дополнительные обработчики", событие "Старт процесса"
БП_Ссылка = Событие.Источник;

// Проверяем, что это нужный нам шаблон
Если БП_Ссылка.Шаблон.Наименование = "Исполнение Заявки" Тогда
    БП_Объект = БП_Ссылка.ПолучитьОбъект();
    
    // Получаем документ из предметов (обычно он первый в списке)
    Если БП_Объект.Предметы.Количество() > 0 Тогда
        ДокСсылка = БП_Объект.Предметы[0].Предмет;
        Если ТипЗнч(ДокСсылка) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
            ДокОбъект = ДокСсылка.ПолучитьОбъект();
            
            // Копируем описание в сам бизнес-процесс
            БП_Объект.Описание = ДокОбъект.Содержание;
            БП_Объект.Записать();
            
            // Если задачи уже сформировались, обновим описание и в них
            // (Зависит от типа процесса, например, для "Исполнения")
            // Для примера обновим описание в таблице результатов или активных задачах
            Для Каждого СтрокаПредмета Из БП_Объект.Предметы Цикл
                 // Логика обновления связанных задач через модули управления процессами
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Решение 2: Прямое прикрепление файлов к БП (без создания документа)

Если ваша задача не предполагает создание документа (например, короткое поручение), файлы нужно крепить напрямую к табличной части Предметы бизнес-процесса. Разберем, как это сделать правильно, чтобы избежать «пустых» карточек.

  1. Создаем объект бизнес-процесса через БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс().
  2. Записываем его, чтобы получить ссылку.
  3. Создаем файл в справочнике Файлы, где владельцем выступает ссылка на наш БП.
  4. Важный шаг: Программно добавляем строку в табличную часть Предметы объекта БП.
  5. Указываем РольПредмета (например, «Основной предмет» или «Вспомогательный»). Без роли файл не отобразится в формах задач.
  6. Вызываем метод БП.Старт().

Рассмотрим пример заполнения предметов:


НоваяСтрока = БизнесПроцессОбъект.Предметы.Добавить();
НоваяСтрока.Предмет = СсылкаНаСозданныйФайл;
НоваяСтрока.РольПредмета = Справочники.РолиПредметов.ОсновнойПредмет;
НоваяСтрока.ИмяПредмета = "Вложение из HTTP";
БизнесПроцессОбъект.Записать();

Резюме и рекомендации

Подводя итоги, отметим, что наиболее стабильным решением для 1С:Документооборота является связка «Документ + Файл + Автостарт БП». Это гарантирует, что:

При использовании HTTP-сервисов всегда выполняйте код на сервере и помните, что работа с МультипредметностьКлиент или другими клиентскими модулями невозможна. Используйте только серверные методы общих модулей РаботаСФайлами и РаботаСБизнесПроцессами.

← На главную