При работе с внешними обработками (.ert) или конфигурациями (.md) в платформе 1С:Предприятие 7.7 разработчики иногда сталкиваются со специфической ошибкой. Обработка, успешно созданная и сохраненная на рабочей станции программиста, отказалась открываться на терминальном сервере или ПК другого пользователя. В режиме «Предприятие» платформа выдает сообщение «Unexpected file format» («Неправильный формат файла»), а при попытке открыть файл в Конфигураторе выводится аналогичная ошибка, при этом файл обработки остается заблокированным в памяти системным процессом.
Рассмотрим подробно причинно-следственную связь возникновения этой проблемы, выявим системные механизмы, которые приводят к сбою, и разберем практические способы восстановления файлов и предотвращения ошибки в будущем.
Проанализируем структуру хранения графической информации во внешних файлах 1С 7.7. Все иконки и картинки, добавляемые на формы диалогов и кнопки, формируют внутреннюю галерею и записываются в OLE-контейнер файла обработки в виде отдельного потока данных с именем Gallery. Технически этот поток представляет собой объект CImageList из библиотеки MFC, выгруженный в файл с помощью системных функций Windows API.
Причина возникшей проблемы кроется в разнице версий системного компонента comctl32.dll (Common Controls Library), используемого при сохранении и чтении файла:
1cv7s.exe файл манифеста (1cv7s.exe.manifest). Это делается для включения современных визуальных стилей оформления Windows (закругленные кнопки, обновленные элементы управления). При наличии манифеста операционная система принудительно подключает библиотеку comctl32.dll версии 6.x.comctl32.dll v6.x использует функцию ImageList_Write, которая упаковывает иконки в общий битмап иначе, чем предыдущие версии (раскладывая их сеткой по несколько штук в строке, с особым заголовком и дополнительными служебными байтами в конце потока).comctl32.dll версии 5.82. Функция ImageList_Read из старой версии библиотеки не умеет обрабатывать заголовок и структуру потока версии 6.x. В результате вызова происходит сбой, платформой генерируется исключение «Неправильный формат файла», а обработчик исключений 1С не успевает освободить хэндл файла, из-за чего он остается заблокированным до закрытия 1cv7s.exe.Разберем по шагам варианты устранения конфликта версий библиотеки и способы возврата обработок в рабочее состояние.
Если в вашей организации принято использовать визуальные стили оформления Windows XP/7/10, необходимо обеспечить одинаковое окружение для всех пользователей и разработчиков:
1cv7s.exe.manifest скопирован в каталог Bin с исполняемым файлом 1С на **всех** рабочих станциях и терминальных серверах.comctl32.dll v5.82, который корректно читается на любых системах.Если вы не хотите удалять манифест глобально, но нужно заставить конкретный экземпляр 1С 7.7 использовать стандартный механизм отрисовки, примените один из следующих методов:
1cv7s.exe) создайте пустой файл или папку с именем 1cv7s.exe.local. Механизм Side-by-Side redirection операционной системы Windows заставит программу игнорировать файл манифеста и загружать системную comctl32.dll v5.82.1cv7s.exe, перейдите на вкладку «Совместимость» и включите режим совместимости с Windows 2000 или Windows XP (SP3). Это также отключит использование визуальных стилей v6 для этого процесса.В случаях, когда файл обработки поврежден и не открывается на целевом сервере, а исходный ПК недоступен, можно выполнить ручную или автоматизированную конвертацию потока Gallery:
DocFileBrowser для FAR Manager) извлеките поток Gallery из бинарного файла обработки .ert.CImageList).Gallery обратно внутри OLE-контейнера файла .ert. После этого обработка станет доступна для открытия в любой среде.Чтобы полностью исключить зависимость графических элементов от версий системных DLL и файла манифеста, рекомендуем проанализировать следующие архитектурные подходы:
.bmp или .ico) в отдельный каталог и подгружайте их на элементы формы динамически при открытии обработки, используя метод Картинка.Загрузить(...).CImageList.