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