В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача визуально выделить важные поля на форме, например, изменив их цвет фона. Обычно для этого используется внешняя компонента FormEx и ее методы. Однако многие разработчики сталкиваются с проблемой: если атрибут формы имеет тип "Справочник", то попытки изменить его цвет фона не дают результата, в то время как для полей с типами "Строка" или "Дата" все работает корректно. Давайте разберемся, почему так происходит и как обойти это ограничение.
Казалось бы, код для изменения цвета должен быть универсальным. Например, мы используем стандартный подход через объект АтрибутФормы:
// Попытка изменить цвет фона для поля "Склад" (тип Справочник)
АтрФормы = СоздатьОбъект("АтрибутФормы");
АтрФормы.УстановитьАтрибут(Форма, "Склад");
АтрФормы.ЦветФона = 55692; // Этот код не сработает
Причина, по которой этот код не работает для справочников, кроется глубоко в архитектуре самой платформы 1С 7.7. Проанализируем ситуацию подробнее:
ЦветФона).Таким образом, это фундаментальное ограничение платформы, а не ошибка в вашем коде или в компоненте FormEx. Надеяться на исправление этого поведения не стоит, поэтому для решения задачи нужно использовать обходной путь.
Раз мы не можем изменить стандартный элемент, давайте заменим его на тот, которым можем управлять, и воссоздадим нужную нам функциональность. Этот метод является классическим приемом для кастомизации интерфейсов в 1С 7.7. Разберем его по шагам.
Суть метода: вместо одного поля типа "Справочник" мы будем использовать связку из двух элементов: обычного текстового поля (которое легко раскрасить) и кнопки для организации выбора.
Сначала подготовим нашу форму. Откройте ее в конфигураторе и выполните следующие действия:
СкладПредставление. Это поле будет только отображать название выбранного склада.КнопкаВыбораСклада.Теперь настроим поведение наших новых элементов. Весь код будем писать в модуле формы.
В процедуре ПриОткрытии() или в том месте, где вам нужно применить раскраску, добавим код для изменения цвета фона нашего нового текстового поля. Теперь это сработает, так как поле имеет тип "Строка".
Процедура ПриОткрытии()
// ... ваш код ...
// Раскрашиваем текстовое поле-имитатор
АтрФормы = СоздатьОбъект("АтрибутФормы");
АтрФормы.УстановитьАтрибут(Форма, "СкладПредставление");
// Задаем цвет (например, светло-желтый)
// Можно использовать калькулятор для перевода RGB в число
// RGB(255, 255, 191) -> 12582847
АтрФормы.ЦветФона = 12582847;
// Запрещаем пользователю вручную редактировать это поле
АтрФормы.ТолькоПросмотр(1);
КонецПроцедуры
Важный момент: мы установили свойство ТолькоПросмотр для нашего текстового поля. Это необходимо, чтобы пользователь не мог ввести туда произвольный текст, нарушив логику выбора из справочника.
Самая важная часть — обработка нажатия на нашу кнопку выбора. Создадим для нее процедуру-обработчик.
Процедура КнопкаВыбораСклада()
// Переменная для хранения выбранного значения
ВыбранныйЭлемент = "";
// Открываем форму выбора справочника "Склады" в модальном режиме
// Процедура ОткрытьФормуМодально() вернет 1, если что-то выбрано, иначе 0
Если ОткрытьФормуМодально("Справочник.Склады", ВыбранныйЭлемент) = 1 Тогда
// Проверяем, что значение действительно было выбрано и оно не пустое
Если ПустоеЗначение(ВыбранныйЭлемент) = 0 Тогда
// Сохраняем ссылку на выбранный элемент в наш основной,
// "невидимый" реквизит формы
Склад = ВыбранныйЭлемент;
// А в раскрашенное текстовое поле помещаем его наименование
СкладПредставление = ВыбранныйЭлемент.Наименование;
Иначе
// Если пользователь закрыл форму выбора, не выбрав элемент, очищаем поля
Склад = ПолучитьПустоеЗначение("Справочник.Склады");
СкладПредставление = "";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим, что здесь происходит:
ОткрытьФормуМодально() для вызова формы выбора справочника.ВыбранныйЭлемент помещается ссылка на выбранный объект.Склад. Он может быть невидимым на форме, но именно он будет использоваться для записи в базу данных или для дальнейших вычислений.СкладПредставление мы помещаем текстовое представление выбранного элемента, например, его наименование.Не забудем, что при открытии формы, если в реквизите Склад уже есть какое-то значение, его нужно отобразить в нашем текстовом поле.
Дополним процедуру ПриОткрытии():
Процедура ПриОткрытии()
// ... код раскраски ...
// Отображаем начальное значение
Если ПустоеЗначение(Склад) = 0 Тогда
СкладПредставление = Склад.Наименование;
Иначе
СкладПредставление = "";
КонецЕсли;
КонецПроцедуры
В результате мы получаем полностью функциональное поле для выбора из справочника, которое при этом имеет нужный нам цвет фона. Да, этот подход требует больше действий, чем одна строчка кода, но он надежен и позволяет гибко управлять внешним видом форм в 1С 7.7, обходя ограничения платформы.