Типичная проблема, с которой сталкиваются разработчики и администраторы 1С при поддержке нетиповых или отраслевых конфигураций — это появление ошибок в модулях внешних обработок, которые физически отсутствуют на диске и не зарегистрированы в стандартном справочнике «Дополнительные отчеты и обработки». В коде конфигурации мы видим прямое обращение к объекту, например, через конструкцию ПолучитьФорму("ВнешняяОбработка.ИмпортДанныхУправляемая.Форма"), но сама обработка как будто растворилась в воздухе.
В этой статье мы подробно разберем внутренние механизмы платформы 1С:Предприятие, объясним, как система работает с динамически подключаемыми файлами, и рассмотрим четыре практических способа найти, перехватить и сохранить исходный файл .epf для последующего анализа и исправления ошибок.
Для того чтобы платформа 1С могла выполнить метод ПолучитьФорму для внешней обработки, эта обработка должна быть предварительно зарегистрирована в оперативной памяти текущего сеанса. Это действие всегда выполняется с помощью вызова менеджера внешних обработок. Разработчики используют метод Подключить:
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьИлиАдресХранилища, "ИмпортДанныхУправляемая");
Если в метод Подключить вторым параметром передано имя "ИмпортДанныхУправляемая", то в дальнейшем система будет обращаться к ней именно по этому уникальному имени. Выясним, откуда именно загружается файл, выполнив глобальный поиск по конфигурации.
Проанализируем последовательность действий для поиска точки подключения:
.Подключить( или ВнешниеОбработки.Подключить.Этот простой шаг позволит нам найти конкретную строку кода, которая инициализирует обработку. В этой строке мы сразу увидим источник двоичных данных: это может быть макет конфигурации, реквизит справочника, константа или путь к файлу на сервере.
Если нам известна точная строка, на которой падает программа — например, в нашем случае это строка 7408 модуля объекта внешней обработки с ошибкой конструктора ОписаниеТипов — мы можем извлечь обработку напрямую из конфигуратора во время сеанса отладки. Даже если у нас нет физического файла на диске, платформа хранит его декомпилированный код в памяти отладчика.
Разберем по шагам, как перехватить управление и сохранить виртуальный модуль:
.epf.Теперь в нашем распоряжении есть полноценный файл внешней обработки, который мы можем открыть в конфигураторе как самостоятельный объект, отредактировать и исправить логику работы.
Когда платформа 1С подключает внешнюю обработку (даже если двоичные данные извлекаются динамически из базы данных или макета), операционная система физически распаковывает файл обработки на локальный диск для исполнения кода. Нам достаточно «поймать» этот файл в системной папке до того, как сеанс 1С будет закрыт и временные файлы удалятся.
Выясним особенности размещения временных файлов:
C:\Users\<ИмяПользователя>\AppData\Local\Temp\.USR1CV8).Рассмотрим алгоритм перехвата файла:
Temp на компьютере (или на сервере), чтобы облегчить последующий поиск.Temp и отсортируем все файлы по дате и времени изменения..epf или временные файлы без расширения с характерным размером (обычно от 50 Кб до нескольких Мегабайт)..epf. Попробуем открыть его в конфигураторе.Если глобальный поиск по конфигурации и каталогам Temp не принес результатов, велика вероятность, что разработчики использовали специализированные механизмы хранения элементов.
Проанализируем основные «тайники» в архитектуре 1С:
ПолучитьОбщийМакет(). Проверьте ветку метаданных ОбщиеМакеты на наличие объектов, содержащих в названии ключевые слова «Импорт», «Загрузка» или имя вашей обработки.Справочник.НастройкиИнтеграции, Справочник.ДополнительныеКомпоненты) или регистры сведений (например, РегистрСведений.ДвоичныеДанныеФайлов). Проверьте эти объекты через «Все функции» (или «Функции для технического специалиста») в режиме предприятия.После того как обработка найдена и открыта, нам необходимо устранить саму причину сбоя на строке 7408. Ошибка Ошибка при вызове конструктора (ОписаниеТипов) чаще всего возникает по следующим причинам:
Посмотрим на пример правильного и безопасного создания описания типов в модуле обработки:
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));
МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
// Безопасная инициализация описания типов
ОписаниеНоменклатурыИКонтрагентов = Новый ОписаниеТипов(МассивТипов);
Используя предложенные методики поиска и отладки, мы сможем быстро локализовать скрытый код внешней обработки, выгрузить его в файл конфигуратора, исправить несовместимость типов метаданных и вернуть работоспособность информационной системы.