Отложенная обработка данных в 1С: запуск, контроль и код

· 9 мин

Содержание

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

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

Что такое отложенные обработчики и чем они отличаются от обычных

Слово «отложенный» в 1С встречается в двух смыслах. Сначала определите, какой из них нужен вам.

📦 Отложенные обработчики обновления. Это механизм Библиотеки стандартных подсистем (БСП), на которой построены БП 3.0, ЗУП 3.1, УТ 11, ERP и другие типовые решения. При переходе на новую версию конфигурации данные нужно перестроить: заполнить новые реквизиты, перенести остатки в новые регистры, пересчитать итоги.

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

⏳ Отложенный вызов кода. Это приёмы разработчика: выполнить процедуру через N секунд на клиенте, отправить тяжёлый расчёт в фоновое задание, поставить задачу по расписанию.

Режим обработчика обновленияКогда выполняетсяПользователи могут работать
МонопольноПри первом запуске после обновленияНет, база захвачена до завершения
ОперативноПри первом запуске, до завершения основного обновленияВход ещё не открыт, но база не захвачена так жёстко, как при монопольном режиме
ОтложенноВ фоне после завершения основного обновленияДа

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

Как запустить отложенную обработку данных после обновления

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

  1. Откройте Администрирование → Обслуживание.
  2. В группе «Обновление версии программы» перейдите по ссылке «Результаты обновления и дополнительная обработка данных».
  3. Посмотрите статус. Форма показывает, сколько обработчиков выполнено, сколько осталось и есть ли ошибки. Список обработчиков открывается по ссылке в этой же форме.
  4. Если обработка остановлена, запустите её командой из формы. Если стоит статус ошибки — сначала откройте подробности по обработчику (см. раздел про журнал ниже).
  5. Оставьте программу работать. Крупная база после большого обновления может обрабатываться от нескольких часов до суток.

Файловая база

В файловом варианте нет сервера, который крутит регламентные задания сам. Их выполняет один из запущенных клиентских сеансов.

  • 🖥️ Пока программа открыта хотя бы у одного пользователя, обработка идёт.
  • 🚪 Закрыли все окна 1С на ночь — обработка встала и продолжится при следующем входе.
  • 🐢 Компьютер, на котором открыта 1С, работает медленнее: фон делит с вами процессор и диск.

Практичный приём: после обновления оставьте 1С открытой на одном компьютере на ночь и не выключайте его.

Клиент-серверная база

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

  1. Откройте консоль администрирования серверов 1С:Предприятия.
  2. Найдите информационную базу в разделе «Информационные базы» кластера.
  3. Откройте её свойства и посмотрите флажок «Блокировка регламентных заданий включена».
  4. Если флажок стоит, а база рабочая, снимите его и сохраните.

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

Регламентное задание отложенного обновления: проверка и ручной запуск

Отложенную обработку данных выполняет конкретное регламентное задание. В конфигураторе оно лежит в ветке Общие → Регламентные задания под именем ОтложенноеОбновлениеИБ, в пользовательском режиме называется «Отложенное обновление».

Как проверить его состояние в пользовательском режиме:

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

💡 Если в этом же списке у других заданий тоже давно нет запусков, проблема не в обработчиках, а в самом механизме регламентных заданий: блокировка в кластере, остановленный рабочий процесс или файловая база без открытых сеансов.

Как регламентное задание отличается от фонового

ПризнакРегламентное заданиеФоновое задание
Откуда берётсяОписано в метаданных конфигурацииСоздаётся кодом в момент вызова
Когда стартуетПо расписанию или по командеСразу после вызова
Где виден результатВ списке регламентных и в истории фоновыхТолько в списке фоновых
Типичное применениеОбмены, отложенное обновление, загрузка курсовТяжёлый отчёт, групповая обработка

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

Отложенный запуск процедуры на клиенте: ПодключитьОбработчикОжидания

