Как связать формы оповещениями и запускать 1С:Предприятие извне по расписанию

· 9 мин

Содержание

Чтобы одна форма 1С узнала об изменениях в другой, вызовите Оповестить("ИмяСобытия", Параметр, Источник) и обработайте событие в процедуре ОбработкаОповещения нужной формы. Чтобы 1С:Предприятие запустилось само и выполнило действие, есть два пути: регламентное задание внутри базы или внешний запуск 1cv8.exe с ключом /Execute из планировщика Windows.

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

Как устроены оповещения в 1С:Предприятии

Слово «оповещение» в 1С означает несколько разных механизмов. Их часто путают, поэтому сначала разведём.

МеханизмЧто делаетГде работает
Оповестить() + ОбработкаОповещенияСообщает открытым формам о событииТолько в текущем сеансе пользователя
ОповеститьОбИзменении()Перечитывает динамические списки объектов указанного типаТекущий сеанс
ПоказатьОповещениеПользователя()Всплывающее окно в углу экранаТекущий сеанс
ОписаниеОповещенияУказывает, какую процедуру вызвать после закрытия диалога или окончания асинхронной операцииКлиент
Система взаимодействияСообщения и обсуждения между пользователямиРазные сеансы и пользователи

Главное ограничение: Оповестить() не выходит за пределы сеанса. Бухгалтер в соседнем кабинете ваше событие не получит. Для межпользовательских сигналов нужна система взаимодействия, регистр с опросом по таймеру или механизмы БСП (например, «Напоминания пользователя»).

Все три клиентских метода вызываются только на клиенте. В серверной процедуре Оповестить() недоступен — сначала вернитесь на клиент, потом оповещайте.

Метод Оповестить на практике: связываем две формы

Типовая задача: пользователь открыл список заказов и форму клиента. В форме клиента поменяли статус — список должен обновиться без ручного «Обновить».

Шаг 1. Отправляем событие

