Почему в 1С 7.7 не меняется цвет фона у поля со справочником и как это исправить?

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

В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача визуально выделить важные поля на форме, например, изменив их цвет фона. Обычно для этого используется внешняя компонента FormEx и ее методы. Однако многие разработчики сталкиваются с проблемой: если атрибут формы имеет тип "Справочник", то попытки изменить его цвет фона не дают результата, в то время как для полей с типами "Строка" или "Дата" все работает корректно. Давайте разберемся, почему так происходит и как обойти это ограничение.

Выясняем причину: особенности отрисовки в 1С 7.7

Казалось бы, код для изменения цвета должен быть универсальным. Например, мы используем стандартный подход через объект АтрибутФормы:


// Попытка изменить цвет фона для поля "Склад" (тип Справочник)
АтрФормы = СоздатьОбъект("АтрибутФормы");
АтрФормы.УстановитьАтрибут(Форма, "Склад");
АтрФормы.ЦветФона = 55692; // Этот код не сработает

Причина, по которой этот код не работает для справочников, кроется глубоко в архитектуре самой платформы 1С 7.7. Проанализируем ситуацию подробнее:

  1. Кастомный элемент управления. Поле для выбора значения из справочника — это не стандартный элемент ввода Windows (MFC control), а специализированный, кастомный контрол, который был разработан непосредственно создателями 1С.
  2. Собственный механизм отрисовки. Этот кастомный контрол имеет свой собственный, жестко заданный механизм отрисовки. Движок платформы 1С самостоятельно рисует этот элемент на экране, игнорируя многие стандартные системные свойства, включая цвет фона (ЦветФона).
  3. Ограничения внешних компонент. Внешние компоненты, такие как FormEx, пытаются установить стандартные свойства Windows для элемента управления. Но поскольку элемент 1С их не учитывает при своей отрисовке, эти установки просто "провисают в воздухе" и не приводят к визуальным изменениям.

Таким образом, это фундаментальное ограничение платформы, а не ошибка в вашем коде или в компоненте FormEx. Надеяться на исправление этого поведения не стоит, поэтому для решения задачи нужно использовать обходной путь.

Практическое решение: имитация поля выбора

Раз мы не можем изменить стандартный элемент, давайте заменим его на тот, которым можем управлять, и воссоздадим нужную нам функциональность. Этот метод является классическим приемом для кастомизации интерфейсов в 1С 7.7. Разберем его по шагам.

Суть метода: вместо одного поля типа "Справочник" мы будем использовать связку из двух элементов: обычного текстового поля (которое легко раскрасить) и кнопки для организации выбора.

Шаг 1. Подготовка формы в конфигураторе

Сначала подготовим нашу форму. Откройте ее в конфигураторе и выполните следующие действия:

  1. Удалите или сделайте невидимым стандартный элемент управления, связанный с вашим реквизитом типа "Справочник" (например, "Склад"). Сам реквизит диалога, конечно, должен остаться.
  2. Добавьте на форму новый элемент — Поле ввода. Свяжите его с новым реквизитом диалога, который должен иметь тип "Строка". Назовем его, к примеру, СкладПредставление. Это поле будет только отображать название выбранного склада.
  3. Рядом с этим текстовым полем разместите новую Кнопку. В ее свойствах задайте лаконичный текст, например, "..." или "Выбрать". Назначьте ей имя, например, КнопкаВыбораСклада.

Шаг 2. Настройка свойств и программная раскраска

Теперь настроим поведение наших новых элементов. Весь код будем писать в модуле формы.

В процедуре ПриОткрытии() или в том месте, где вам нужно применить раскраску, добавим код для изменения цвета фона нашего нового текстового поля. Теперь это сработает, так как поле имеет тип "Строка".


Процедура ПриОткрытии()
    // ... ваш код ...

    // Раскрашиваем текстовое поле-имитатор
    АтрФормы = СоздатьОбъект("АтрибутФормы");
    АтрФормы.УстановитьАтрибут(Форма, "СкладПредставление");

    // Задаем цвет (например, светло-желтый)
    // Можно использовать калькулятор для перевода RGB в число
    // RGB(255, 255, 191) -> 12582847
    АтрФормы.ЦветФона = 12582847; 
    
    // Запрещаем пользователю вручную редактировать это поле
    АтрФормы.ТолькоПросмотр(1); 
КонецПроцедуры

Важный момент: мы установили свойство ТолькоПросмотр для нашего текстового поля. Это необходимо, чтобы пользователь не мог ввести туда произвольный текст, нарушив логику выбора из справочника.

Шаг 3. Реализация логики выбора

Самая важная часть — обработка нажатия на нашу кнопку выбора. Создадим для нее процедуру-обработчик.


Процедура КнопкаВыбораСклада()
    // Переменная для хранения выбранного значения
    ВыбранныйЭлемент = "";
    
    // Открываем форму выбора справочника "Склады" в модальном режиме
    // Процедура ОткрытьФормуМодально() вернет 1, если что-то выбрано, иначе 0
    Если ОткрытьФормуМодально("Справочник.Склады", ВыбранныйЭлемент) = 1 Тогда
        // Проверяем, что значение действительно было выбрано и оно не пустое
        Если ПустоеЗначение(ВыбранныйЭлемент) = 0 Тогда
            // Сохраняем ссылку на выбранный элемент в наш основной, 
            // "невидимый" реквизит формы
            Склад = ВыбранныйЭлемент;
            
            // А в раскрашенное текстовое поле помещаем его наименование
            СкладПредставление = ВыбранныйЭлемент.Наименование;
        Иначе
            // Если пользователь закрыл форму выбора, не выбрав элемент, очищаем поля
            Склад = ПолучитьПустоеЗначение("Справочник.Склады");
            СкладПредставление = "";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Рассмотрим, что здесь происходит:

Шаг 4. Отображение начального значения

Не забудем, что при открытии формы, если в реквизите Склад уже есть какое-то значение, его нужно отобразить в нашем текстовом поле.

Дополним процедуру ПриОткрытии():


Процедура ПриОткрытии()
    // ... код раскраски ...

    // Отображаем начальное значение
    Если ПустоеЗначение(Склад) = 0 Тогда
        СкладПредставление = Склад.Наименование;
    Иначе
        СкладПредставление = "";
    КонецЕсли;
КонецПроцедуры

В результате мы получаем полностью функциональное поле для выбора из справочника, которое при этом имеет нужный нам цвет фона. Да, этот подход требует больше действий, чем одна строчка кода, но он надежен и позволяет гибко управлять внешним видом форм в 1С 7.7, обходя ограничения платформы.

← На главную