Как запускать внешнюю обработку 1С по расписанию на сервере

· 10 мин

Содержание

Создать регламентное задание из внешней обработки 1С напрямую нельзя: обработчик регламентного задания — это всегда экспортная процедура общего серверного модуля конфигурации. Поэтому внешнюю обработку запускают по расписанию одним из двух способов. В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11 и другие на БСП) обработку регистрируют как дополнительную с командой «вызов серверного метода» и задают ей расписание. В нетиповой базе или без БСП добавляют своё регламентное задание, которое открывает файл обработки через ВнешниеОбработки.Создать() и вызывает её метод.

Первый способ не требует правки конфигурации, второй даёт полный контроль над параметрами, пользователем и путём к файлу. Ниже оба варианта с кодом, правами и разбором, почему задание «молчит».

Какой способ выбрать: БСП или своё регламентное задание

КритерийДополнительная обработка (БСП)Своё регламентное задание
Правка конфигурацииНе нужнаНужна (или расширение)
Где хранится обработкаВ базе, в справочнике дополнительных обработокНа диске сервера или в базе — как решите
РасписаниеЗадаётся в карточке обработки мышкойВ конфигураторе, в режиме 1С:Предприятие или кодом
Параметры запускаИдентификатор команды и ссылка на обработкуЛюбой массив параметров
Кто подходитТиповые конфигурации на БСПСамописные базы, старые конфигурации, сложные сценарии

💡 Если база типовая и обработка нужна одна-две, берите первый способ. Своё задание оправдано, когда обработок много, их кладут на сетевую папку и меняют без перерегистрации, или конфигурация не содержит подсистему дополнительных обработок.

Подготовка внешней обработки и прав пользователя

Обработка, которую запускает регламентное задание, работает на сервере и без форм. Отсюда требования к ней:

  • 🚫 никаких Предупреждение(), Вопрос(), открытия форм и диалогов выбора файла — в фоновом сеансе их некому показать;
  • 📦 вся логика лежит в модуле объекта обработки, в экспортной процедуре;
  • 📝 результат и ошибки пишутся в журнал регистрации через ЗаписьЖурналаРегистрации(), а не через Сообщить();
  • 📁 пути к файлам указываются так, как их видит сервер, а не ваш компьютер.

Перед постановкой на расписание запустите обработку вручную: Файл → Открыть в режиме 1С:Предприятие, затем вызовите ту же процедуру кнопкой на форме. Если вручную она падает, по расписанию она тоже упадёт, только тише.

Права

Здесь участвуют три разных набора прав:

  1. Кто регистрирует обработку. В БСП нужна роль на добавление и изменение дополнительных отчётов и обработок. Регистрация обработки в небезопасном режиме доступна только пользователю с полными правами.
  2. Кто создаёт задание кодом. Методы менеджера РегламентныеЗадания в клиент-серверной базе требуют административных прав.
  3. От чьего имени выполняется задание. У регламентного задания есть свойство «Имя пользователя». У этого пользователя должны быть права на все данные, которые читает и пишет обработка. Укажите пользователя явно: служебная учётная запись вида Регламент с нужными ролями надёжнее, чем учётка сотрудника, которого завтра уволят.

Если пользователь задания удалён или у него отняли роли, задание перестанет выполняться, а в списке пользователей это никак не проявится. Служебную учётку не трогайте при чистке пользователей.

Регистрация дополнительной обработки с расписанием в типовой конфигурации

Шаг 1. Добавьте в обработку сведения для регистрации

БСП принимает файл только если в модуле объекта есть экспортная функция СведенияОВнешнейОбработке(). Для запуска по расписанию тип команды должен быть «вызов серверного метода»:

Функция СведенияОВнешнейОбработке() Экспорт

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Истина;

	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = "Выгрузка остатков по расписанию";
	Команда.Идентификатор = "ВыгрузкаОстатков";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
	Команда.ПоказыватьОповещение = Ложь;

	Возврат ПараметрыРегистрации;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

	Если ИдентификаторКоманды = "ВыгрузкаОстатков" Тогда
		ВыгрузитьОстатки();
	КонецЕсли;

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

