При доработке типовых конфигураций через механизм расширений разработчики нередко сталкиваются с ситуацией, когда на тестовой копии информационной базы доработка функционирует безупречно, а в рабочей базе при вызове перехваченного обработчика происходит мгновенный вылет программы с системным сообщением «Прекращена работа программы». При этом платформа не генерирует стек ошибок 1С, синтаксический контроль проходит успешно, а отладчик даже не успевает остановиться на точке останова.
Разберем детально природу данной проблемы, выясним, почему ядро платформы 1cv8.exe аварийно завершает работу при выполнении кода расширений в файловых базах данных, и рассмотрим пошаговый алгоритм устранения неполадки.
Проанализируем технические причины, приводящие к падению хост-процесса платформы (чаще всего с кодом системного исключения Windows 0xC0000005 — Access Violation):
&Вместо, &После, &Перед или &ИзменениеИКонтроля платформа связывает байт-код основной конфигурации с кодом расширения на уровне ядра C++. Если во внутренних таблицах метаданных (Config, ConfigCAS) накопились бинарные несоответствия или устаревшие ссылки на старые версии объектов расширения, обращение по невалидному указателю памяти приводит к мгновенному падению процесса.1Cv8.1CD: Файловые базы данных могут иметь старый формат хранения (формат 8.2.14 с фиксированным размером страницы 4 Кб) или современный формат (версии 8.3.8 и выше с переменным размером страниц от 8 до 64 Кб). Если рабочая база многократно обновлялась без промежуточной выгрузки в файл .dt, работа механизма расширений с таблицами базы может вызывать сбой в библиотеке dbeng8.dll.РежимСовместимости установлено в одно значение, а расширение было создано или скопировано с другим режимом совместимости, механизм связывания контекстов форм и модулей работает некорректно.Как показывает практика, простое переподключение или повторная загрузка файла конфигурации расширения (.cfe) не всегда очищает поврежденные бинарные связи во внутренней структуре базы. Наиболее эффективным и быстрым решением является генерация нового расширения с чистым системным идентификатором.
Разберем по шагам, как правильно выполнить эту процедуру:
Конфигурация → Расширения конфигурации..cfe через меню Действия → Сохранить конфигурацию в файл.Проверим, чтобы свойства Назначение (например, Адаптация) и Режим совместимости строго соответствовали режиму совместимости основной конфигурации.
Посмотрим на типовой пример перехвата обработчика, переносимого в новое расширение:
&Вместо("ОбработатьШтрихкод")
Функция Расш_ОбработатьШтрихкод(ДанныеШтрихкода, ПараметрыСканирования)
// Выполняем проверку входящих данных
Если ДанныеШтрихкода = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
СтрокаШтрихкода = СокрЛП(Строка(ДанныеШтрихкода));
// Вызов стандартной логики при необходимости или собственная реализация
Результат = ПродолжитьВызов(СтрокаШтрихкода, ПараметрыСканирования);
Возврат Результат;
КонецФункции
F7).Если информационная база работает в файловом режиме, необходимо убедиться, что физическая структура файла 1Cv8.1CD соответствует актуальному формату платформы 8.3.
Рассмотрим порядок использования утилиты cnvdbfl.exe:
1Cv8.1CD.C:\Program Files\1cv8\8.3.XX.XXXX\bin\).1Cv8.1CD нашей рабочей базы.8.2.14, выберем целевую версию 8.3.8 (или выше) и размер страницы 8192 (или 65536 байт).Операция выгрузки базы данных в файл .dt и последующая загрузка в пустую информационную базу полностью реструктурирует физический файл 1Cv8.1CD, удаляет накопленный мусор в таблицах динамического обновления и восстанавливает целостность метаданных.
Разберем последовательность действий:
Администрирование → Выгрузить информационную базу....Администрирование → Загрузить информационную базу..., выбрав ранее созданный .dt файл.Для исключения физических повреждений таблиц и устранения конфликтов локального кэша выполним следующие шаги:
bin установленной платформы запустим утилиту chdbfl.exe.%LocalAppData%\1C\1cv8\
%AppData%\1C\1cv8\
Если после выполнения вышеописанных действий падение сохраняется, проанализируем системные журналы:
Просмотр событий → Журналы Windows → Приложение. Найдем событие с источником Application Error для процесса 1cv8.exe. Имя сбойного модуля (например, backend.dll, dbeng8.dll или core83.dll) укажет на компонент ядра, вызвавший исключение.logcfg.xml в каталоге настроек платформы со следующим содержимым:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<dump location="C:\1C_Dumps" create="1" type="2"/>
<log location="C:\1C_Logs" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Комплексный подход, включающий пересоздание расширения с новым GUID, выравнивание режимов совместимости и конвертацию формата файловой базы через cnvdbfl / .dt, гарантированно устраняет аварийные завершения 1С:Предприятия при выполнении перехваченных процедур.