Аналог таймера в 1С — обработчик ожидания. Он вызывает клиентскую процедуру через заданное число секунд, один раз или по кругу. Отдельного объекта «Таймер» во встроенном языке 1С 8.3 нет, эту роль играет метод ПодключитьОбработчикОжидания.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Однократно через 2 секунды, когда форма уже нарисована
    ПодключитьОбработчикОжидания("ЗагрузитьДанныеОтложенно", 2, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьДанныеОтложенно()
    ЗагрузитьДанныеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьДанныеНаСервере()
    // тяжёлый запрос, который не должен тормозить открытие формы
КонецПроцедуры

Повторяющийся вызов, например проверка статуса раз в 10 секунд:

&НаКлиенте
Процедура НачатьОпрос()
    ПодключитьОбработчикОжидания("ПроверитьСтатус", 10);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСтатус()
    Если СтатусПолучен() Тогда
        ОтключитьОбработчикОжидания("ПроверитьСтатус");
    КонецЕсли;
КонецПроцедуры

Что нужно помнить про обработчики ожидания:

  • ⏱️ Интервал задаётся в секундах, допускаются дробные значения.
  • 🔁 Без третьего параметра Истина обработчик срабатывает повторно, пока его не отключат.
  • 🧩 Процедура должна быть клиентской и без параметров. В общем модуле она должна быть экспортной.
  • 🚫 Пока выполняется серверный вызов из обработчика, интерфейс клиента ждёт. Обработчик ожидания откладывает старт, но не делает работу асинхронной.

Фоновые задания: запуск тяжёлого кода из программы

Если расчёт идёт минуты, его выносят в фоновое задание. Клиент сразу освобождается, а сервер считает в отдельном сеансе.

// Общий модуль РасчётыСервер (Сервер, экспортная процедура)
Процедура ПересчитатьОстатки(ДатаРасчета) Экспорт
    // долгий расчёт
КонецПроцедуры

// Вызов с сервера
&НаСервереБезКонтекста
Функция ЗапуститьРасчет(ДатаРасчета)
    Параметры = Новый Массив;
    Параметры.Добавить(ДатаРасчета);
    Задание = ФоновыеЗадания.Выполнить(
        "РасчётыСервер.ПересчитатьОстатки",
        Параметры,
        "ПересчетОстатков",
        "Пересчёт остатков");
    Возврат Задание.УникальныйИдентификатор;
КонецФункции

Третий параметр — ключ. Пока активно задание с тем же ключом, второе такое же не запустится: платформа выдаст исключение. Это простая защита от двойного клика.

Проверка состояния по идентификатору:

&НаСервереБезКонтекста
Функция СостояниеЗадания(Идентификатор)
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
    Если Задание = Неопределено Тогда
        Возврат "Не найдено";
    ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
        Возврат "Выполняется";
    ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
        Возврат ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
    КонецЕсли;
    Возврат "Готово";
КонецФункции

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

💡 В конфигурациях на БСП для этого есть готовый общий модуль ДлительныеОперации с функцией ВыполнитьВФоне. Он сам решает вопрос с передачей результата, прогрессом и файловым режимом. Писать обвязку с нуля стоит только в самописных конфигурациях.

Ручной запуск регламентного задания из кода

Метода «выполнить регламентное задание сейчас» у объекта РегламентноеЗадание нет. Обычный приём — запустить его метод фоновым заданием:

МетаЗадание = Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ;
ФоновыеЗадания.Выполнить(МетаЗадание.ИмяМетода, , , МетаЗадание.Синоним);

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

Свой отложенный обработчик обновления

Если вы дорабатываете конфигурацию на БСП, отложенные обработчики регистрируют в модуле обновления своей подсистемы, в процедуре ПриДобавленииОбработчиковОбновления.

Обработчик = Обработчики.Добавить();
Обработчик.Версия = "1.0.2.1";
Обработчик.Процедура = "Документы.ЗаказКлиента.ЗаполнитьНовыйРеквизит";
Обработчик.РежимВыполнения = "Отложенно";
Обработчик.Идентификатор = Новый УникальныйИдентификатор("8f2c4a1e-3b7d-4c9a-9e6f-1a2b3c4d5e6f");
Обработчик.Комментарий = "Заполняет новый реквизит в заказах клиентов.";

Что обязательно для отложенного режима:

  1. Уникальный идентификатор. По нему БСП отслеживает, выполнен ли обработчик. Сгенерируйте новый GUID, не копируйте чужой.
  2. Комментарий. Его увидит администратор в списке обработчиков, пишите понятно.
  3. Порционность. Обрабатывайте данные частями, например по 1000 объектов за вызов, и сообщайте, всё ли сделано. Обработчик, который пытается за один вызов переписать миллион документов, держит блокировки и мешает пользователям.
  4. Повторный запуск без вреда. Обработчик может прерваться на середине и стартовать снова. Код должен пропускать уже обработанные объекты, а не задваивать данные.

Для параллельного режима БСП требует больше: процедуру заполнения данных для обновления, списки читаемых и изменяемых объектов и отметку выполнения через ОбновлениеИнформационнойБазы. Точный набор свойств зависит от версии БСП — сверяйтесь с документацией той редакции, которая встроена в вашу конфигурацию.

Ошибки отложенной обработки и где искать причину

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

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

Логирование в своём коде

В собственных отложенных и фоновых процедурах пишите ошибки в журнал сами. Иначе причину сбоя придётся угадывать.

Попытка
    ОбработатьПорцию();
Исключение
    ЗаписьЖурналаРегистрации(
        "МояПодсистема.ОтложеннаяОбработка",
        УровеньЖурналаРегистрации.Ошибка,
        ,
        ,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;
  • 📝 Имя события задавайте с префиксом подсистемы — по нему удобно ставить отбор.
  • 🔁 ВызватьИсключение в конце оставляет задание в состоянии «Завершено аварийно», и сбой не теряется.
  • 🧯 В платформе 8.3.17 и новее вместо глобальной функции можно использовать ОбработкаОшибок.ПодробноеПредставлениеОшибки.

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

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

Можно ли работать в программе, пока идёт отложенная обработка?
Да. Для этого режим и придуман. Возможны замедление и неполные данные в отдельных отчётах до окончания обработки.
Нужно ли ждать завершения перед следующим обновлением?
Желательно. Если накатить новую версию поверх незавершённой обработки, очередь растёт, а при ошибке сложнее понять, какая версия её вызвала.
Почему на копии базы отложенная обработка не идёт?
На копиях обычно включена блокировка регламентных заданий в кластере. Для теста обновления запустите обработку из формы результатов обновления или временно снимите блокировку, отключив перед этим обмены.
Сколько длится отложенная обработка?
Зависит от объёма базы и списка обработчиков. Небольшая база управляется за минуты, база с несколькими годами учёта крупной компании — за часы или сутки.
Чем обработчик ожидания отличается от фонового задания?
Обработчик ожидания откладывает вызов на клиенте, но код всё равно выполняется в сеансе пользователя. Фоновое задание выполняется отдельным сеансом на сервере и не блокирует интерфейс.