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

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

При разработке функционала в 1С часто возникает необходимость программно запустить обработку, которая входит в состав конфигурации, из общего модуля или фонового задания. При этом требуется передать в обработку реквизиты (параметры) и выполнить основной алгоритм выгрузки или обработки данных.

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

Основные шаги для запуска обработки

Схема программного запуска обработки из состава конфигурации состоит из трех ключевых этапов:

  1. Создание экземпляра объекта обработки с помощью менеджерского метода Создать().
  2. Заполнение реквизитов обработки нужными значениями и параметрами.
  3. Вызов экспортной процедуры, расположенной строго в модуле объекта обработки (а не в модуле формы).

Различие между модулем формы и модулем объекта

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

Разберем, как правильно организовать архитектуру вызова:

  1. Основной алгоритм работы выносится в отдельную экспортную процедуру в модуле объекта обработки.
  2. Из модуля формы (при интерактивной работе) вызывается эта экспортная процедура модуля объекта.
  3. Из общего модуля или регламентного задания точно так же вызывается эта экспортная процедура после установки реквизитов.

Пример реализации в коде

Рассмотрим практический пример. Предположим, у нас есть обработка ВыгрузкаДляСайта_csv, которая должна формировать файл выгрузки по определенному типу цен и каталогу.

Сначала опишем экспортную процедуру в модуле объекта самой обработки:


Процедура ВыполнитьВыгрузку() Экспорт
    
    Если Не ЗначениеЗаполнено(ЭтотОбъект.ТипЦен) Тогда
        ВызватьИсключение "Не указан тип цен для выгрузки!";
    КонецЕсли;
    
    // Алгоритм формирования выгрузки
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Цены.Номенклатура,
        |   Цены.Цена
        |ИЗ
        |   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен) КАК Цены";
        
    Запрос.УстановитьПараметр("ТипЦен", ЭтотОбъект.ТипЦен);
    Запрос.УстановитьПараметр("ДатаСреза", ТекущаяДата());
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    ИмяФайла = ЭтотОбъект.Каталог + "/products_import.csv";
    ТекстCSV = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    
    Пока Выборка.Следующий() Цикл
        СтрокаТекста = Строка(Выборка.Номенклатура) + ";" + Строка(Выборка.Цена);
        ТекстCSV.ЗаписатьСтроку(СтрокаТекста);
    КонецЦикла;
    
    ТекстCSV.Закрыть();

КонецПроцедуры

Теперь проанализируем вызов этой обработки из общего модуля:


Процедура ВыполнитьАвтоматическуюВыгрузку() Экспорт

    // 1. Создаем экземпляр обработки
    ОбрабСайт = Обработки.ВыгрузкаДляСайта_csv.Создать();
    
    // 2. Заполняем реквизиты объекта данными
    ОбрабСайт.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничные");
    ОбрабСайт.Каталог = "\\server01\Common_Folder\ВыгрузкаДляСайта";
    ОбрабСайт.РазделительЗ = Истина;
    ОбрабСайт.ВключитьЗаголовки = Истина;
    
    // 3. Вызываем экспортную процедуру из модуля объекта
    ОбрабСайт.ВыполнитьВыгрузку();

КонецПроцедуры

Особенности выполнения на сервере и в фоновых заданиях

При запуске алгоритма из регламентных и фоновых заданий необходимо учитывать несколько нюансов платформы 1С:

  1. Права доступа службы сервера: Сервер 1С запускается от имени системной учетной записи (например, usr1cv8). Эта запись должна иметь права на чтение и запись в сетевой каталог, указанный в пути выгрузки.
  2. Отладка фоновых заданий: Чтобы остановиться на точке останова внутри регламентного задания, необходимо включить отладку фоновых заданий в меню Отладчика: Отладка — Подключение — Автоматическое подключение — Фоновые задания.
  3. Закрытие файловых ресурсов: При работе с объектом ЗаписьТекста обязательно вызывайте метод Закрыть(), иначе файл останется заблокированным процессом сервера.
← На главную