Как программно запустить обработку и заполнить действия для документов в 1С:Документооборот 3.0?

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

При работе с системой 1С:Документооборот 3.0 перед программистами часто встает задача автоматизации рутинных операций. Одна из таких задач — программное создание элементов справочника «ДокументыПредприятия», заполнение их внутренней табличной части «Действия» и последующий запуск обработки по этим документам. В данной статье мы подробно разберем, как эффективно решить эти задачи, избегая распространенных ошибок и используя рекомендуемые методы платформы.

Изначально, разработчики сталкиваются с проблемой: при попытке программно получить форму элемента справочника для заполнения табличной части, система выдает ошибку «Интерактивные операции недоступны». Это происходит потому, что код выполняется на сервере, где отсутствует пользовательский интерфейс, и любые операции, требующие прямого взаимодействия с формой (например, открытие, изменение элементов формы), становятся невозможными. Чтобы обойти это ограничение, нам необходимо использовать серверные процедуры и функции, которые работают непосредственно с объектами данных, минуя интерфейс.

Рассмотрим пошаговый подход к программному созданию документа, заполнению его действий и запуску обработки.

1. Программное создание элемента справочника "ДокументыПредприятия"

Прежде чем мы сможем заполнить действия и запустить обработку, нам, конечно же, потребуется создать сам документ. Это стандартная операция для любого справочника в 1С. Мы создаем новый элемент, заполняем его основные реквизиты, а затем записываем его.

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


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

    // Заполняем основные реквизиты документа.
    // Важно заполнить все обязательные реквизиты,
    // иначе запись может не удастся.
    НовыйДокумент.Наименование = "Мой новый документ от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy HH:mm:ss");
    НовыйДокумент.Дата = ТекущаяДата();
    
    // Пример заполнения других реквизитов, включая множественные дополнительные реквизиты (адаптируйте под свои нужды)
    // НовыйДокумент.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Входящий документ");
    // НовыйДокумент.Ответственный = Пользователи.ТекущийПользователь();
    // и так далее...

    Попытка
        НовыйДокумент.Записать();
        Сообщить("Документ '" + НовыйДокумент.Наименование + "' успешно создан. Ссылка: " + НовыйДокумент.Ссылка);

        // Теперь, когда документ создан и имеет ссылку,
        // мы можем перейти к заполнению действий и запуску обработки.
        // Передаем ссылку на созданный документ в следующие шаги.
        ЗаполнитьДействияИЗапуститьОбработку(НовыйДокумент.Ссылка, Пользователи.ТекущийПользователь());

    Исключение Как Искл
        Сообщить("Ошибка при создании документа: " + Искл.Описание);
    КонецПопытки;
КонецПроцедуры

// Вспомогательная процедура, которую мы будем реализовывать далее
Процедура ЗаполнитьДействияИЗапуститьОбработку(СсылкаНаДокумент, Пользователь) Экспорт
    // Здесь будет код для заполнения действий и запуска обработки
КонецПроцедуры

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

2. Программное заполнение табличной части "Действия"

Табличная часть «Действия» в 1С:Документооборот 3.0 не является обычной табличной частью в прямом смысле метаданных, которую можно было бы заполнить путем добавления строк через ТабличнаяЧасть.Добавить(). Она представляет собой динамически формируемый список шагов обработки, который зависит от настроенных «Правил обработки» для данного вида документа. Эти правила определяют, какие действия должны быть выполнены с документом, кто является исполнителем, каковы сроки и т.д. — для гибкого назначения исполнителей есть расширение автоматического добавления участников в правила обработки документов.

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

Мы будем использовать метод ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(). Этот метод принимает два ключевых параметра: ссылку на объект, для которого нужно заполнить действия, и пользователя, от имени которого выполняются эти действия (обычно текущий пользователь или ответственный за документ).

Добавим этот вызов в нашу вспомогательную процедуру:


