Отложенная обработка данных в 1С: запуск, контроль и код
Содержание
Отложенные обработчики в типовой конфигурации запускаются сами: после обновления версии их выполняет регламентное задание «Отложенное обновление» в фоне. Проверить ход и перезапустить их можно в разделе Администрирование → Обслуживание → Обновление версии программы → Результаты обновления и дополнительная обработка данных.
Если обработка стоит на месте, причина почти всегда одна из трёх: в кластере включена блокировка регламентных заданий, в файловой базе никто не держит открытой программу или один из обработчиков упал с ошибкой. Каждую из них можно проверить за пару минут, а разработчику пригодятся приёмы отложенного запуска своего кода.
Что такое отложенные обработчики и чем они отличаются от обычных
Слово «отложенный» в 1С встречается в двух смыслах. Сначала определите, какой из них нужен вам.
📦 Отложенные обработчики обновления. Это механизм Библиотеки стандартных подсистем (БСП), на которой построены БП 3.0, ЗУП 3.1, УТ 11, ERP и другие типовые решения. При переходе на новую версию конфигурации данные нужно перестроить: заполнить новые реквизиты, перенести остатки в новые регистры, пересчитать итоги.
Часть этой работы выполняется сразу, при первом запуске после обновления. Остальное откладывается и идёт в фоне, пока пользователи уже работают.
⏳ Отложенный вызов кода. Это приёмы разработчика: выполнить процедуру через N секунд на клиенте, отправить тяжёлый расчёт в фоновое задание, поставить задачу по расписанию.
| Режим обработчика обновления | Когда выполняется | Пользователи могут работать |
|---|---|---|
| Монопольно | При первом запуске после обновления | Нет, база захвачена до завершения |
| Оперативно | При первом запуске, до завершения основного обновления | Вход ещё не открыт, но база не захвачена так жёстко, как при монопольном режиме |
| Отложенно | В фоне после завершения основного обновления | Да |
💡 Пока отложенная обработка не закончена, часть данных может показываться неполно. Например, новый отчёт строится по регистру, который ещё заполняется. Это не ошибка, а признак того, что фон ещё работает.
Как запустить отложенную обработку данных после обновления
В типовых конфигурациях ручной запуск обычно не нужен. Но если программа пишет, что дополнительная обработка данных не завершена, пройдите по шагам.
- Откройте
Администрирование → Обслуживание. - В группе «Обновление версии программы» перейдите по ссылке «Результаты обновления и дополнительная обработка данных».
- Посмотрите статус. Форма показывает, сколько обработчиков выполнено, сколько осталось и есть ли ошибки. Список обработчиков открывается по ссылке в этой же форме.
- Если обработка остановлена, запустите её командой из формы. Если стоит статус ошибки — сначала откройте подробности по обработчику (см. раздел про журнал ниже).
- Оставьте программу работать. Крупная база после большого обновления может обрабатываться от нескольких часов до суток.
Файловая база
В файловом варианте нет сервера, который крутит регламентные задания сам. Их выполняет один из запущенных клиентских сеансов.
- 🖥️ Пока программа открыта хотя бы у одного пользователя, обработка идёт.
- 🚪 Закрыли все окна 1С на ночь — обработка встала и продолжится при следующем входе.
- 🐢 Компьютер, на котором открыта 1С, работает медленнее: фон делит с вами процессор и диск.
Практичный приём: после обновления оставьте 1С открытой на одном компьютере на ночь и не выключайте его.
Клиент-серверная база
Здесь регламентные задания выполняет рабочий процесс сервера, клиент для этого не нужен. Если обработка не двигается, проверьте блокировку регламентных заданий:
- Откройте консоль администрирования серверов 1С:Предприятия.
- Найдите информационную базу в разделе «Информационные базы» кластера.
- Откройте её свойства и посмотрите флажок «Блокировка регламентных заданий включена».
- Если флажок стоит, а база рабочая, снимите его и сохраните.
Флажок часто ставят специально — на копиях рабочей базы. Если снять его на тестовой копии, она начнёт выполнять обмены, рассылки и загрузку банковских выписок наравне с рабочей. Снимайте блокировку только в той базе, где регламентные задания действительно должны работать.
Регламентное задание отложенного обновления: проверка и ручной запуск
Отложенную обработку данных выполняет конкретное регламентное задание. В конфигураторе оно лежит в ветке Общие → Регламентные задания под именем ОтложенноеОбновлениеИБ, в пользовательском режиме называется «Отложенное обновление».
Как проверить его состояние в пользовательском режиме:
- Откройте
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. - На вкладке регламентных заданий найдите «Отложенное обновление».
- Посмотрите колонки «Включено», дату последнего выполнения и состояние.
- Если задание выключено — включите. Чтобы не ждать расписания, выделите строку и выполните команду «Выполнить сейчас».
- На вкладке фоновых заданий видно, работает ли оно прямо сейчас и чем закончился прошлый запуск.
💡 Если в этом же списке у других заданий тоже давно нет запусков, проблема не в обработчиках, а в самом механизме регламентных заданий: блокировка в кластере, остановленный рабочий процесс или файловая база без открытых сеансов.
Как регламентное задание отличается от фонового
| Признак | Регламентное задание | Фоновое задание |
|---|---|---|
| Откуда берётся | Описано в метаданных конфигурации | Создаётся кодом в момент вызова |
| Когда стартует | По расписанию или по команде | Сразу после вызова |
| Где виден результат | В списке регламентных и в истории фоновых | Только в списке фоновых |
| Типичное применение | Обмены, отложенное обновление, загрузка курсов | Тяжёлый отчёт, групповая обработка |
Каждый запуск регламентного задания сервер выполняет как фоновое задание. Поэтому историю «Отложенного обновления» вы найдёте именно на вкладке фоновых.
Отложенный запуск процедуры на клиенте: ПодключитьОбработчикОжидания
Аналог таймера в 1С — обработчик ожидания. Он вызывает клиентскую процедуру через заданное число секунд, один раз или по кругу. Отдельного объекта «Таймер» во встроенном языке 1С 8.3 нет, эту роль играет метод ПодключитьОбработчикОжидания.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Однократно через 2 секунды, когда форма уже нарисована
ПодключитьОбработчикОжидания("ЗагрузитьДанныеОтложенно", 2, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьДанныеОтложенно()
ЗагрузитьДанныеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанныеНаСервере()
// тяжёлый запрос, который не должен тормозить открытие формы
КонецПроцедуры
Повторяющийся вызов, например проверка статуса раз в 10 секунд:
&НаКлиенте
Процедура НачатьОпрос()
ПодключитьОбработчикОжидания("ПроверитьСтатус", 10);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСтатус()
Если СтатусПолучен() Тогда
ОтключитьОбработчикОжидания("ПроверитьСтатус");
КонецЕсли;
КонецПроцедуры
Что нужно помнить про обработчики ожидания:
- ⏱️ Интервал задаётся в секундах, допускаются дробные значения.
- 🔁 Без третьего параметра
Истинаобработчик срабатывает повторно, пока его не отключат. - 🧩 Процедура должна быть клиентской и без параметров. В общем модуле она должна быть экспортной.
- 🚫 Пока выполняется серверный вызов из обработчика, интерфейс клиента ждёт. Обработчик ожидания откладывает старт, но не делает работу асинхронной.
Фоновые задания: запуск тяжёлого кода из программы
Если расчёт идёт минуты, его выносят в фоновое задание. Клиент сразу освобождается, а сервер считает в отдельном сеансе.
// Общий модуль РасчётыСервер (Сервер, экспортная процедура)
Процедура ПересчитатьОстатки(ДатаРасчета) Экспорт
// долгий расчёт
КонецПроцедуры
// Вызов с сервера
&НаСервереБезКонтекста
Функция ЗапуститьРасчет(ДатаРасчета)
Параметры = Новый Массив;
Параметры.Добавить(ДатаРасчета);
Задание = ФоновыеЗадания.Выполнить(
"РасчётыСервер.ПересчитатьОстатки",
Параметры,
"ПересчетОстатков",
"Пересчёт остатков");
Возврат Задание.УникальныйИдентификатор;
КонецФункции
Третий параметр — ключ. Пока активно задание с тем же ключом, второе такое же не запустится: платформа выдаст исключение. Это простая защита от двойного клика.
Проверка состояния по идентификатору:
&НаСервереБезКонтекста
Функция СостояниеЗадания(Идентификатор)
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
Если Задание = Неопределено Тогда
Возврат "Не найдено";
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Возврат "Выполняется";
ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
Возврат ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
КонецЕсли;
Возврат "Готово";
КонецФункции
Связка приёмов на практике: фоновое задание запускают с сервера, а на клиенте подключают обработчик ожидания, который раз в несколько секунд спрашивает состояние и показывает результат.
💡 В конфигурациях на БСП для этого есть готовый общий модуль ДлительныеОперации с функцией ВыполнитьВФоне. Он сам решает вопрос с передачей результата, прогрессом и файловым режимом. Писать обвязку с нуля стоит только в самописных конфигурациях.
Ручной запуск регламентного задания из кода
Метода «выполнить регламентное задание сейчас» у объекта РегламентноеЗадание нет. Обычный приём — запустить его метод фоновым заданием:
МетаЗадание = Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ;
ФоновыеЗадания.Выполнить(МетаЗадание.ИмяМетода, , , МетаЗадание.Синоним);
Для отложенного обновления так делать стоит только в отладке. В рабочей базе пользуйтесь формой «Результаты обновления»: она учитывает очередь и не даст запустить обработку дважды.
Свой отложенный обработчик обновления
Если вы дорабатываете конфигурацию на БСП, отложенные обработчики регистрируют в модуле обновления своей подсистемы, в процедуре ПриДобавленииОбработчиковОбновления.
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "1.0.2.1";
Обработчик.Процедура = "Документы.ЗаказКлиента.ЗаполнитьНовыйРеквизит";
Обработчик.РежимВыполнения = "Отложенно";
Обработчик.Идентификатор = Новый УникальныйИдентификатор("8f2c4a1e-3b7d-4c9a-9e6f-1a2b3c4d5e6f");
Обработчик.Комментарий = "Заполняет новый реквизит в заказах клиентов.";
Что обязательно для отложенного режима:
- Уникальный идентификатор. По нему БСП отслеживает, выполнен ли обработчик. Сгенерируйте новый GUID, не копируйте чужой.
- Комментарий. Его увидит администратор в списке обработчиков, пишите понятно.
- Порционность. Обрабатывайте данные частями, например по 1000 объектов за вызов, и сообщайте, всё ли сделано. Обработчик, который пытается за один вызов переписать миллион документов, держит блокировки и мешает пользователям.
- Повторный запуск без вреда. Обработчик может прерваться на середине и стартовать снова. Код должен пропускать уже обработанные объекты, а не задваивать данные.
Для параллельного режима БСП требует больше: процедуру заполнения данных для обновления, списки читаемых и изменяемых объектов и отметку выполнения через ОбновлениеИнформационнойБазы. Точный набор свойств зависит от версии БСП — сверяйтесь с документацией той редакции, которая встроена в вашу конфигурацию.
Ошибки отложенной обработки и где искать причину
Отложенный обработчик падает тихо: пользователь ничего не видит, а в форме результатов обновления появляется ошибка. Подробности лежат в журнале регистрации.
- Откройте
Администрирование → Обслуживание → Журнал регистрации. - Установите отбор по уровню «Ошибка» и по периоду после обновления.
- Найдите события обновления информационной базы. В комментарии будет имя процедуры обработчика и текст исключения.
- Перейдите по ссылке на объект, если она есть: часто падает один конкретный документ с битыми данными.
Логирование в своём коде
В собственных отложенных и фоновых процедурах пишите ошибки в журнал сами. Иначе причину сбоя придётся угадывать.
Попытка
ОбработатьПорцию();
Исключение
ЗаписьЖурналаРегистрации(
"МояПодсистема.ОтложеннаяОбработка",
УровеньЖурналаРегистрации.Ошибка,
,
,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
- 📝 Имя события задавайте с префиксом подсистемы — по нему удобно ставить отбор.
- 🔁
ВызватьИсключениев конце оставляет задание в состоянии «Завершено аварийно», и сбой не теряется. - 🧯 В платформе 8.3.17 и новее вместо глобальной функции можно использовать
ОбработкаОшибок.ПодробноеПредставлениеОшибки.
Если для ускорения вы завершаете зависший фоновый сеанс в консоли кластера, оборвётся только этот сеанс. Но если перезапускаете рабочий процесс или службу сервера 1С, отключатся все пользователи. Делайте это в нерабочее время и предупредите людей заранее.