Вопрос о том, как точно узнать время следующего запуска регламентного задания, часто возникает у разработчиков, работающих с файловым вариантом 1С. В условиях, когда интенсивная работа пользователей (например, пробитие чеков с ЕГАИС) пересекается с фоновой синхронизацией данных, возникают неприятные ошибки конфликта блокировок. Давайте разберем, почему «предсказать» время запуска невозможно и какие архитектурные подходы помогут нам решить эту проблему.
В файловом варианте 1С регламентные задания не имеют выделенного сервера планировщика. Они работают внутри сеанса пользователя. Это означает, что если в базе никто не работает, регламентные задания просто не выполняются. Запуск задания зависит от того, когда в системе появится свободный сеанс и когда сработает внутренний механизм платформы. Поэтому попытка «вычислить» время запуска с точностью до минуты — это не самый надежный путь, так как оно постоянно смещается.
Вместо того чтобы пытаться угадать время запуска регламентного задания, мы можем управлять самим процессом доступа к данным. Для этого идеально подходит механизм объектных блокировок Заблокировать(), который работает как программный «мьютекс» (сигнализатор занятости). Это решение не зависит от блокировок СУБД и надежно работает в файловой базе.
Реализация:
Заблокировать() для соответствующего элемента справочника.Таким образом, сеансы будут «договариваться» между собой, не создавая конфликтов при записи в общие таблицы.
Если нам нужно более тонкое управление, мы можем вынести логику контроля в отдельный регистр сведений ТормозаДляФоновых. Этот метод позволяет принудительно приостанавливать выполнение заданий, если кассир начал пробивать чек.
Разберем по шагам:
Пример логики проверки в модуле задания:
// Пример логики проверки возможности запуска
Если Не МенеджерРегистров.ПроверитьВозможностьЗапуска(ИмяЗадания) Тогда
Возврат; // Завершаем выполнение, если сейчас «часы пик» для кассира
КонецЕсли;
// Продолжаем выполнение обмена
ВыполнитьОбменЕГАИС();
Часто конфликты возникают из-за того, что запись присоединенного файла ЕГАИС происходит внутри той же транзакции, в которой создается документ. Чтобы этого избежать, рассмотрим следующие рекомендации:
ПоместитьВоВременноеХранилище) для подготовки данных, чтобы сократить время удержания блокировок на регистрах накопления и справочниках присоединенных файлов.Вместо попыток предсказать расписание, мы рекомендуем сфокусироваться на управлении доступом через «мьютексы». Если проблема с ЕГАИС критична, перенос обменов в отдельный сеанс или выделение их в независимую очередь (регистр «ОчередьОбменов») — это лучший архитектурный выбор для файловой базы. Это позволит кассирам работать бесперебойно, а обменам — выполняться в фоновом режиме, когда база не занята активным пробитием чеков.