// Вспомогательная процедура
Процедура ЗаполнитьДействияИЗапуститьОбработку(СсылкаНаДокумент, Пользователь) Экспорт
    Попытка
        // Заполнение действий на основе настроенных правил обработки для вида документа
        // Это аналог того, как система автоматически заполняет действия при интерактивном создании документа.
        ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(СсылкаНаДокумент, Пользователь);
        Сообщить("Действия для документа '" + СсылкаНаДокумент + "' успешно заполнены.");

        // После заполнения действий, можно переходить к запуску обработки
        ЗапуститьОбработкуДокумента(СсылкаНаДокумент);

    Исключение Как Искл
        Сообщить("Ошибка при заполнении действий документа: " + Искл.Описание);
    КонецПопытки;
КонецПроцедуры

// Вспомогательная процедура, которую мы реализуем далее
Процедура ЗапуститьОбработкуДокумента(СсылкаНаДокумент) Экспорт
    // Здесь будет код для запуска обработки
КонецПроцедуры

Важный момент: успешное заполнение действий через ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно() возможно только в том случае, если для вида документа, к которому относится ваш ДокументПредприятия, настроены соответствующие правила обработки. Если правил нет или они настроены некорректно, метод может не создать ожидаемые действия.

3. Программный запуск обработки документа

После того как действия документа сформированы, следующим шагом является запуск самой обработки. В 1С:Документооборот 3.0 существуют различные способы запуска обработки: автоматический (по событию, например, после регистрации), интерактивный (пользователь запускает вручную из формы) и программный. Нас интересует последний вариант.

Для программного запуска обработки используется метод общего модуля ОбработкиОбъектовВызовСервера.НачатьОбработку(). Этот метод инициирует выполнение первого или следующего доступного действия в маршруте отправки документов по типовым бизнес-процессам.

Добавим вызов этого метода в нашу процедуру:


// Вспомогательная процедура
Процедура ЗапуститьОбработкуДокумента(СсылкаНаДокумент) Экспорт
    Попытка
        // Запуск обработки документа
        // Этот метод инициирует выполнение первого действия,
        // предусмотренного в маршруте обработки документа.
        ОбработкиОбъектовВызовСервера.НачатьОбработку(СсылкаНаДокумент);
        Сообщить("Обработка для документа '" + СсылкаНаДокумент + "' успешно запущена.");

    Исключение Как Искл
        Сообщить("Ошибка при запуске обработки документа: " + Искл.Описание);
        // Очень важно убедиться, что у пользователя, под которым выполняется этот код,
        // есть достаточные права для запуска обработки и выполнения ее действий.
        // Частая причина ошибки - недостаточные права.
    КонецПопытки;
КонецПроцедуры

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

Регистрация документа: Иногда требуется, чтобы обработка запускалась автоматически после регистрации документа. Для этого можно использовать метод Делопроизводство.ЗарегистрироватьПредмет(СсылкаНаОбъект, "");. Если в настройках вида документа установлено автоматическое начало обработки при регистрации, этот метод также может инициировать запуск.

4. Программный перезапуск уже запущенной обработки

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

Для прерывания обработки используется метод общего модуля ОбработкиОбъектов.ПрерватьОбработкуОбъекта(). Этот метод принимает ссылку на предмет обработки и причину прерывания.

Давайте реализуем процедуру для перезапуска:


// Вспомогательная процедура
Процедура ПерезапуститьОбработкуДокумента(СсылкаНаДокумент, Пользователь) Экспорт
    Попытка
        Сообщить("Попытка прерывания обработки документа '" + СсылкаНаДокумент + "'...");
        // Прерываем текущую обработку
        ОбработкиОбъектов.ПрерватьОбработкуОбъекта(СсылкаНаДокумент, "Перезапуск обработки по требованию системы");
        Сообщить("Обработка документа '" + СсылкаНаДокумент + "' успешно прервана.");

        // После прерывания, мы можем повторно заполнить действия (при необходимости, если они могли измениться)
        // и запустить обработку заново.
        ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(СсылкаНаДокумент, Пользователь);
        Сообщить("Действия для документа '" + СсылкаНаДокумент + "' переформированы.");

        // И затем запускаем обработку снова
        ОбработкиОбъектовВызовСервера.НачатьОбработку(СсылкаНаДокумент);
        Сообщить("Обработка для документа '" + СсылкаНаДокумент + "' успешно перезапущена.");

    Исключение Как Искл
        Сообщить("Ошибка при перезапуске обработки документа: " + Искл.Описание);
    КонецПопытки;
