При автоматизации регулярных процессов в 1С:Предприятии часто возникает задача запуска обработки по расписанию. Начинающие разработчики нередко сталкиваются с ошибками, когда пытаются вызвать код, написанный внутри формы обработки, из регламентного задания или общего модуля. Разберем по шагам, почему серверный контекст регламентного задания не может работать с формами, и как правильно выстроить архитектуру вызова.
Регламентное задание всегда выполняется на стороне сервера 1С в отдельном фоновом сеансе без участия пользователя. В этом контексте графический интерфейс полностью отсутствует. Попытки вызвать методы ПолучитьФорму(), Открыть() или обратиться к свойствам вроде ЭтаФорма приводят к исключениям и падению задания.
Проанализируем ключевые ограничения серверного контекста:
Для того чтобы логика корректно отрабатывала как интерактивно по кнопке, так и автоматически через регламентное задание, вынесем выполнение в экспортную процедуру модуля объекта обработки. Рассмотрим правильную реализацию.
Шаг 1. Переносим исполняемый код в Модуль объекта обработки:
Процедура ВыгрузитьДанныеПоДате(ДатаВыгрузки = Неопределено) Экспорт
Если ДатаВыгрузки = Неопределено Тогда
ДатаВыгрузки = ТекущаяДата();
КонецЕсли;
// Основной алгоритм выборки и выгрузки данных
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка данных
КонецЦикла;
КонецПроцедуры
Шаг 2. Создаем или настраиваем процедуру в Общем модуле, на который ссылается регламентное задание. В свойствах общего модуля обязательно должен быть установлен флаг Сервер:
Процедура ВыполнитьРегламентнуюВыгрузку() Экспорт
// Создаем экземпляр обработки на сервере
ОбработкаОбъект = Обработки.ВыгрузкаФайла.Создать();
// Вызываем серверный метод объекта
ОбработкаОбъект.ВыгрузитьДанныеПоДате(ТекущаяДата());
КонецПроцедуры
Шаг 3. Если необходимо вызывать эту же логику из формы по нажатию кнопки, в модуле формы просто обращаемся к модулю объекта через контекстный серверный вызов:
&НаСервере
Процедура ВыгрузитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ВыгрузитьДанныеПоДате(Объект.ДатаПараметр);
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыгрузить(Команда)
ВыгрузитьНаСервере();
КонецПроцедуры
Если алгоритму не требуется сохранять промежуточное состояние в реквизитах объекта, оптимально разместить экспортную процедуру в Модуле менеджера обработки. Это избавит платформу от необходимости создания экземпляра объекта через метод Создать().
В модуле менеджера обработки объявим процедуру:
Процедура ВыполнитьВыгрузку() Экспорт
// Серверный алгоритм без создания объекта
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка ИЗ Документ.РеализацияТоваровУслуг";
Результат = Запрос.Выполнить();
КонецПроцедуры
Тогда в общем модуле для регламентного задания вызов станет еще компактнее:
Процедура ЗапуститьВыгрузкуПоРасписанию() Экспорт
Обработки.ВыгрузкаФайла.ВыполнитьВыгрузку();
КонецПроцедуры
Если используется внешняя обработка (файл .epf), вызов из серверного общего модуля выполняется через менеджер внешних обработок:
Процедура ЗапуститьВнешнююОбработку() Экспорт
ПутьКФайлу = "\\server\share\Выгрузка.epf";
ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВнешняяОбработка.ВыгрузитьДанныеПоДате();
КонецПроцедуры
Важно обратить внимание:
USR1CV8). У этой учетной записи должен быть прямой доступ к каталогам файловой системы по сетевым путям вида \\server\share\. Локальные пользовательские пути (например, C:\Users\...) серверу недоступны.ВнешниеОбработки.Создать(..., Ложь) отключает безопасный режим, позволяя обработке выполнять привилегированные операции и обращаться к внешним ресурсам.ПараметрыСеанса, константы или регистры сведений, которые штатно читаются сервером в любом сеансе.Если задание настроено, но выгрузка не происходит, выполним диагностику: