При автоматизации задач в 1С:Зарплата и управление персоналом (ЗУП) 3.1 разработчики часто сталкиваются с необходимостью запуска внешней обработки без участия пользователя — например, для ночной выгрузки данных или формирования отчетов. Попытка реализовать это "в лоб" через создание нового регламентного задания в конфигураторе часто приводит к ошибкам компиляции и непониманию принципов работы серверного кода.
В этой статье мы подробно разберем, почему стандартный подход с директивами &НаКлиенте не работает в регламентных заданиях, и рассмотрим наиболее правильный способ решения задачи с использованием Библиотеки стандартных подсистем (БСП).
Проанализируем типичную ситуацию: программист создает общий модуль, пишет в нем процедуру с директивой &НаКлиенте и пытается использовать методы вроде ПоместитьФайл() или ОткрытьФорму(). Система выдает ошибки, так как регламентные задания всегда выполняются на стороне сервера в фоновом сеансе.
Разберем основные причины неудач:
Предупреждение(), Вопрос()) приведут к аварийному завершению задания.ПоместитьФайл() является клиентским. На сервере для работы с файлами используются другие механизмы, а внешние обработки подключаются иначе.D:\MyFolder\File.epf, сервер будет искать этот файл на своем локальном диске, а не на компьютере разработчика.В современных конфигурациях (ЗУП 3.1, УТ 11, ERP) уже заложен мощный механизм для решения этой задачи без изменения конфигурации. Это подсистема "Дополнительные отчеты и обработки". Рассмотрим, как адаптировать вашу обработку для работы по расписанию.
Во-первых, нам необходимо добавить в модуль объекта внешней обработки обязательную функцию СведенияОВнешнейОбработке(). Она сообщает системе, что обработка может запускаться как регламентное задание. Проанализируем пример кода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Автоматическая выгрузка данных";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Если нужны права на запись файлов или сеть
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить выгрузку";
НоваяКоманда.Идентификатор = "ВыгрузкаДанных";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Во-вторых, реализуем саму логику в процедуре ВыполнитьКоманду(), которая должна находиться в том же модуле объекта. Выясним важный момент: если раньше ваш код был написан в модуле формы (в обработчиках нажатия кнопок), его нужно полностью перенести в модуль объекта.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаДанных" Тогда
ВыполнитьОсновнуюЛогику();
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьОсновнуюЛогику()
// Здесь пишем код, который раньше был в кнопках формы.
// Помним: только серверные методы!
ЗаписьЖурналаРегистрации("РегламентнаяВыгрузка", УровеньЖурналаРегистрации.Информационный, , , "Задание начато.");
// Ваш код...
КонецПроцедуры
После подготовки файла его нужно зарегистрировать в программе: Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки. Там появится возможность настроить расписание прямо в интерфейсе, не заходя в конфигуратор.
Если по каким-то причинам использование БСП невозможно (например, вы создаете уникальный механизм), разберем, как программно подключить .epf файл на стороне сервера. Проанализируем правильную последовательность действий в общем модуле.
Важно помнить: общий модуль должен иметь установленный флаг "Сервер" и не иметь флага "Клиент", если речь идет о чистом регламентном задании. Рассмотрим пример кода:
Процедура ВыполнитьЗаданиеПоРасписанию() Экспорт
ПутьКФайлу = "C:\Exchange\ServiceTask.epf"; // Путь на СЕРВЕРЕ
// Подключаем внешнюю обработку
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, Ложь);
// Создаем объект обработки
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки);
// Вызываем экспортный метод из МОДУЛЯ ОБЪЕКТА обработки
ОбъектОбработки.ЗапуститьПроцесс();
КонецПроцедуры
Обратите внимание на метод ВнешниеОбработки.Подключить(). Вторым параметром передается флаг безопасного режима. Если ваша обработка должна обращаться к файловой системе сервера или COM-объектам, этот флаг должен быть Ложь, а в профилях безопасности сервера 1С должны быть даны соответствующие разрешения.
Разберем ситуацию, когда обработка запускается, но ничего не происходит или возникает ошибка доступа. Посмотрим на список проверок:
1C:Enterprise 8.3 Server Agent обычно работает под пользователем USR1CV8. Убедитесь, что этот пользователь имеет права "Чтение" и "Запись" на папку, где лежит ваша обработка и куда она планирует выгружать данные.Сообщить(), в фоновом задании это не вызовет ошибку, но сообщение никто не увидит. Однако, если встретится метод Вопрос(), задание "зависнет" или упадет. Рекомендуется использовать ЗаписьЖурналаРегистрации() для логирования хода выполнения.&НаКлиенте, &НаСервере. Они там просто не нужны и могут вызвать ошибки при компиляции объекта.Проанализируем, как проверить работу кода, если он запускается по расписанию. Отладка фоновых заданий требует предварительной настройки:
-debug).Теперь, когда регламентное задание запустится по расписанию (или вы запустите его принудительно через консоль заданий), выполнение остановится на вашей точке останова.
Таким образом, мы выяснили, что наиболее эффективным и безопасным способом запуска внешних обработок в ЗУП 3.1 является интеграция через механизмы БСП. Это позволяет избежать правок конфигурации, упрощает обновление системы и предоставляет пользователю удобный интерфейс управления расписанием.