КонецПроцедуры

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

5. Общая структура комплексной обработки

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


// Модуль внешней обработки или общий серверный модуль
// (например, "МояАвтоматизацияДокументооборота")

// Процедура, вызываемая для запуска всего процесса
Процедура ЗапуститьСозданиеИОбработкуДокумента() Экспорт
    Сообщить("Начало процесса создания и обработки документа.");

    // 1. Создание нового элемента справочника "ДокументыПредприятия"
    НовыйДокумент = Справочники.ДокументыПредприятия.СоздатьЭлемент();

    // Заполнение обязательных и необходимых реквизитов документа
    НовыйДокумент.Наименование  = "Автоматически созданный документ " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy HH:mm:ss");
    НовыйДокумент.Дата          = ТекущаяДата();
    НовыйДокумент.Ответственный = Пользователи.ТекущийПользователь();
    // Предполагаем, что есть вид документа, например "Внутренний документ"
    // Важно, чтобы для этого вида документа были настроены правила обработки.
    ВидДокументаСсылка = Справочники.ВидыДокументов.НайтиПоНаименованию("Внутренний документ"); 
    Если ВидДокументаСсылка <> Неопределено Тогда
        НовыйДокумент.ВидДокумента = ВидДокументаСсылка;
    Иначе
        Сообщить("Ошибка: Вид документа 'Внутренний документ' не найден. Процесс прерван.");
        Возврат;
    КонецЕсли;

    Попытка
        НовыйДокумент.Записать();
        Сообщить("Документ '" + НовыйДокумент.Наименование + "' (Ссылка: " + НовыйДокумент.Ссылка + ") успешно создан.");

        // 2. Заполнение табличной части "Действия"
        ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(НовыйДокумент.Ссылка, Пользователи.ТекущийПользователь());
        Сообщить("Действия для документа '" + НовыйДокумент.Ссылка + "' успешно заполнены на основе правил обработки.");

        // 3. Запуск обработки документа
        ОбработкиОбъектовВызовСервера.НачатьОбработку(НовыйДокумент.Ссылка);
        Сообщить("Обработка для документа '" + НовыйДокумент.Ссылка + "' успешно запущена.");

        // Пример использования регистрации документа, если требуется автозапуск по регистрации
        // Если настроено, что обработка запускается при регистрации:
        // Делопроизводство.ЗарегистрироватьПредмет(НовыйДокумент.Ссылка, "");
        // Сообщить("Документ '" + НовыйДокумент.Ссылка + "' зарегистрирован.");

    Исключение Как Искл
        Сообщить("Критическая ошибка в процессе автоматизации: " + Искл.Описание);
    КонецПопытки;

    Сообщить("Процесс создания и обработки документа завершен.");
КонецПроцедуры

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

Заключение

Программное управление процессами в 1С:Документооборот 3.0 требует понимания архитектуры системы и использования специализированных общих модулей. Мы выяснили, что для заполнения "Действий" необходимо использовать ПравилаОбработкиСервер.ЗаполнитьДействияПрограммно(), а для запуска обработки — ОбработкиОбъектовВызовСервера.НачатьОбработку(). Ошибка «Интерактивные операции недоступны» при использовании ПолучитьФорму — это естественное поведение системы в серверном контексте, и обход ее заключается в прямом взаимодействии с объектами данных через серверные методы. Также мы рассмотрели, как прервать и перезапустить уже идущую обработку, что значительно расширяет возможности по управлению документооборотом. Используя эти методы, вы сможете создавать мощные и гибкие решения для автоматизации ваших бизнес-процессов.

← На главную