Процедура ВыгрузитьОстатки()
	// Рабочая логика обработки: запрос, запись файла, обмен
	ЗаписьЖурналаРегистрации("ВыгрузкаОстатков", УровеньЖурналаРегистрации.Информация, , , "Выгрузка завершена");
КонецПроцедуры

Процедура ВыполнитьКоманду — точка входа, которую вызовет регламентное задание. Идентификатор команды в ней должен совпадать с тем, что указан в сведениях, иначе вызов пройдёт вхолостую.

💡 БезопасныйРежим = Истина — правильный выбор по умолчанию. В безопасном режиме обработке недоступны запись на диск, COM-объекты, внешние компоненты и интернет. Если обработке они нужны, ставьте Ложь и регистрируйте её под администратором — либо запрашивайте разрешения через профили безопасности, если они включены в кластере.

Шаг 2. Включите дополнительные обработки

В разделе Администрирование → Печатные формы, отчеты и обработки установите флажок «Дополнительные отчеты и обработки». Без него список обработок недоступен.

Шаг 3. Загрузите файл и задайте расписание

  1. Откройте ссылку «Дополнительные отчеты и обработки» в том же разделе.
  2. Нажмите «Добавить из файла» и выберите .epf. Платформа предупредит о безопасности — подтвердите, если файл ваш.
  3. В карточке на вкладке команд найдите строку с командой «Выгрузка остатков по расписанию».
  4. Дважды щёлкните колонку «Расписание», задайте периодичность (например, ежедневно в 03:00) и включите флажок использования.
  5. Проверьте, что публикация обработки — «Используется», и нажмите «Записать и закрыть».

После записи БСП сама создаёт экземпляр служебного регламентного задания «Запуск дополнительных обработок» с параметрами этой команды. Отдельно в конфигураторе ничего делать не нужно.

Колонка «Расписание» появляется только у команд типа «вызов серверного метода». Если её нет — проверьте Команда.Использование в коде и перерегистрируйте файл.

Своё регламентное задание: общий модуль и объект метаданных

Для базы без БСП или когда нужен свой сценарий, делаем «обёртку» в конфигураторе. Чтобы не снимать типовую конфигурацию с поддержки, добавьте объекты в расширение. У расширения снимите флажок «Безопасный режим» — иначе из него нельзя будет открыть внешнюю обработку в небезопасном режиме.

Общий модуль

Создайте общий модуль, например РегламентВнешнихОбработок, с флажком «Сервер» (флажки «Глобальный» и «Клиент» — снять):

Процедура ВыполнитьВнешнююОбработку(ПутьКФайлу) Экспорт

	Файл = Новый Файл(ПутьКФайлу);
	Если Не Файл.Существует() Тогда
		ЗаписьЖурналаРегистрации("ВнешняяОбработкаПоРасписанию",
			УровеньЖурналаРегистрации.Ошибка, , ,
			"Файл не найден: " + ПутьКФайлу);
		Возврат;
	КонецЕсли;

	Обработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
	Обработка.ВыполнитьПоРасписанию();

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

Второй параметр ВнешниеОбработки.Создать() — безопасный режим. Ложь открывает обработку с полным доступом к диску и COM. Это осознанный выбор: в таком режиме можно запускать только файлы, которые вы контролируете. В самой обработке должна быть экспортная процедура ВыполнитьПоРасписанию() в модуле объекта.

Объект «Регламентное задание»

В ветке Общие → Регламентные задания добавьте объект ЗапускВнешнейОбработки:

  • 🔧 Имя метода — выберите РегламентВнешнихОбработок.ВыполнитьВнешнююОбработку;
  • 🔧 Предопределенное — снимите флажок, если хотите передавать путь к файлу параметром. Предопределённое задание существует в базе в единственном экземпляре и параметров не получает;
  • 🔧 Использование и Расписание в свойствах метаданных задавать не обязательно: для непредопределённого задания их задают у каждого экземпляра.

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

