В практике разработчика 1С часто встречается ситуация: внешняя обработка, идеально работающая при ручном запуске, начинает выдавать странные ошибки при переносе в регламентные задания. Одной из самых загадочных является ошибка «Вход в программу временно невозможен в связи с обновлением на новую версию». При этом база может не обновляться месяцами, а ручной запуск той же логики проходит без нареканий. В данной статье мы подробно разберем, почему возникает эта ошибка, как она связана с механизмами безопасности БСП и как правильно настроить выполнение фоновых заданий для внешних обработок.
Для начала проанализируем саму суть сообщения об ошибке. В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11, ERP или Комплексная автоматизация, существует жесткий механизм контроля доступа в момент инициализации сеанса. Когда запускается фоновое задание, система создает новый сеанс и выполняет ряд проверок в Модуле сеанса и процедурах инициализации параметров сеанса.
Если в процессе этой инициализации происходит критический сбой или отказ в доступе к системным константам (например, к тем, что хранят состояние обновления конфигурации), система «паникует». Вместо того чтобы выдать подробную техническую информацию, которая может быть небезопасна, БСП подставляет стандартную заглушку: «Вход невозможен, идет обновление». На самом деле, в 90% случаев это означает, что код не смог прочитать нужные данные из-за нехватки прав.
Рассмотрим ключевой момент, который часто упускают разработчики. При регистрации внешней обработки в справочнике Дополнительные отчеты и обработки по умолчанию часто устанавливается флаг «Безопасный режим». Рассмотрим подробнее, к чему это приводит:
Выполнить(), работа с файловой системой на сервере, COM-объекты и, самое главное, игнорируется установка привилегированного режима.УстановитьПривилегированныйРежим(Истина).Документы.ЗаказПокупателя.СоздатьДокумент() внутри типовых механизмов произойдет попытка повышения прав. Платформа молча проигнорирует этот запрос, код продолжит выполнение с правами «пустого» пользователя фонового задания, наткнется на закрытый объект или защищенный регистр и вызовет исключение.Это исключение внутри системных модулей и приводит к тому, что сеанс считается «битым», и пользователь получает сообщение о блокировке базы.
Самое простое и эффективное решение, если вы доверяете коду своей обработки — это отключение безопасного режима. Разберем по шагам, как это сделать:
После этого регламентное задание будет запускаться с возможностью использования привилегированного режима, что позволит типовым модулям БСП корректно инициализировать окружение.
Проанализируем ситуацию с пользователем. По умолчанию регламентные задания в серверном варианте могут запускаться от имени «пустого» пользователя (системного). Если ваша логика предполагает создание документов, проведение сделок или изменение остатков, прав пустого пользователя может быть недостаточно, даже если внутри кода используется привилегированный режим (так как не все проверки можно обойти привилегиями).
Рекомендуется создать специального служебного пользователя. Выполним следующие действия:
Пользователи запись, например, «Робот_Заказы».Это гарантирует, что при старте фонового задания параметры сеанса (такие как ТекущийПользователь) будут заполнены корректно, и проверки в подсистеме прав доступа пройдут успешно.
Если вышеописанные действия не помогают, нам нужно выяснить истинную причину исключения. Рассмотрим методы отладки фоновых заданий:
Метод 1: Ручная запись в Журнал регистрации
Обернем основной код выполнения команды в блок Попытка...Исключение. Это позволит нам выхватить реальный текст ошибки до того, как его «проглотит» система инициализации.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Попытка
// Ваша основная логика создания документа
СоздатьДокументыНаОснованииЗаказов();
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("ВнешняяОбработка.ОшибкаВыполнения",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Произошла ошибка: " + ТекстОшибки);
ВызватьИсключение; // Пробрасываем ошибку дальше, чтобы задание пометилось как невыполненное
КонецПопытки;
КонецПроцедуры
Метод 2: Отладка фонового задания в Конфигураторе
Для того чтобы «поймать» выполнение кода регламентным заданием, проделаем следующее:
-debug.Если ваша база работает в облаке или на строго настроенном сервере, простого отключения безопасного режима в интерфейсе может быть недостаточно. На уровне кластера серверов 1С могут быть настроены Профили безопасности. Проанализируем этот момент:
Если для информационной базы назначен профиль безопасности, то внешняя обработка, даже с выключенным флагом «Безопасный режим», все равно будет ограничена правилами этого профиля. В этом случае необходимо либо добавить разрешение на использование привилегированного режима в профиль, либо расширить права доступа к конкретным ресурсам (COM, файлам) в настройках кластера через консоль администрирования (MMC).
Чтобы избежать подобных проблем в будущем, при разработке механизмов для запуска по расписанию стоит придерживаться следующих правил:
ДополнительныеОтчетыИОбработки.ПараметрыСеанса.ТекущийПользователь, убедитесь, что под пустым пользователем этот код не «упадет».Таким образом, выясним причину: ошибка «Вход в программу временно невозможен...» является следствием неудачной инициализации сеанса из-за ограничений безопасного режима. Снятие этого режима и назначение конкретного пользователя для выполнения задания решают проблему в подавляющем большинстве случаев.