Как связать формы оповещениями и запускать 1С:Предприятие извне по расписанию
Содержание
Чтобы одна форма 1С узнала об изменениях в другой, вызовите Оповестить("ИмяСобытия", Параметр, Источник) и обработайте событие в процедуре ОбработкаОповещения нужной формы. Чтобы 1С:Предприятие запустилось само и выполнило действие, есть два пути: регламентное задание внутри базы или внешний запуск 1cv8.exe с ключом /Execute из планировщика Windows.
Механизмы общие для платформы 8.3, пути меню даны для типовых конфигураций на БСП (БП 3.0, ЗУП 3.1, УТ 11). Отдельно — почему задание «не запускается» в файловой базе, хотя в серверной работает.
Как устроены оповещения в 1С:Предприятии
Слово «оповещение» в 1С означает несколько разных механизмов. Их часто путают, поэтому сначала разведём.
| Механизм | Что делает | Где работает |
|---|---|---|
Оповестить() + ОбработкаОповещения | Сообщает открытым формам о событии | Только в текущем сеансе пользователя |
ОповеститьОбИзменении() | Перечитывает динамические списки объектов указанного типа | Текущий сеанс |
ПоказатьОповещениеПользователя() | Всплывающее окно в углу экрана | Текущий сеанс |
ОписаниеОповещения | Указывает, какую процедуру вызвать после закрытия диалога или окончания асинхронной операции | Клиент |
| Система взаимодействия | Сообщения и обсуждения между пользователями | Разные сеансы и пользователи |
Главное ограничение: Оповестить() не выходит за пределы сеанса. Бухгалтер в соседнем кабинете ваше событие не получит. Для межпользовательских сигналов нужна система взаимодействия, регистр с опросом по таймеру или механизмы БСП (например, «Напоминания пользователя»).
Все три клиентских метода вызываются только на клиенте. В серверной процедуре Оповестить() недоступен — сначала вернитесь на клиент, потом оповещайте.
Метод Оповестить на практике: связываем две формы
Типовая задача: пользователь открыл список заказов и форму клиента. В форме клиента поменяли статус — список должен обновиться без ручного «Обновить».
Шаг 1. Отправляем событие
В модуле формы-источника, после записи:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("Запись_Контрагент", Объект.Ссылка, ЭтотОбъект);
КонецПроцедуры
Три параметра:
- 🏷️ ИмяСобытия — произвольная строка. Договоритесь о правиле имён, например
Запись_<ИмяОбъекта>. - 📦 Параметр — любое значение: ссылка, структура, число.
- 🧭 Источник — обычно сама форма. По нему получатель отличает «своё» событие от чужого.
Шаг 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):
- Откройте
Администрирование → Обслуживание. - В группе «Регламентные операции» перейдите по ссылке «Регламентные и фоновые задания».
- Выберите задание, откройте его и включите флажок «Включено».
- Нажмите ссылку с расписанием и задайте интервал: ежедневно, по дням недели, с повтором внутри дня.
- Запишите задание. Кнопка «Выполнить сейчас» позволяет проверить его без ожидания.
Без БСП список заданий доступен через Все функции → Стандартные или внешней консолью заданий.
Создание задания в конфигураторе
- В дереве метаданных:
Общие → Регламентные задания → Добавить. - В поле «Имя метода» выберите экспортную процедуру общего модуля. Модуль должен выполняться на сервере.
- Флажок «Предопределенное» — задание появится в базе автоматически. Без него экземпляры создают программно.
- Задайте расписание и флажок «Использование».
Расписание из кода
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(
Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.ЗагрузкаКурсов));
Если Задания.Количество() > 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, чтобы задания не выполнялись в их сеансах и не тормозили работу. Если база опубликована на веб-сервере, задания может выполнять модуль расширения веб-сервера — это отдельная настройка публикации.
Серверная база: блокировка в консоли
Частая ситуация после копирования рабочей базы в тестовую: в копии включают блокировку регламентных заданий, чтобы тестовая база не отправила письма клиентам и не выгрузила платёжки в банк. Потом блокировку забывают снять уже в рабочей базе.
Проверка: консоль администрирования серверов → кластер → «Информационные базы» → свойства базы → флажок «Блокировка регламентных заданий включена». Включать или снимать его можно без остановки работы пользователей.
Не завершайте рабочие процессы и не перезапускайте службу агента сервера, чтобы «оживить» задание. Оборвутся сеансы всех пользователей кластера. Если без этого не обойтись — только в нерабочее время и после предупреждения сотрудников.