Как создать экземпляр регламентного задания кодом и включить его

Объект метаданных — это только «вид» задания. Выполняться будет экземпляр, который создают в базе с параметрами и расписанием. Сначала находим вид по имени, затем ищем существующий экземпляр по ключу, чтобы не плодить дубли при повторном запуске:

Процедура СоздатьЗаданиеВнешнейОбработки(ПутьКФайлу, КлючЗадания, ИмяПользователя) Экспорт

	МетаданныеЗадания = Метаданные.РегламентныеЗадания.Найти("ЗапускВнешнейОбработки");
	Если МетаданныеЗадания = Неопределено Тогда
		ВызватьИсключение "В конфигурации нет регламентного задания ЗапускВнешнейОбработки";
	КонецЕсли;

	Отбор = Новый Структура("Метаданные, Ключ", МетаданныеЗадания, КлючЗадания);
	Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
	Если Найденные.Количество() > 0 Тогда
		Задание = Найденные[0];
	Иначе
		Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(МетаданныеЗадания);
	КонецЕсли;

	Параметры = Новый Массив;
	Параметры.Добавить(ПутьКФайлу);

	Расписание = Новый РасписаниеРегламентногоЗадания;
	Расписание.ПериодПовтораДней = 1;
	Расписание.ВремяНачала = Дата(1, 1, 1, 3, 0, 0);

	Задание.Ключ = КлючЗадания;
	Задание.Наименование = "Внешняя обработка: " + КлючЗадания;
	Задание.Параметры = Параметры;
	Задание.Расписание = Расписание;
	Задание.ИмяПользователя = ИмяПользователя;
	Задание.Использование = Истина;
	Задание.Записать();

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

Пример вызова: СоздатьЗаданиеВнешнейОбработки("\\srv-files\1c\vygruzka.epf", "ВыгрузкаОстатков", "Регламент").

Что здесь происходит:

  1. Метаданные.РегламентныеЗадания.Найти() — поиск вида задания. Если имя написано с ошибкой, сразу получим понятное исключение, а не «пустое» задание.
  2. ПолучитьРегламентныеЗадания() с отбором по ключу — защита от дублей. Без неё каждый вызов процедуры создаёт ещё одно задание, и обработка начнёт работать дважды, трижды и так далее.
  3. Расписание: ПериодПовтораДней = 1 и время начала 03:00 — каждый день в три ночи. Для запуска каждые 15 минут используют ПериодПовтораВТечениеДня = 900 (в секундах).
  4. Использование = Истина — без этого флага записанное задание не запустится никогда.
  5. Записать() сохраняет экземпляр в базе. До записи изменения живут только в памяти.

Одним видом задания можно обслуживать несколько обработок: каждой — свой экземпляр, свой ключ, свой путь и своё расписание.

Обработка лежит в базе, а не на диске

Если не хочется зависеть от сетевой папки, храните .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?
Нет. ВнешниеОбработки.Создать() читает файл при каждом вызове, поэтому следующий запуск возьмёт новую версию. В БСП новую версию обработки загружают в той же карточке командой обновления из файла.
Как запускать обработку каждые 10 минут, но только в рабочее время?
В расписании задайте повтор в течение дня 600 секунд, время начала 09:00 и время окончания 18:00. Дни недели ограничьте в том же окне расписания.
Почему задание в БСП не видно в конфигураторе?
БСП использует общее служебное задание «Запуск дополнительных обработок» и создаёт его экземпляры в базе. В дереве метаданных виден только вид задания, экземпляры смотрят в списке регламентных и фоновых заданий.
Можно ли поставить на расписание внешний отчёт?
Для рассылки отчётов в типовых конфигурациях есть отдельный механизм рассылок. Внешний отчёт как регламентное задание не запускают: для этого делают внешнюю обработку, которая формирует отчёт и сохраняет результат.