Как запускать внешнюю обработку 1С по расписанию на сервере
Содержание
Создать регламентное задание из внешней обработки 1С напрямую нельзя: обработчик регламентного задания — это всегда экспортная процедура общего серверного модуля конфигурации. Поэтому внешнюю обработку
запускают по расписанию одним из двух способов. В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11 и другие на БСП) обработку регистрируют как дополнительную с командой «вызов серверного метода» и задают ей расписание. В нетиповой базе или без БСП добавляют своё регламентное задание, которое открывает файл обработки через ВнешниеОбработки.Создать() и вызывает её метод.
Первый способ не требует правки конфигурации, второй даёт полный контроль над параметрами, пользователем и путём к файлу. Ниже оба варианта с кодом, правами и разбором, почему задание «молчит».
Какой способ выбрать: БСП или своё регламентное задание
| Критерий | Дополнительная обработка (БСП) | Своё регламентное задание |
|---|---|---|
| Правка конфигурации | Не нужна | Нужна (или расширение) |
| Где хранится обработка | В базе, в справочнике дополнительных обработок | На диске сервера или в базе — как решите |
| Расписание | Задаётся в карточке обработки мышкой | В конфигураторе, в режиме 1С:Предприятие или кодом |
| Параметры запуска | Идентификатор команды и ссылка на обработку | Любой массив параметров |
| Кто подходит | Типовые конфигурации на БСП | Самописные базы, старые конфигурации, сложные сценарии |
💡 Если база типовая и обработка нужна одна-две, берите первый способ. Своё задание оправдано, когда обработок много, их кладут на сетевую папку и меняют без перерегистрации, или конфигурация не содержит подсистему дополнительных обработок.
Подготовка внешней обработки и прав пользователя
Обработка, которую запускает регламентное задание, работает на сервере и без форм. Отсюда требования к ней:
- 🚫 никаких
Предупреждение(),Вопрос(), открытия форм и диалогов выбора файла — в фоновом сеансе их некому показать; - 📦 вся логика лежит в модуле объекта обработки, в экспортной процедуре;
- 📝 результат и ошибки пишутся в журнал регистрации через
ЗаписьЖурналаРегистрации(), а не черезСообщить(); - 📁 пути к файлам указываются так, как их видит сервер, а не ваш компьютер.
Перед постановкой на расписание запустите обработку вручную: Файл → Открыть в режиме 1С:Предприятие, затем вызовите ту же процедуру кнопкой на форме. Если вручную она падает, по расписанию она тоже упадёт, только тише.
Права
Здесь участвуют три разных набора прав:
- Кто регистрирует обработку. В БСП нужна роль на добавление и изменение дополнительных отчётов и обработок. Регистрация обработки в небезопасном режиме доступна только пользователю с полными правами.
- Кто создаёт задание кодом. Методы менеджера
РегламентныеЗаданияв клиент-серверной базе требуют административных прав. - От чьего имени выполняется задание. У регламентного задания есть свойство «Имя пользователя». У этого пользователя должны быть права на все данные, которые читает и пишет обработка. Укажите пользователя явно: служебная учётная запись вида
Регламентс нужными ролями надёжнее, чем учётка сотрудника, которого завтра уволят.
Если пользователь задания удалён или у него отняли роли, задание перестанет выполняться, а в списке пользователей это никак не проявится. Служебную учётку не трогайте при чистке пользователей.
Регистрация дополнительной обработки с расписанием в типовой конфигурации
Шаг 1. Добавьте в обработку сведения для регистрации
БСП принимает файл только если в модуле объекта есть экспортная функция СведенияОВнешнейОбработке(). Для запуска по расписанию тип команды должен быть «вызов серверного метода»:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Истина;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Выгрузка остатков по расписанию";
Команда.Идентификатор = "ВыгрузкаОстатков";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ВыгрузкаОстатков" Тогда
ВыгрузитьОстатки();
КонецЕсли;
КонецПроцедуры
Процедура ВыгрузитьОстатки()
// Рабочая логика обработки: запрос, запись файла, обмен
ЗаписьЖурналаРегистрации("ВыгрузкаОстатков", УровеньЖурналаРегистрации.Информация, , , "Выгрузка завершена");
КонецПроцедуры
Процедура ВыполнитьКоманду — точка входа, которую вызовет регламентное задание. Идентификатор команды в ней должен совпадать с тем, что указан в сведениях, иначе вызов пройдёт вхолостую.
💡 БезопасныйРежим = Истина — правильный выбор по умолчанию. В безопасном режиме обработке недоступны запись на диск, COM-объекты, внешние компоненты и интернет. Если обработке они нужны, ставьте Ложь и регистрируйте её под администратором — либо запрашивайте разрешения через профили безопасности, если они включены в кластере.
Шаг 2. Включите дополнительные обработки
В разделе Администрирование → Печатные формы, отчеты и обработки установите флажок «Дополнительные отчеты и обработки». Без него список обработок недоступен.
Шаг 3. Загрузите файл и задайте расписание
- Откройте ссылку «Дополнительные отчеты и обработки» в том же разделе.
- Нажмите «Добавить из файла» и выберите
.epf. Платформа предупредит о безопасности — подтвердите, если файл ваш. - В карточке на вкладке команд найдите строку с командой «Выгрузка остатков по расписанию».
- Дважды щёлкните колонку «Расписание», задайте периодичность (например, ежедневно в 03:00) и включите флажок использования.
- Проверьте, что публикация обработки — «Используется», и нажмите «Записать и закрыть».
После записи БСП сама создаёт экземпляр служебного регламентного задания «Запуск дополнительных обработок» с параметрами этой команды. Отдельно в конфигураторе ничего делать не нужно.
Колонка «Расписание» появляется только у команд типа «вызов серверного метода». Если её нет — проверьте Команда.Использование в коде и перерегистрируйте файл.
Своё регламентное задание: общий модуль и объект метаданных
Для базы без БСП или когда нужен свой сценарий, делаем «обёртку» в конфигураторе. Чтобы не снимать типовую конфигурацию с поддержки, добавьте объекты в расширение. У расширения снимите флажок «Безопасный режим» — иначе из него нельзя будет открыть внешнюю обработку в небезопасном режиме.
Общий модуль
Создайте общий модуль, например РегламентВнешнихОбработок, с флажком «Сервер» (флажки «Глобальный» и «Клиент» — снять):
Процедура ВыполнитьВнешнююОбработку(ПутьКФайлу) Экспорт
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
ЗаписьЖурналаРегистрации("ВнешняяОбработкаПоРасписанию",
УровеньЖурналаРегистрации.Ошибка, , ,
"Файл не найден: " + ПутьКФайлу);
Возврат;
КонецЕсли;
Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Обработка.ВыполнитьПоРасписанию();
КонецПроцедуры
Второй параметр ВнешниеОбработки.Создать() — безопасный режим. Ложь открывает обработку с полным доступом к диску и COM. Это осознанный выбор: в таком режиме можно запускать только файлы, которые вы контролируете. В самой обработке должна быть экспортная процедура ВыполнитьПоРасписанию() в модуле объекта.
Объект «Регламентное задание»
В ветке Общие → Регламентные задания добавьте объект ЗапускВнешнейОбработки:
- 🔧 Имя метода — выберите
РегламентВнешнихОбработок.ВыполнитьВнешнююОбработку; - 🔧 Предопределенное — снимите флажок, если хотите передавать путь к файлу параметром. Предопределённое задание существует в базе в единственном экземпляре и параметров не получает;
- 🔧 Использование и Расписание в свойствах метаданных задавать не обязательно: для непредопределённого задания их задают у каждого экземпляра.
Обновите конфигурацию базы данных (F7). На загрузку расширения это тоже распространяется: после установки расширения базу нужно перезапустить, чтобы новые объекты стали доступны в сеансах.
Как создать экземпляр регламентного задания кодом и включить его
Объект метаданных — это только «вид» задания. Выполняться будет экземпляр, который создают в базе с параметрами и расписанием. Сначала находим вид по имени, затем ищем существующий экземпляр по ключу, чтобы не плодить дубли при повторном запуске:
Процедура СоздатьЗаданиеВнешнейОбработки(ПутьКФайлу, КлючЗадания, ИмяПользователя) Экспорт
МетаданныеЗадания = Метаданные.РегламентныеЗадания.Найти("ЗапускВнешнейОбработки");
Если МетаданныеЗадания = Неопределено Тогда
ВызватьИсключение "В конфигурации нет регламентного задания ЗапускВнешнейОбработки";
КонецЕсли;
Отбор = Новый Структура("Метаданные, Ключ", МетаданныеЗадания, КлючЗадания);
Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Если Найденные.Количество() > 0 Тогда
Задание = Найденные[0];
Иначе
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(МетаданныеЗадания);
КонецЕсли;
Параметры = Новый Массив;
Параметры.Добавить(ПутьКФайлу);
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ВремяНачала = Дата(1, 1, 1, 3, 0, 0);
Задание.Ключ = КлючЗадания;
Задание.Наименование = "Внешняя обработка: " + КлючЗадания;
Задание.Параметры = Параметры;
Задание.Расписание = Расписание;
Задание.ИмяПользователя = ИмяПользователя;
Задание.Использование = Истина;
Задание.Записать();
КонецПроцедуры
Пример вызова: СоздатьЗаданиеВнешнейОбработки("\\srv-files\1c\vygruzka.epf", "ВыгрузкаОстатков", "Регламент").
Что здесь происходит:
Метаданные.РегламентныеЗадания.Найти()— поиск вида задания. Если имя написано с ошибкой, сразу получим понятное исключение, а не «пустое» задание.ПолучитьРегламентныеЗадания()с отбором по ключу — защита от дублей. Без неё каждый вызов процедуры создаёт ещё одно задание, и обработка начнёт работать дважды, трижды и так далее.- Расписание:
ПериодПовтораДней = 1и время начала 03:00 — каждый день в три ночи. Для запуска каждые 15 минут используютПериодПовтораВТечениеДня = 900(в секундах). Использование = Истина— без этого флага записанное задание не запустится никогда.Записать()сохраняет экземпляр в базе. До записи изменения живут только в памяти.
Одним видом задания можно обслуживать несколько обработок: каждой — свой экземпляр, свой ключ, свой путь и своё расписание.
Обработка лежит в базе, а не на диске
Если не хочется зависеть от сетевой папки, храните .epf в константе или справочнике с реквизитом типа «Хранилище значения». В обработчике задания подключайте её из двоичных данных:
ДвоичныеДанные = Константы.ФайлОбработкиВыгрузки.Получить().Получить();
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ИмяОбработки = ВнешниеОбработки.Подключить(Адрес, , Ложь);
Обработка = ВнешниеОбработки.Создать(ИмяОбработки);
Обработка.ВыполнитьПоРасписанию();
Так обработка переезжает вместе с базой при выгрузке .dt, и права на папку сервера не нужны.
Файловая и клиент-серверная база: где и кто выполняет задание
| Файловая база | Клиент-серверная база | |
|---|---|---|
| Кто запускает задания | Один из открытых клиентских сеансов | Кластер серверов 1С, без участия пользователей |
| Если все вышли из базы | Задания не выполняются | Выполняются по расписанию |
| Чьи права на файлы | Учётная запись Windows, под которой открыт клиент | Учётная запись службы сервера 1С (по умолчанию USR1CV8) |
Как путь к .epf | Путь с компьютера, где открыт клиент | Путь, доступный с сервера; надёжнее UNC вида \\srv\share\file.epf |
| Где запретить задания | Параметр запуска клиента | Флажок блокировки регламентных заданий в свойствах базы в консоли кластера |
Файловый вариант
В файловой базе задания выполняет клиентский сеанс. Если ночью никто не работает
, задание в 03:00 не сработает. Решение — отдельный сеанс на машине, которая не выключается, запущенный с параметром /AllowExecuteScheduledJobs -Force. Обратная ситуация: чтобы обычный пользовательский сеанс не брал на себя задания, используют -Off.
Клиент-серверный вариант
Здесь задания выполняет рабочий процесс сервера. Два частых подвоха:
- 🔒 в консоли администрирования серверов в свойствах информационной базы включена «Блокировка регламентных заданий» — так её часто оставляют после копирования рабочей базы в тестовую;
- 📁 файл обработки лежит на диске
C:компьютера администратора, а сервер его не видит. ПутьC:\Обработки\file.epfв коде означает диск сервера. Для сетевой папки выдайте учётной записи службы 1С права на чтение.
Снимать блокировку регламентных заданий на копии рабочей базы опасно: тестовая база начнёт выполнять обмены, рассылки и выгрузки в те же адреса, что и рабочая. Сначала отключите в копии все обмены и задания, которые «смотрят наружу».
Диагностика: почему регламентное задание не выполняется
Первое место — журнал регистрации: Администрирование → Обслуживание → Журнал регистрации. Отберите события по слову «Регламентн» и по имени события, которое пишет ваша обработка (в примерах выше — ВыгрузкаОстатков и ВнешняяОбработкаПоРасписанию). Ошибка из обработки попадёт туда с полным текстом исключения.
Второе место — список заданий. В типовых конфигурациях: Администрирование → Обслуживание → Регламентные и фоновые задания. Там видно, включено ли задание, когда запускалось последний раз и чем закончилось. Там же есть команда немедленного запуска — удобно, чтобы не ждать 03:00.
Из кода последний запуск смотрят так:
Последнее = Задание.ПоследнееЗадание;
Если Последнее <> Неопределено И Последнее.ИнформацияОбОшибке <> Неопределено Тогда
ТекстОшибки = ПодробноеПредставлениеОшибки(Последнее.ИнформацияОбОшибке);
КонецЕсли;
А для отладки без ожидания расписания тот же метод запускают фоновым заданием: ФоновыеЗадания.Выполнить("РегламентВнешнихОбработок.ВыполнитьВнешнююОбработку", Параметры).
Частые вопросы
Можно ли указать путь к внешней обработке прямо в свойствах регламентного задания?
Нужно ли перезапускать сервер после замены файла .epf?
ВнешниеОбработки.Создать() читает файл при каждом вызове, поэтому следующий запуск возьмёт новую версию. В БСП новую версию обработки загружают в той же карточке командой обновления из файла.