Как исправить аварийное завершение фонового задания при обновлении УТ 11 до версии 11.4.8?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Приветствуем вас, коллеги! Процесс обновления крупных типовых конфигураций «1С:Предприятие», таких как «Управление торговлей», редакция 11, часто преподносит неприятные сюрпризы. Одним из наиболее коварных сбоев является внезапное аварийное завершение рабочего процесса фонового задания при выполнении обработчиков обновления. Особенно часто это происходит на этапе работы обработчика РегистрыСведений.ПоставляемыеМакетыПечати.ОбновитьКонтрольнуюСуммуМакетов.

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

Анализируем симптомы проблемы

Давайте рассмотрим типичный сценарий. Вы запускаете обновление конфигурации «Управление торговлей» с релиза 11.4.7.150 на 11.4.8.73 (или аналогичные версии в рамках редакции 11.4) на платформе «1С:Предприятие 8.3» (например, 8.3.17.1549). База работает в клиент-серверном варианте. В процессе отработки отложенных обработчиков обновления система выдает критическую ошибку: «Аварийно завершился рабочий процесс фонового задания».

При этом вы можете столкнуться со следующими странностями:

  1. Журнал регистрации базы данных оказывается абсолютно пустым в момент падения.
  2. Технологический журнал не фиксирует явных исключений 1С перед падением процесса.
  3. Попытка запустить обновление в файловом режиме также приводит к «тихому» закрытию программы 1С без вывода понятных сообщений об ошибках.

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

Причина №1: Ошибки компиляции модулей расширений (Невидимый сбой)

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

На указанных версиях платформ существовал неприятный баг: если при компиляции фонового задания сервер сталкивался с ошибкой в модуле расширения, он не выводил диагностическое сообщение в Журнал регистрации, а мгновенно завершал работу процесса rphost по дампу памяти (unhandled exception). Из-за этого транзакция прерывалась до записи логов, оставляя администратора базы данных в полном неведении.

Как решить эту проблему:

  1. Откройте базу данных в режиме Конфигуратора.
  2. Перейдите в меню Конфигурация — Расширения конфигурации.
  3. Для каждого расширения выполните проверку возможности применения. Для этого нажмите кнопку «Проверить возможность применения» (или выберите соответствующий пункт в контекстном меню).
  4. Запустите синтаксический контроль модулей расширения. Все обнаруженные ошибки компиляции (несоответствия параметров функций, устаревшие вызовы) необходимо исправить.

Причина №2: Запрещенные символы в именах макетов расширений

Вторая и самая интересная причина связана непосредственно с работой обработчика РегистрыСведений.ПоставляемыеМакетыПечати.ОбновитьКонтрольнуюСуммуМакетов. Этот обработчик обходит все макеты печатных форм в системе, включая макеты, добавленные через расширения.

Для каждого макета расширения платформа формирует внутреннее системное имя по следующему шаблону:

Конфигурация <ИмяРасширения>: <ИмяМакета>

Намер, если у вас есть расширение с именем ДоработкиУТ и макетом ПланРабот, платформа сформирует строку: Конфигурация ДоработкиУТ: ПланРабот.

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

Проанализируем эту ситуацию с точки зрения операционной системы Windows. Символ двоеточия (:) в Windows является строго зарезервированным спецсимволом (используется для разделения дисков и путей или альтернативных потоков NTFS). Создать файл, содержащий двоеточие в имени, в Windows физически невозможно. Когда платформа 1С пытается передать операционной системе команду на запись временного файла с некорректным именем, происходит системный сбой на уровне C++ кода платформы, что мгновенно «роняет» рабочий процесс сервера без записи в Журнал регистрации.

Как решить проблему с именами макетов:

