При переносе баз старых версий платформы, таких как 1С 7.7, на современные операционные системы (например, Windows Server 2019), разработчики и администраторы часто сталкиваются с целым рядом специфических проблем. Разберем типичную ситуацию: в базе используется класс ВыделениеЦветом (с применением компонент 1С++ и FormEx), однако после переезда на новый сервер строки в таблицах красятся в сплошной черный цвет. Кроме того, ActiveX-компонента VColorPicker.ocx, отвечающая за выбор цвета пользователем, отказывается регистрироваться в системе. Проанализируем эти проблемы по шагам и выясним причины их возникновения, а также рассмотрим рабочие способы решения.
Разберем ситуацию с ошибкой регистрации библиотеки VColorPicker.ocx с помощью утилиты regsvr32. Даже если вы запускаете командную строку от имени администратора, регистрация может завершиться ошибкой. На 64-битных системах компоненты нужно регистрировать через 32-битную версию утилиты:
%WINDIR%\SysWOW64\regsvr32.exe %WINDIR%\System32\VColorPicker.ocx
Однако, если и это не помогает, причина кроется в отсутствии необходимых системных зависимостей. Старые компоненты ActiveX часто писались на Visual Basic 6.0 или старых версиях C++ (MFC). Для их корректной работы в папке SysWOW64 должны присутствовать системные библиотеки того времени, такие как msvbvm60.dll, oleaut32.dll, olepro32.dll, comcat.dll или mfc42.dll. Если хотя бы одной из них не хватает, regsvr32 выдаст абстрактную ошибку о том, что модуль не найден.
Посмотрим на решение этой проблемы: можно воспользоваться утилитами вроде Dependency Walker, чтобы узнать, какой именно DLL не хватает, и подкинуть ее в систему. Но есть более изящный путь — вообще отказаться от этой компоненты.
Проанализируем архитектуру решения. Компонента VColorPicker.ocx нужна исключительно для вызова диалога выбора цвета. Если в вашей конфигурации уже используется компонента FormEx.dll, внешняя ActiveX-компонента становится избыточной.
В объекте Сервис из компоненты FormEx уже встроен метод для вызова стандартного системного диалога Windows. Рассмотрим его использование:
лоСервис = СоздатьОбъект("Сервис");
ВыбранныйЦвет = лоСервис.ВыбратьЦвет(1, ТекущийЦвет);
Если ВыбранныйЦвет <> -1 Тогда
// Пользователь выбрал цвет, применяем его
КонецЕсли;
Переписав вызов диалога на этот метод, вы сможете полностью удалить класс VColorPicker из конфигурации и обойти проблему с его регистрацией на новых ОС.
Теперь разберем самую главную проблему — почему таблицы раскрашиваются черным цветом, несмотря на то что 1cpp.dll и FormEx.dll загружаются без ошибок. Черный цвет (числовое значение 0 в палитре RGB) применяется FormEx по умолчанию, если компонента не может корректно распознать переданный ей код цвета или макрос. На Windows Server 2019 этому способствуют две основные причины.
BRUSH[Цвет] нужно передавать (BRUSH[Цвет])._ЦветИзРеестра("WindowText"), которая лезет в ветки реестра за настройками оформления ОС. В Windows Server 2019 структура реестра и права доступа могли измениться. Если функция возвращает пустое значение, класс генерирует сломанный макрос, который интерпретируется как 0 (черный цвет).Посмотрим на фрагмент старого кода инициализации шаблона:
Если ПустоеЗначение(лсШаблон)=1 Тогда
//сформируем шаблон цветовой раскраски по системным цветам
лсШаблон = "FONT["+_ЦветИзРеестра("WindowText")
+"]BRUSH["+_ЦветИзРеестра("Window")
+"]FONT_S["+_ЦветИзРеестра("WindowText")
+"]BRUSH_S["+_ЦветИзРеестра("Window")+"]";
КонецЕсли;
Рекомендуем отказаться от чтения цветов из реестра ОС. Используйте жестко заданные числовые константы RGB или встроенную функцию ПолучитьЦвет(R,G,B). Также обязательно добавьте круглые скобки вокруг выражений макроса, если используете свежие версии FormEx.
Рассмотрим еще два важных фактора, влияющих на работу внешних компонент 1С 7.7 на современных серверных операционных системах:
1cpp.dll и FormEx.dll используют методы перехвата вызовов в памяти для внедрения своих таблиц и раскрасок. DEP может молча блокировать эти перехваты. Для стабильной работы рекомендуем добавить исполняемый файл 1cv7s.exe в исключения DEP.Проанализировав все вышеперечисленные шаги, мы видим, что лучшим решением при переносе старых самописных классов раскраски на новые серверы является отказ от сторонних OCX-компонент, обновление синтаксиса макросов под новые версии FormEx и избавление от привязки к цветам из реестра Windows.