Каждый разработчик или администратор системы 1С рано или поздно сталкивается с малоинформативными записями в журнале регистрации (ЖР). Одной из самых загадочных является ошибка вида «форма.форма.форма (номер строки)». Она не указывает на конкретный документ, справочник или отчет, что ставит в тупик даже опытных специалистов. В этой статье мы подробно разберем, что скрывается за этой формулировкой, почему платформа выдает именно такой текст и как пошагово локализовать проблему.
Прежде всего, проанализируем структуру этой записи. В нормальной ситуации журнал регистрации выводит полный путь к объекту метаданных, например: Справочник.Номенклатура.Форма.ФормаЭлемента.Форма. Однако, когда платформа не может однозначно сопоставить исполняемый в данный момент код с деревом метаданных конфигурации, она использует универсальный «заглушечный» путь.
Рассмотрим подробнее, что означает каждое слово в этой цепочке:
Выясним основную причину появления такой записи. Чаще всего это происходит при работе с внешними обработками (.epf) или внешними отчетами (.erf). Когда пользователь открывает файл напрямую через «Файл — Открыть» или когда обработка запускается программно из временного хранилища (например, через механизм дополнительных отчетов и обработок), платформа загружает ее в память как временный объект. Если в этот момент происходит критическая ошибка, система не всегда может «вспомнить» исходное имя файла и записывает в журнал технический путь модуля.
Если мы видим красную строку в ЖР, не стоит ограничиваться изучением только её одной. Разберем алгоритм поиска через связанные события:
Внешняя обработка. Запуск или Дополнительный отчет или обработка. Запуск.Проанализируем ситуацию: если мы видим, что перед ошибкой пользователь запускал «ЗагрузкаДанныхИзExcel.epf», то с высокой долей вероятности 161-я строка находится именно в модуле формы этой обработки.
Когда стандартный журнал регистрации бессилен, на помощь приходит Технологический журнал (ТЖ). В отличие от ЖР, ТЖ фиксирует все исключения (exceptions) на уровне платформы с полным стеком вызовов. Это позволяет увидеть реальный путь к файлу, даже если он находится во временной папке пользователя.
Для настройки сбора нужных данных создадим или отредактируем файл logcfg.xml в каталоге настроек платформы (обычно C:\Program Files\1cv8\conf). Разберем пример конфигурации для отлова нашей ошибки:
<config xmlns="http://v8.1c.ru/7.4/config">
<log location="C:\LOGS\ERROR_TRACE" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="EXCPCNTX"/>
</event>
<property name="all"/>
</log>
</config>
После активации этой настройки платформа начнет записывать все исключительные ситуации в указанный каталог. В лог-файле ищите событие EXCP. Там будет указан не только текст ошибки, но и полный путь к модулю. Вместо безликого форма.форма.форма вы увидите что-то вроде ExternalDataProcessor.ИмяОбработки.Form.Module(161).
Если вы можете воспроизвести ошибку под своим пользователем, это кратчайший путь к решению. Рассмотрим, как правильно настроить отладчик:
Посмотрим на пример кода, который часто вызывает подобные падения на строке 161 при работе с формами:
&НаКлиенте
Процедура ВыполнитьЗагрузку()
// Предположим, это строка 161
Объект.ДанныеЗагрузки.Очистить();
// Ошибка может возникнуть, если Объект.ДанныеЗагрузки — это Неопределено
// или если форма потеряла связь с данными.
КонецПроцедуры
Если у вас есть подозрение, что ошибка происходит в одной из многочисленных внешних обработок, хранящихся на диске, можно воспользоваться поиском по содержимому файлов. Выясним причину, используя номер строки (161). Хотя номер строки может меняться от версии к версии, он является хорошим зацепом.
Рекомендуется использовать инструменты типа Total Commander или специализированные утилиты поиска текста. В поле «Поиск текста» введите уникальный фрагмент кода, который вы ожидаете увидеть в проблемном месте (если примерно понимаете контекст задачи), либо просто просканируйте каталог с обработками на наличие файлов, где в модуле формы количество строк превышает 161.
Чтобы в будущем не тратить часы на расшифровку подобных записей, придерживайтесь следующих правил при разработке:
ФормаНастройки, ФормаЗагрузки и т.д. Это поможет идентификации.Попытка...Исключение в критических узлах кода. В блоке Исключение записывайте в ЖР собственное подробное описание ошибки с помощью метода ЗаписатьСобытиеЖурналаРегистрации().Таким образом, мы выяснили, что таинственная ошибка — это всего лишь следствие работы платформы с объектами, не имеющими жесткой привязки к дереву конфигурации. Используя комплексный подход из анализа ЖР, настройки технологического журнала и отладки, вы сможете быстро найти «виновника» и исправить проблемный код.