Каждый администратор и разработчик систем на базе 1С:Предприятие рано или поздно сталкивается с ситуацией, когда стабильно работающая система после рядового обновления начинает вести себя непредсказуемо. Одной из наиболее опасных и неприятных проблем является аварийное завершение рабочих процессов сервера 1С (падение rphost.exe). При этом пользователи видят пугающее сообщение: «На сервере 1С:Предприятия произошла неисправимая ошибка. Приложение будет закрыто».
В этой статье мы подробно разберем природу этого сбоя на примере конкретного кейса в конфигурации 1С:ERP Управление предприятием, проанализируем системные логи операционной системы Windows, выясним, почему безобидная на первый взгляд директива расширения &ИзменениеИКонтроль может мгновенно «уронить» сервер, и рассмотрим пошаговый алгоритм решения и профилактики этой проблемы.
Рассмотрим сценарий, в котором воспроизводится ошибка. При попытке пользователя открыть список макетов печатных форм (или сформировать саму печатную форму) в ERP происходит мгновенный вылет клиентского сеанса. В технологический журнал 1С записываются следующие события:
Неспецифицированная ошибка работы с ресурсом
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
e0417abc-63b4-461b-b1b6-01d2d2b0cca5: На сервере 1С:Предприятия произошла неисправимая ошибка. Приложение будет закрыто
Давайте проанализируем ситуацию и выясним, что означает обращение к ресурсу /e1cib/logForm. Этот внутренний технический адрес используется тонким клиентом 1С для отправки на сервер отчетов об ошибках, дампов и данных о состоянии интерфейса. Когда на клиенте происходит локальный сбой (например, не удается корректно отрисовать форму), клиент пытается отправить отчет об этом на сервер через POST-запрос. Однако в этот самый момент рабочий процесс сервера rphost.exe уже аварийно завершил свою работу. Запрос зависает, клиент получает сетевой тайм-аут и выдает общую ошибку работы с веб-ресурсом. Таким образом, сообщение о запросе к logForm — это лишь следствие, а истинная причина скрывается глубже, в самом сервере приложений.
Чтобы понять, что именно заставило серверный процесс закрыться, обратимся к журналу событий Windows (Event Viewer) в раздел «Приложение» (Application). Там мы обнаружим записи о сбоях процесса rphost.exe со следующими параметрами:
Запись №1: Сбой в модуле ntdll.dll
rphost.exentdll.dll0xc00003740x00000000000f1cd0Запись №2: Сбой в модуле ucrtbase.dll
rphost.exeucrtbase.dll0xc00004090x000000000006d088Проанализируем эти коды ошибок с точки зрения системного программирования:
Такое поведение однозначно указывает на критическую программную ошибку (баг) внутри бинарного кода самой платформы 1С:Предприятие при обработке определенных метаданных или программных модулей.
Директива &ИзменениеИКонтроль — это мощный инструмент расширений, который позволяет точечно изменять код типовых процедур и функций конфигурации-донора. Платформа берет на себя задачу по слиянию исходного кода и изменений разработчика на лету в момент компиляции модуля.
Однако механизм синтаксического анализа и сопоставления текста модулей в платформе 1С:Предприятие (особенно в версиях 8.3.15, 8.3.16 и ранних сборках 8.3.17) содержит критические уязвимости:
#Вставка и #Удаление. Если при редактировании в расширении случайно закрался лишний символ перевода строки, пробел, символ табуляции или произошло смешение кодировок символов конца строки (CRLF и LF), парсер платформы может не сопоставить блоки кода.rphost.exe уходит в неконтролируемую рекурсию или некорректно очищает деструкторы объектов C++. Это приводит к повреждению кучи (Heap Corruption) или переполнению стека (Stack Buffer Overrun). В результате весь процесс rphost.exe падает.Рассмотрим подробнее шаги, которые необходимо выполнить для локализации и исправления данной ошибки.
Если в вашей системе установлено несколько расширений конфигурации, необходимо определить, какое из них вызывает крах сервера. Для этого выполните следующие действия:
Поскольку парсер директивы &ИзменениеИКонтроль нестабилен при определенных изменениях в типовом коде, наиболее надежным решением является перевод дорабатываемого метода на использование директивы &Вместо с использованием механизма безопасного перенаправления вызова.
Рассмотрим пример. Допустим, в расширении в модуле менеджера макета печатной формы у вас был следующий проблемный код:
&Вместо("СформироватьПечатнуюФорму")
Процедура Расш1_СформироватьПечатнуюФорму(ПараметрыДанных, Макет, Результат)
// Наш измененный код макета
// ...
КонецПроцедуры
Если вы полностью заменяете код метода, это может усложнить будущие обновления. Чтобы этого избежать, используйте конструкцию с вызовом оригинального метода с помощью системной функции ПродолжитьВызов(). Посмотрим на пример безопасной реализации:
&Вместо("СформироватьПечатнуюФорму")
Процедура Расш1_СформироватьПечатнуюФорму(ПараметрыДанных, Макет, Результат)
// Выполняем предварительную подготовку данных, если требуется
ПараметрыДанных.Вставить("ДополнительноеСвойство", Истина);
// Вызываем оригинальный метод конфигурации-донора
ПродолжитьВызов(ПараметрыДанных, Макет, Результат);
// Выполняем постобработку результата (например, модифицируем сформированный табличный документ)
Если Результат <> Неопределено Тогда
МодифицироватьПечатнуюФорму(Результат);
КонецЕсли;
КонецПроцедуры
Использование директивы &Вместо совместно с ПродолжитьВызов() решает сразу две задачи: полностью исключает использование нестабильного парсера &ИзменениеИКонтроль и сохраняет модульность кода, сводя к минимуму проблемы при последующих обновлениях ERP.
После изменения кода в расширении крайне важно очистить кэш сервера 1С:Предприятия. Дело в том, что скомпилированные бинарные файлы модулей расширений кэшируются сервером. Если в кэше зависли поврежденные структуры, сервер может продолжить падать даже после исправления кода в конфигураторе.
Выполните очистку кэша по следующей схеме:
Агент сервера 1С:Предприятия) через консоль управления службами services.msc.C:\Program Files\1cv8\srvinfo\reg_1541\ (или другой порт, если используется нетиповая настройка).snccntry (это кэш сеансов данных) и полностью удалите их содержимое.AppData\Local\Temp в профиле пользователя USR1CV8).Чтобы минимизировать риск возникновения критических неисправимых ошибок сервера 1С в будущем, рекомендуем придерживаться следующих правил разработки и администрирования:
&ИзменениеИКонтроль, никогда не форматируйте вручную строки за пределами инструкций #Вставка и #Удаление. При подозрении на сбои скопируйте оригинальный текст метода из конфигурации-донора и текст из расширения во внешний текстовый редактор (например, Notepad++ с плагином Compare) и убедитесь, что они совпадают байт в байт.rphost.exe при компиляции расширений уже устранены.