Как исправить ошибку «Не найдены исполнители для автоподстановки» при интеграции 1С:ERP и 1С:Документооборот?

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

При настройке бесшовной интеграции между 1С:ERP Управление предприятием и 1С:Документооборот (ДО) разработчики часто сталкиваются со сложными сценариями синхронизации данных. Одной из наиболее распространенных и неприятных проблем является сбой при автоматическом старте бизнес-процессов на стороне 1С:ДО, который транслируется обратно в ERP в виде критической ошибки при записи документа.

В этой статье мы подробно разберем, почему возникает ошибка Не найдены исполнители для автоподстановки "Заказ поставщику.Ответственный за документ", проанализируем исходный код правил интеграции и рассмотрим три надежных архитектурных решения этой проблемы.

Выясняем причину возникновения ошибки

Давайте разберем по шагам, что происходит в системе в момент возникновения ошибки. Когда пользователь в 1С:ERP записывает или проводит документ Заказ поставщику, срабатывают правила интеграции. Система пытается автоматически создать связанный внутренний документ в 1С:ДО и запустить по нему шаблон бизнес-процесса (например, «Согласование заказа поставщику»).

Сбой происходит на стороне 1С:Документооборота в общем модуле ШаблоныБизнесПроцессов. Алгоритм работы автозапуска выглядит следующим образом:

  1. Программа обращается к шаблону бизнес-процесса в ДО.
  2. В списке исполнителей шаблона указана динамическая роль (автоподстановка), например, Ответственный за документ или Непосредственный руководитель ответственного.
  3. Система пытается вычислить конкретного пользователя, обращаясь к реквизиту Ответственный созданного внутреннего документа ДО.
  4. Если реквизит Ответственный в ДО оказался не заполнен (или заполнен некорректным значением, которое система не смогла распознать), алгоритм автоподстановки возвращает пустое значение.
  5. Поскольку исполнитель процесса не определен, 1С:ДО вызывает исключение, выполнение операции прерывается, а веб-сервис возвращает ошибку обратно в 1С:ERP, блокируя запись документа.

Таким образом, первопричина кроется в том, что в правилах интеграции на стороне ERP не заполняется или некорректно передается реквизит ответственного лица.

Анализ кода правил интеграции

Рассмотрим пример кода, который часто пишется разработчиками для заполнения поля «Ответственный» в правилах интеграции на стороне 1С:ERP:


мСогласующий = Неопределено;

Если ТипЗнч(Параметры.Источник.ДокументОснование) = Тип("ДокументСсылка.СТ_ЗаказВСнабжение") Тогда
    Если ЗначениеЗаполнено(Параметры.Источник.ДокументОснование) И ЗначениеЗаполнено(Параметры.Источник.ДокументОснование.НаправлениеДеятельности) Тогда
        мСогласующий = Параметры.Источник.ДокументОснование.НаправлениеДеятельности.СТ_Менеджер;
    КонецЕсли;
КонецЕсли;

Если (Не ЗначениеЗаполнено(мСогласующий)) И Параметры.Источник.Подразделение <> Справочники.СтруктураПредприятия.НайтиПоКоду("00-000049") И ЗначениеЗаполнено(Параметры.Источник.Подразделение.СТ_СогласующийРасходБюджета) Тогда
    мСогласующий = Параметры.Источник.Подразделение.СТ_СогласующийРасходБюджета;
КонецЕсли;

Параметры.Результат = мСогласующий;

Проанализируем эту ситуацию. В коде заложена логика: если Заказ поставщику создан на основании документа снабжения, то ответственным назначается менеджер этого направления. Если же документ создан вручную напрямую (не на основании), первая ветка условий полностью пропускается. Если при этом не срабатывает и вторая ветка (например, подразделение совпало с кодом "00-000049" или у него не заполнен реквизит согласования), переменная мСогласующий остается равной Неопределено.

В результате в 1С:ДО уходит пустая ссылка, вызывая ту самую ошибку автоподстановки исполнителей.

Важное замечание по передаче типов: Передавать простым приведением к строке через Строка(мСогласующий) крайне не рекомендуется. Веб-сервис интеграции (БИД) ожидает строго структурированные данные. При передаче ссылочных типов (таких как Пользователи или Сотрудники) правильнее заполнять структуру параметров с указанием уникального идентификатора (GUID) и типа объекта ДО согласно XDTO-пакету интеграции (например, DMUser для пользователей в ДО 2.1 или DMEmployee для сотрудников в ДО 3.0).

Давайте рассмотрим три варианта решения этой проблемы, начиная с настройки правил и заканчивая изменением интерфейса и условий в ДО.

Решение 1. Гарантированное заполнение ответственного (на стороне ERP)