Посмотрим, как можно локализовать и устранить этот конфликт:

  1. Последовательное отключение расширений. Перейдите в список расширений в Конфигураторе и поочередно снимайте флаг «Активно» для нетиповых расширений. Запускайте обновление базы, чтобы вычислить конкретное расширение, вызывающее падение.
  2. Анализ макетов в проблемном расширении. Откройте структуру метаданных «подозреваемого» расширения и проверьте все добавленные макеты (особенно макеты печатных форм).
  3. Переименование или удаление конфликтующих элементов. Избегайте создания макетов с именами, которые могут спровоцировать генерацию некорректных путей файлов в ОС. Если макет переносится из основной конфигурации, убедитесь, что его имя не содержит лишних префиксов и спецсимволов.

Анализ программных попыток обхода проблемы

В процессе поиска решения разработчики часто пытаются обойти проблему программным путем, создавая собственные расширения-«заплатки» для перехвата транзакций в регистре ПоставляемыеМакетыПечати. Давайте посмотрим на пример такого кода, который, однако, не решает корневую проблему падения процесса, но хорошо иллюстрирует логику работы обработчика:


// Данный код иллюстрирует попытку безопасной записи в регистр сведений
Попытка
    БлокировкаДанных = Новый БлокировкаДанных;
    ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ПоставляемыеМакетыПечати");
    
    МенеджерЗаписи = РегистрыСведений.ПоставляемыеМакетыПечати.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ИмяМакета = Макет.Имя;
    МенеджерЗаписи.Объект = ИдентификаторОбъектаМетаданныхВладельца;
    МенеджерЗаписи.Прочитать();
    
    Если Не МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.ИмяМакета = Макет.Имя;
        МенеджерЗаписи.Объект = ИдентификаторОбъектаМетаданныхВладельца;
    КонецЕсли;
    
    Если МенеджерЗаписи.ВерсияМакета <> ВерсияМакета Тогда
        МенеджерЗаписи.ВерсияМакета = ВерсияМакета;
        МенеджерЗаписи.ПредыдущаяКонтрольнаяСумма = МенеджерЗаписи.КонтрольнаяСумма;
        МенеджерЗаписи.КонтрольнаяСумма = КонтрольнаяСумма;
        МенеджерЗаписи.Записать();
    КонецЕсли;
Исключение
    // Попытка зафиксировать ошибку без падения rphost
    ЗаписьЖурналаРегистрации("ОбновлениеМакетов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

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

Общие рекомендации по безопасному обновлению баз с расширениями

Чтобы избежать подобных аварийных ситуаций при будущих обновлениях УТ 11, ERP или Комплексной автоматизации, рекомендуем придерживаться следующих правил:

  1. Всегда отключайте нетиповые расширения перед обновлением. Снимите активность со всех расширений в Конфигураторе, выполните обновление конфигурации базы данных (F7) и запустите сеанс «1С:Предприятие» для выполнения всех отложенных обработчиков БСП. Только после того, как база данных полностью обновится до нового релиза, последовательно включайте расширения и адаптируйте их код под изменившиеся типовые объекты.
  2. Используйте стабильные релизы платформы. Если конфигурация требует платформу не ниже определенной версии, выбирайте проверенные и рекомендованные фирмой «1С» релизы. Например, ветка 8.3.16 во многих случаях оказывалась более стабильной при работе с расширениями по сравнению с первыми релизами ветки 8.3.17. Ошибки «тихого» падения компилятора в расширениях были исправлены разработчиками «1С» в более поздних сборках (начиная с 8.3.17.2231 и 8.3.18.1483).
  3. Перенос обновления в файловую базу. Если серверный процесс продолжает падать, выгрузите информационную базу в файловый вариант (dt-файл). Выполните обновление на локальном компьютере администратора под управлением рекомендованной 64-битной версии платформы, а затем загрузите обновленную базу обратно на сервер. Это исключит влияние серверных настроек сжатия и ограничений памяти.
  4. Настройка лимитов памяти на сервере 1С. В некоторых случаях падение фоновых заданий БСП связано с превышением лимита оперативной памяти. В консоли администрирования серверов 1С для рабочего сервера попробуйте временно задать параметр «Безопасный расход памяти за один вызов» (например, установить значение 9000000000 байт вместо 0), что поможет серверу корректно обрабатывать тяжелые фоновые транзакции без аварийного перезапуска рабочих процессов.

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

← На главную