В модуле формы-источника, после записи:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Оповестить("Запись_Контрагент", Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры

Три параметра:

  1. 🏷️ ИмяСобытия — произвольная строка. Договоритесь о правиле имён, например Запись_<ИмяОбъекта>.
  2. 📦 Параметр — любое значение: ссылка, структура, число.
  3. 🧭 Источник — обычно сама форма. По нему получатель отличает «своё» событие от чужого.

Шаг 2. Ловим событие

В модуле формы-получателя:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "Запись_Контрагент" Тогда
		Элементы.Список.Обновить();
	КонецЕсли;
КонецПроцедуры

Процедура вызывается в каждой открытой форме сеанса. Без проверки ИмяСобытия она отреагирует на все оповещения подряд, включая типовые — это частая причина «тормозов» при работе с типовыми конфигурациями.

Когда хватит ОповеститьОбИзменении

Если нужно лишь обновить динамические списки, писать обработчик не нужно:

ОповеститьОбИзменении(Тип("СправочникСсылка.Контрагенты"));

Платформа сама перечитает все открытые списки контрагентов. Удобно после групповой обработки, которая меняет данные на сервере.

Асинхронный вызов через ОписаниеОповещения

В управляемых формах модальные окна заменены асинхронными. Процедуру-продолжение задают так:

&НаКлиенте
Процедура Удалить(Команда)
	Оповещение = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить строку?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		// удаление
	КонецЕсли;
КонецПроцедуры

Процедура-обработчик обязательно Экспорт, иначе платформа её не найдёт и выдаст ошибку при закрытии диалога.

Внешний запуск 1С: командная строка и параметры

Внешний запуск нужен, когда действие должно выполниться без человека: ночная загрузка курсов, выгрузка в банк, обмен с сайтом. Базовая команда для файловой базы:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Робот" /P"пароль" /Execute"D:\Scripts\Obmen.epf" /C"ночной_обмен" /DisableStartupMessages

Номер платформы в пути замените на свой. Для серверной базы вместо /F укажите /S"сервер\имя_базы".

КлючНазначение
ENTERPRISEРежим запуска 1С:Предприятия (для конфигуратора — DESIGNER)
/FПуть к каталогу файловой базы
/SСервер и имя базы в кластере
/N, /PПользователь и пароль 1С
/WA+Вход по аутентификации Windows вместо пароля
/ExecuteОткрыть внешнюю обработку сразу после старта
/CСтрока, которая попадёт в глобальную переменную ПараметрЗапуска
/DisableStartupMessagesНе показывать стартовые предупреждения

Как обработка понимает, что её запустили извне

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ВыполнитьОбменНаСервере();
	ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

Ключ /C полезен, если обработки нет, а логика уже живёт в конфигурации. Тогда в модуле управляемого приложения в ПриНачалеРаботыСистемы проверяйте ПараметрЗапуска и запускайте нужную процедуру.

Защита от опасных действий

С платформы 8.3.9 при открытии внешней обработки 1С может показать предупреждение о небезопасном действии. При автоматическом запуске окно некому закрыть — процесс зависает.

Решение: у служебного пользователя в списке пользователей (Конфигуратор → Администрирование → Пользователи, свойства пользователя) снимите флажок «Защита от опасных действий». Делайте это только для технической учётной записи с минимальными правами.

Пароль в bat-файле лежит открытым текстом. Используйте /WA+ под отдельной учётной записью Windows или хотя бы ограничьте доступ к файлу скрипта.

COM-соединение вместо запуска клиента

Если скрипт пишется на VBScript, PowerShell или Python, можно подключиться к базе без интерфейса через V83.COMConnector:

$com = New-Object -ComObject "V83.COMConnector"
$base = $com.Connect('File="D:\Bases\Buh";Usr="Робот";Pwd="пароль";')

Дальше доступны экспортные процедуры общих модулей с флажком «Внешнее соединение». Компонент нужно зарегистрировать на машине (regsvr32 comcntr.dll из каталога bin платформы), разрядность скрипта должна совпадать с разрядностью платформы.

Регламентные задания: запуск 1С по расписанию изнутри базы

Регламентное задание — штатный планировщик 1С:Предприятия. Ему не нужен ни bat-файл, ни планировщик Windows, но нужен «исполнитель»: кластер серверов или открытый сеанс в файловой базе (подробно — в разделе о вариантах работы).

Настройка в пользовательском режиме

В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11):

  1. Откройте Администрирование → Обслуживание.
  2. В группе «Регламентные операции» перейдите по ссылке «Регламентные и фоновые задания».
  3. Выберите задание, откройте его и включите флажок «Включено».
  4. Нажмите ссылку с расписанием и задайте интервал: ежедневно, по дням недели, с повтором внутри дня.
  5. Запишите задание. Кнопка «Выполнить сейчас» позволяет проверить его без ожидания.

Без БСП список заданий доступен через Все функции → Стандартные или внешней консолью заданий.

Создание задания в конфигураторе

  1. В дереве метаданных: Общие → Регламентные задания → Добавить.
  2. В поле «Имя метода» выберите экспортную процедуру общего модуля. Модуль должен выполняться на сервере.
  3. Флажок «Предопределенное» — задание появится в базе автоматически. Без него экземпляры создают программно.
  4. Задайте расписание и флажок «Использование».

Расписание из кода

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

Задание будет запускаться каждый день в 03:00. Для разового тяжёлого действия по кнопке вместо регламентного удобнее фоновое задание: ФоновыеЗадания.Выполнить("ОбщийМодуль.Процедура", Параметры).

Чем запускать действие без пользователя?

Журнал регистрации: проверяем, запускалось ли и почему упало

Когда задание «молчит», первым делом смотрите журнал регистрации. Путь в типовых конфигурациях: Администрирование → Обслуживание → Журнал регистрации.

Что настроить в отборе:

  • 🔎 События — группа «Фоновое задание»: запуск, успешное завершение, ошибка выполнения, отмена.
  • 👤 Пользователь — служебная учётная запись, под которой работает задание.
  • 🕒 Интервал — ночь, когда должно было пройти выполнение.
  • ⚠️ Важность — «Ошибка», чтобы отсечь шум.

Если в журнале нет даже события запуска, задание не стартовало: выключено, нет исполнителя или включена блокировка в кластере. Если запуск есть, а за ним ошибка — текст исключения будет в поле «Комментарий».

Пишите свои записи в журнал

