#std760

Ограничения на регламентные задания при работе в модели сервиса

1.

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

Иначе при большом количестве областей данных в одной ИБ разделенные регламентные задания перегружают рабочие процессы и существенно затрудняют работу пользователей сервиса.

2.

Если нужно регулярно выполнять программный код в приложениях пользователя в разделенной ИБ, используйте подсистему БТС Очередь заданий или аналогичный механизм очереди.

2.1.

Пример № 1.

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

Добавьте в конфигурацию предопределенное регламентное задание ПересчетИтогов.

Неправильно

Включить добавленное задание в состав общих реквизитов, разделяющих данные.

Правильно

  • Исключить добавленное задание из состава общих реквизитов, разделяющих данные.
  • В общем модуле ОчередьЗаданийПереопределяемый в процедуру ПриПолученииСпискаШаблонов добавить:
Шаблоны.Добавить(Метаданные.РегламентныеЗадания.ПересчетИтогов.ИмяМетода);
2.2.

Пример № 2.

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

Неправильно

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

Правильно

  • Добавить в конфигурацию непредопределенное регламентное задание ОбменССайтом.
  • Исключить это задание из состава общих реквизитов, разделяющих данные.
  • В общем модуле ОчередьЗаданийПереопределяемый в процедуру ПриОпределенииПсевдонимовОбработчиков добавить:
СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ОбменССайтом.ИмяМетода);
  • При включении функциональной опции Обмен с сайтом добавить задание или включить его использование через:
  • РегламентныеЗаданияСервер.ДобавитьЗадание - если задания еще нет;
  • РегламентныеЗаданияСервер.ИзменитьЗадание - если задание есть, но использование выключено.
  • При выключении функциональной опции удалить задание или отключить его использование через:
  • РегламентныеЗаданияСервер.УдалитьЗадание - если задание существует;
  • РегламентныеЗаданияСервер.ИзменитьЗадание - если задание существует и использование включено.
2.3.

Пример № 3.

Задание из примера № 2 нужно выполнять от имени определенного пользователя.

Неправильно

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

Правильно

  • Добавить в конфигурацию регламентное задание, исключенное из состава общих реквизитов, разделяющих данные.
  • Создать задание через РегламентныеЗаданияСервер.ДобавитьЗадание, передав в параметрах имя пользователя.
3.

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

Для управления заданиями используйте программный интерфейс БСП из модуля РегламентныеЗаданияСервер.

Неправильно

// Ищем задание по наименованию.
Отбор = Новый Структура();
Отбор.Вставить("Метаданные", "ПроверкаЦен");
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);

// Проверяем, что задание найдено.
Если Задания.Количество() <> 1 Тогда
    // Запись в журнал ошибки опущена.
    Возврат;
КонецЕсли;

// Включаем найденное задание.
НашеЗадание = Задания[0];
НашеЗадание.Использование = Истина;
НашеЗадание.Записать();

Правильно

// Ищем задание по наименованию.
Отбор = Новый Структура();
Отбор.Вставить("Метаданные", "ПроверкаЦен");
Задания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор);

// Проверяем, что задание найдено.
Если Задания.Количество() <> 1 Тогда
    // Запись в журнал ошибки опущена.
    Возврат;
КонецЕсли;

// Включаем найденное задание.
НашеЗадание = Задания[0];
Параметры = Новый Структура();
Параметры.Вставить("Использование", Истина);
РегламентныеЗаданияСервер.ИзменитьЗадание(НашеЗадание.УникальныйИдентификатор, Параметры);
4.

Подсистема Очередь заданий не гарантирует выполнение задания строго по расписанию.

Точность зависит от:

  • общего количества запланированных заданий;
  • длительности их выполнения;
  • количества исполняющих потоков (регулируется константой Максимальное количество исполняющихся фоновых заданий).
4.1.

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

4.2.

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

  • Если можно настроить push-уведомления от внешней системы, не используйте регламентное задание:
  • загружайте данные только при получении уведомления;
  • отправляйте данные только при реальной потребности. Пример push-доставки есть в Системе взаимодействий при приеме входящего SIP-звонка.
  • В остальных случаях оставьте регламентное задание (через очередь заданий), но оперативное получение и отправку данных выполняйте тогда, когда пользователь фактически работает в нужном рабочем месте.

Пример: отправка и получение почты должны выполняться раз в 5 минут, но в нагруженной сервисной базе задание запускается раз в 1 ч. 40 мин, что неприемлемо.

В таком случае организуйте оперативную работу с почтой так:

  • регламентное задание отправки и получения почты работает с периодичностью, которую дает очередь заданий;
  • при открытии списка писем выполняется разовая дозагрузка и отправка писем для доступных пользователю учетных записей (*);
  • клиентский обработчик ожидания выполняет регулярную отправку и получение писем с нужной периодичностью независимо от очереди заданий (*).

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

Для информации

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

#acc:453 #acc:454 #acc:455

Источник

https://its.1c.ru/db/v8std#content:760