Как исправить черную раскраску таблиц и ошибку регистрации VColorPicker.ocx в 1С 7.7 на Windows Server 2019?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переносе баз старых версий платформы, таких как 1С 7.7, на современные операционные системы (например, Windows Server 2019), разработчики и администраторы часто сталкиваются с целым рядом специфических проблем. Разберем типичную ситуацию: в базе используется класс ВыделениеЦветом (с применением компонент 1С++ и FormEx), однако после переезда на новый сервер строки в таблицах красятся в сплошной черный цвет. Кроме того, ActiveX-компонента VColorPicker.ocx, отвечающая за выбор цвета пользователем, отказывается регистрироваться в системе. Проанализируем эти проблемы по шагам и выясним причины их возникновения, а также рассмотрим рабочие способы решения.

Почему не регистрируется 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

Проанализируем архитектуру решения. Компонента VColorPicker.ocx нужна исключительно для вызова диалога выбора цвета. Если в вашей конфигурации уже используется компонента FormEx.dll, внешняя ActiveX-компонента становится избыточной.

В объекте Сервис из компоненты FormEx уже встроен метод для вызова стандартного системного диалога Windows. Рассмотрим его использование:


лоСервис = СоздатьОбъект("Сервис");
ВыбранныйЦвет = лоСервис.ВыбратьЦвет(1, ТекущийЦвет);
Если ВыбранныйЦвет <> -1 Тогда
    // Пользователь выбрал цвет, применяем его
КонецЕсли;

Переписав вызов диалога на этот метод, вы сможете полностью удалить класс VColorPicker из конфигурации и обойти проблему с его регистрацией на новых ОС.

Причины «черной» раскраски таблиц и изменения в FormEx

Теперь разберем самую главную проблему — почему таблицы раскрашиваются черным цветом, несмотря на то что 1cpp.dll и FormEx.dll загружаются без ошибок. Черный цвет (числовое значение 0 в палитре RGB) применяется FormEx по умолчанию, если компонента не может корректно распознать переданный ей код цвета или макрос. На Windows Server 2019 этому способствуют две основные причины.

  1. Изменение синтаксиса в новых версиях FormEx. Если вы обновили компоненту до версии 2.0.5.x и выше, учтите, что требования к синтаксису макросов раскраски ужесточились. Теперь парсер требует обрамлять команды круглыми скобками. Вместо BRUSH[Цвет] нужно передавать (BRUSH[Цвет]).
  2. Сбой получения системных цветов из реестра. В старом коде часто встречается функция _ЦветИзРеестра("WindowText"), которая лезет в ветки реестра за настройками оформления ОС. В Windows Server 2019 структура реестра и права доступа могли измениться. Если функция возвращает пустое значение, класс генерирует сломанный макрос, который интерпретируется как 0 (черный цвет).

Посмотрим на фрагмент старого кода инициализации шаблона:


Если ПустоеЗначение(лсШаблон)=1 Тогда
    //сформируем шаблон цветовой раскраски по системным цветам
    лсШаблон = "FONT["+_ЦветИзРеестра("WindowText")
    +"]BRUSH["+_ЦветИзРеестра("Window")
    +"]FONT_S["+_ЦветИзРеестра("WindowText")
    +"]BRUSH_S["+_ЦветИзРеестра("Window")+"]";
КонецЕсли;

Рекомендуем отказаться от чтения цветов из реестра ОС. Используйте жестко заданные числовые константы RGB или встроенную функцию ПолучитьЦвет(R,G,B). Также обязательно добавьте круглые скобки вокруг выражений макроса, если используете свежие версии FormEx.

Специфика работы старых библиотек на Windows Server 2019: DEP и масштабирование

Рассмотрим еще два важных фактора, влияющих на работу внешних компонент 1С 7.7 на современных серверных операционных системах:

  1. Ограничения DEP (Data Execution Prevention). На серверных ОС защита от выполнения данных работает очень агрессивно. Компоненты 1cpp.dll и FormEx.dll используют методы перехвата вызовов в памяти для внедрения своих таблиц и раскрасок. DEP может молча блокировать эти перехваты. Для стабильной работы рекомендуем добавить исполняемый файл 1cv7s.exe в исключения DEP.
  2. Масштабирование экрана (DPI). При использовании нестандартного масштабирования (отличного от 100%) на сервере по RDP могут возникать визуальные артефакты, съезжать шрифты и пропадать раскраска. Чтобы этого избежать, зайдите в свойства ярлыка 1С, перейдите на вкладку «Совместимость» и в параметрах высокого DPI установите переопределение масштабирования так, чтобы оно выполнялось самим приложением.

Проанализировав все вышеперечисленные шаги, мы видим, что лучшим решением при переносе старых самописных классов раскраски на новые серверы является отказ от сторонних OCX-компонент, обновление синтаксиса макросов под новые версии FormEx и избавление от привязки к цветам из реестра Windows.

← На главную