В практике администрирования и сопровождения конфигураций на базе 1С:Предприятие 8.3 нередко встречаются ситуации, когда платформа аварийно завершает работу без внятного описания ошибки. Одной из самых распространенных и пугающих ошибок является "dump памяти" (crash dump), часто ссылающийся на библиотеку backend.dll. Такое поведение может навести на мысли о проблемах с лицензированием, аппаратными ключами защиты или повреждении файлов платформы.
Однако, как показывает детальный анализ подобных инцидентов, причина может крыться не в системном окружении, а в данных информационной базы и алгоритмах их обработки. В данной статье мы подробно разберем ситуацию, когда при попытке печати документов (в частности, Счет-фактуры) платформа "падает", и выясним, как диагностировать истинную причину — переполнение стека из-за рекурсии.
Давайте рассмотрим типичный сценарий, с которым сталкиваются пользователи и специалисты:
backend.dll.На первый взгляд кажется, что проблема техническая (драйверы, ОС, платформа). Однако, если мы углубимся в диагностику, то обнаружим, что корень зла часто кроется в логической ошибке данных.
Когда мы видим падение backend.dll, это означает, что внутренняя ошибка платформы не была перехвачена стандартными обработчиками исключений. Чтобы понять, что происходит "под капотом", нам необходимо использовать инструменты более глубокого анализа.
В рассматриваемом случае полезным оказалось проведение Тестирования и исправления (ТиИ) или запуск процедур проверки на сервере. В момент выполнения кода печати (или при проверке логической целостности) система может выдать более конкретную ошибку:
"Переполнение стека встроенного языка на сервере" (Stack Overflow).
Также эту ошибку можно отловить, настроив Технологический журнал (TechJournal) на сбор событий EXCP (исключения). В логах мы увидим цепочку вызовов, которая повторяется бесконечное количество раз, пока не закончится память стека.
Давайте разберем, почему переполнение стека вызывает падение платформы именно при печати. Процесс формирования печатной формы в конфигурации "Бухгалтерия предприятия 3.0" включает в себя сбор данных о подписантах:
Для получения этих данных используются регистры сведений, такие как ОтветственныеЛицаОрганизаций. Алгоритм работы программы часто подразумевает проверку иерархии. Например, если указана должность, нужно найти физическое лицо, занимающее эту должность. Если указано юрлицо как управляющая компания, нужно найти директора этой управляющей компании.
Суть проблемы:
Ошибка возникает из-за зацикливания рекурсии. Это происходит, когда данные в базе заведены некорректно, создавая замкнутый круг ссылок. Рассмотрим конкретные примеры:
Поскольку механизмы защиты от дурака (проверка на зацикливание) в типовых конфигурациях присутствуют не везде, платформа входит в бесконечный цикл вызова процедур, стек переполняется, и процесс аварийно завершается.
Теперь, когда мы понимаем механику сбоя, перейдем к исправлению. Нам нужно найти и устранить некорректные данные.
В первую очередь проверим настройки ответственных лиц. Для этого:
Ищите записи, где в полях "Руководитель", "Главный бухгалтер" или "Кассир" выбраны странные значения. Например, вместо физического лица выбрана сама организация (если тип данных поля составной) или выбрано физлицо, которое явно не подходит.
Если визуально проблема не обнаружена, нам поможет Отладчик. Этот метод требует навыков программирования, но он дает 100% результат.
Выполним следующие действия:
Если платформа падает раньше, чем срабатывает остановка, придется действовать методом "точек останова" (breakpoints). Поставим точку останова в модуле менеджера документа или в общем модуле УправлениеПечатью (или аналогичном, отвечающем за формирование печатных форм БП 3.0) перед моментом получения данных ответственных лиц.
Пройдем код пошагово (F11). Обратите внимание на вызовы функций типа:
// Примерный вид функции, где может быть зацикливание
Функция ПолучитьРуководителя(Организация)
// ... логика получения
Если ТипЗнч(Руководитель) = Тип("СправочникСсылка.Организации") Тогда
Возврат ПолучитьРуководителя(Руководитель); // Рекурсивный вызов
КонецЕсли;
// ...
КонецФункции
Если вы заметите, что выполнение кода постоянно возвращается в одну и ту же процедуру с одними и теми же параметрами — вы нашли место зацикливания. Проверьте значения переменных в табло — они укажут на конкретный объект справочника, который содержит некорректные ссылки.
Хотя в анализируемом случае основной причиной была рекурсия данных, нельзя исключать и технические аспекты, особенно если данные проверены и они корректны. Ошибка backend.dll на 64-битных платформах (8.3.23.x, 8.3.24.x) часто возникает из-за конфликта с драйверами принтеров.
Если исправление данных не помогло, попробуйте следующее:
Ошибка dump памяти при печати в 1С часто является следствием некачественных данных, введенных пользователями. Циклические ссылки в структуре подчиненности организаций или ответственных лиц приводят к бесконечной рекурсии и переполнению стека.
Рекомендуемый алгоритм действий:
Такой системный подход позволит вам сэкономить время, не прибегая к переустановке сервера и поискам несуществующих проблем с лицензиями.