Платформа фиксирует только факт ошибки. Чтобы видеть ход выполнения, добавьте записи в код задания:

ЗаписьЖурналаРегистрации("Обмен с сайтом.Загрузка",
	УровеньЖурналаРегистрации.Информация, , ,
	СтрШаблон("Загружено заказов: %1", Формат(Количество, "ЧН=0; ЧГ=0")));

В отборе по событию ваш «Обмен с сайтом.Загрузка» найдётся за секунды. Блок Попытка … Исключение с записью ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) на уровне «Ошибка» покажет, на какой строке и с каким текстом упал код.

Где лежат файлы журнала

  • 📁 Файловая база — подкаталог 1Cv8Log в каталоге базы.
  • 🖥️ Серверная база — srvinfo\reg_1541\<GUID базы>\1Cv8Log на сервере 1С.

Размер журнала растёт быстро. Сокращают его в конфигураторе: Администрирование → Настройка журнала регистрации, там же выбирают уровень детализации. Перед сокращением выгрузите старые записи в файл, если они могут понадобиться при разборе инцидентов.

Файловый и клиент-серверный вариант: в чём разница для запуска

Одна и та же настройка ведёт себя по-разному в зависимости от варианта работы базы.

ЧтоФайловый вариантКлиент-серверный вариант
Кто выполняет регламентные заданияКлиентский сеанс, пока он открытРабочие процессы кластера, круглосуточно
Нужен ли открытый сеансДаНет
Фоновые заданияВыполняются на компьютере пользователя и обрываются при закрытии клиентаВыполняются на сервере, не зависят от клиента
Отключение заданийНе запускать сеанс-исполнительФлажок «Блокировка регламентных заданий включена» в свойствах базы в консоли кластера
Внешний запуск/F"путь"/S"сервер\база"
ЖурналВ каталоге базыНа сервере 1С

Как заставить файловую базу выполнять задания

Выделите один компьютер, который работает ночью, и запускайте на нём сеанс с ключом:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /WA+ /AllowExecuteScheduledJobs -Force

Ключ -Force назначает этот сеанс исполнителем заданий. У остальных пользователей можно указать -Off, чтобы задания не выполнялись в их сеансах и не тормозили работу. Если база опубликована на веб-сервере, задания может выполнять модуль расширения веб-сервера — это отдельная настройка публикации.

Серверная база: блокировка в консоли

Частая ситуация после копирования рабочей базы в тестовую: в копии включают блокировку регламентных заданий, чтобы тестовая база не отправила письма клиентам и не выгрузила платёжки в банк. Потом блокировку забывают снять уже в рабочей базе.

Проверка: консоль администрирования серверов → кластер → «Информационные базы» → свойства базы → флажок «Блокировка регламентных заданий включена». Включать или снимать его можно без остановки работы пользователей.

Не завершайте рабочие процессы и не перезапускайте службу агента сервера, чтобы «оживить» задание. Оборвутся сеансы всех пользователей кластера. Если без этого не обойтись — только в нерабочее время и после предупреждения сотрудников.

Если не работает: разбор по симптомам

Диагностика: выберите симптом

Частые вопросы

Можно ли вызвать Оповестить из модуля объекта или общего серверного модуля?
Нет. Метод работает только на клиенте. Верните результат с сервера в клиентскую процедуру формы и оттуда вызовите оповещение.
Сколько регламентных заданий выполняется одновременно?
В серверной базе — параллельно, в пределах ресурсов кластера. В файловой задания выполняются по очереди в сеансе-исполнителе, поэтому долгое задание задерживает остальные.
Займёт ли автоматический запуск 1cv8 лицензию?
Да. Сеанс, запущенный с /Execute, — обычный клиентский сеанс, и он занимает лицензию, пока не завершится. Поэтому в конце обработки нужен ЗавершитьРаботуСистемы.
Чем фоновое задание отличается от регламентного?
Регламентное запускается по расписанию и описано в метаданных. Фоновое запускается из кода в момент вызова, один раз, и подходит для долгих операций по кнопке, чтобы не блокировать интерфейс.
Как передать в обработку несколько параметров через /C?
Склейте их в одну строку с разделителем, например ;, и разберите в коде через СтрРазделить(ПараметрЗапуска, “;”).