Самый простой и надежный способ — доработать правила интеграции в ERP так, чтобы реквизит Ответственный никогда не оставался пустым, даже если документ создан напрямую. Если согласующий менеджер не найден по сложным алгоритмам, мы должны назначить ответственным автора документа или системную учетную запись по умолчанию.

Модернизируем наш код заполнения реквизита:


мСогласующий = Неопределено;

// Попытка определить по документу-основанию
Если ТипЗнч(Параметры.Источник.ДокументОснование) = Тип("ДокументСсылка.СТ_ЗаказВСнабжение") Тогда
    Если ЗначениеЗаполнено(Параметры.Источник.ДокументОснование) И ЗначениеЗаполнено(Параметры.Источник.ДокументОснование.НаправлениеДеятельности) Тогда
        мСогласующий = Параметры.Источник.ДокументОснование.НаправлениеДеятельности.СТ_Менеджер;
    КонецЕсли;
КонецЕсли;

// Попытка определить по подразделению
Если (Не ЗначениеЗаполнено(мСогласующий)) 
    И Параметры.Источник.Подразделение <> Справочники.StructureEnterprise.EmptyRef()
    И Параметры.Источник.Подразделение.Код <> "00-000049" 
    И ЗначениеЗаполнено(Параметры.Источник.Подразделение.СТ_СогласующийРасходБюджета) Тогда
    
    мСогласующий = Параметры.Источник.Подразделение.СТ_СогласующийРасходБюджета;
КонецЕсли;

// Резервный сценарий: если согласующий все еще не определен, берем автора документа
Если Не ЗначениеЗаполнено(мСогласующий) Тогда
    мСогласующий = Параметры.Источник.Автор;
КонецЕсли;

// Если и автора нет (например, системный процесс), берем ответственного из шапки документа ERP
Если Не ЗначениеЗаполнено(мСогласующий) Тогда
    мСогласующий = Параметры.Источник.Ответственный;
КонецЕсли;

Параметры.Результат = мСогласующий;

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

Решение 2. Настройка условий автозапуска процессов (на стороне ДО)

Если бизнес-логика предприятия запрещает отправлять на согласование «ручные» заказы поставщикам, то правильным решением будет не ломать запись документа ошибками, а гибко управлять автозапуском на стороне 1С:Документооборота.

Рассмотрим, как настроить условия автозапуска:

  1. Откроем 1С:Документооборот под правами администратора.
  2. Перейдем в настройки шаблона бизнес-процесса (например, «Согласование "Заказ поставщику"»).
  3. В настройках автозапуска (или в правилах обработки для ДО 3.0) добавим новое Условие.
  4. Создадим условие, проверяющее заполненность ответственного лица. На встроенном языке оно выглядит следующим образом:

Результат = ЗначениеЗаполнено(Предмет.Ответственный);

Если условие возвращает Ложь, автоматический запуск процесса по шаблону просто проигнорируется. Документ успешно запишется и синхронизируется, а пользователь ERP не получит никаких раздражающих сообщений об ошибках.

Дополнительно в ДО можно настроить «Виды бизнес-событий». В событии «Регистрация внутреннего документа» мы можем добавить аналогичные условия фильтрации, чтобы отсекать автоматическую генерацию задач для некорректно заполненных объектов.

Решение 3. Программный запрет интеграции для ручных документов (на стороне ERP)

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

Для этого нам потребуется доработать обработку ИнтеграцияС1СДокументооборот, а именно форму Документооборот. Рассмотрим пример реализации в процедуре ПриСозданииНаСервере или ПриОткрытии:


// В форме интеграции анализируем владеющий документ
ДокументВладелец = Параметры.ВладелецФормы; // или получаем через параметры интеграции

Если ТипЗнч(ДокументВладелец) = Тип("ДокументСсылка.ЗаказПоставщику") Тогда
    
    // Проверяем, создан ли документ на основании
    ДокументОснование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДокументВладелец, "ДокументОснование");
    
    Если Не ЗначениеЗаполнено(ДокументОснование) Тогда
        // Отключаем доступность элементов управления интеграцией
        Элементы.ГруппаПроцессыИЗадачи.Доступность = Ложь;
        Элементы.КнопкаСоздатьПроцесс.Видимость = Ложь;
        
        // Или выводим предупреждение пользователю
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            "Для данного документа интеграция с 1С:ДО недоступна, так как он создан не на основании.");
    КонецЕсли;
    
КонецЕсли;

Этот метод гарантирует, что пользователи физически не смогут запустить процесс документооборота для неподготовленных документов.

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

Мы детально разобрали проблему автоподстановки исполнителей при бесшовной интеграции. Чтобы избежать подобных ошибок в будущем, рекомендуем придерживаться следующих правил:

← На главную