Как изменить цвет фона поля ввода в режиме, когда редактирование запрещено, но копирование разрешено, в 1С:Предприятие 8.3 (Управляемые формы)?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке форм в 1С:Предприятие 8.3 на управляемых формах мы часто сталкиваемся с необходимостью отображать поля, которые не должны быть редактируемыми пользователем, но при этом их содержимое должно быть доступно для копирования. Стандартный подход к реализации нередактируемого поля – установка свойства ТолькоПросмотр в значение Истина. Однако, как показывает практика, при этом возникает одна неприятная особенность: свойство ЦветФона перестает действовать.

Платформа, при установке свойства ТолькоПросмотр = Истина, применяет к полю собственный стиль оформления, который, как правило, включает серый фон. Этот системный стиль переопределяет любые попытки установить пользовательский цвет фона программно или декларативно. Если же мы попробуем использовать свойство Доступность = Ложь, поле действительно станет серым и нередактируемым, но при этом пользователь потеряет возможность скопировать его содержимое, что недопустимо для нашей задачи.

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

Решение 1: Использование условного оформления

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

Почему это работает? Мы не устанавливаем свойство ТолькоПросмотр для самого поля. Вместо этого мы используем условное оформление, которое применяется на этапе отрисовки формы и позволяет переопределить стили. Поскольку платформа не видит у элемента флага ТолькоПросмотр = Истина, она не применяет свой системный стиль "только для чтения", а значит, наше условное оформление успешно устанавливает требуемый цвет фона.

Разберем по шагам, как настроить условное оформление:

  1. Перейдем в конфигураторе к нужной форме и откроем ее свойства.
  2. Найдем свойство УсловноеОформление. Откроем его.
  3. Добавим новый элемент условного оформления.
  4. Настроим Отбор: здесь мы задаем условие, при котором будет применяться наше оформление. Например, это может быть значение некоего реквизита, который сигнализирует о том, что поле должно быть визуально "только для чтения". В данном случае, если мы хотим, чтобы поле всегда было серым, условие может быть максимально простым или вообще отсутствовать, если оформление применяется непосредственно к полю. Однако для динамического поведения мы можем использовать условие, например, "ЗначениеЗаполнено".
  5. Настроим Оформление: здесь мы указываем, какие именно параметры внешнего вида мы хотим изменить. Для нашей задачи выбираем ЦветФона и задаем желаемый оттенок серого. Также можно установить ЦветТекста для лучшей читаемости.
  6. Укажем Поля, к которым будет применяться данное оформление. Выберем наш реквизит формы, фон которого мы хотим изменить.

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


ЭлементОформления = УсловноеОформление.Элементы.Добавить;

// Настройка отбора (условия, при котором применяется оформление)
// Если мы хотим применить оформление постоянно или по простому условию
// Например, если поле "Объект.Товары.Доступно" заполнено
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Доступно"); // Имя реквизита, по которому идет отбор
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено; // Пример условия
ЭлементОтбора.Использование = Истина;

// Настройка оформления (какие свойства элемента меняем)
// Устанавливаем цвет текста, если это необходимо
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ЦветМорскойВолны);
// Устанавливаем цвет фона на серый
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(244, 244, 244)); // Пример серого цвета

// Указание полей, к которым применяется оформление
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить;
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыДоступно"); // Имя реквизита формы, фон которого меняем
ПолеОформления.Использование = Истина;

В этом примере мы создаем новый элемент условного оформления. Затем устанавливаем для него условие отбора – например, что поле Объект.Товары.Доступно должно быть заполнено. Это условие вы можете адаптировать под свою логику – оно может быть связано с флагом "поле только для чтения", который хранится в другом реквизите формы или в настройках пользователя. Далее мы задаем параметры оформления: ЦветТекста и ЦветФона. Наконец, указываем, к какому именно полю формы (ТоварыДоступно в данном случае) должны применяться эти настройки. При таком подходе поле сохраняет все свои функциональные возможности, включая копирование, но при этом визуально выделяется. Для быстрого получения готового листинга настроек любой сложности можно использовать инструмент для генерации программного кода условного оформления.

Решение 2: Размещение поля в группе с установкой фона группы

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

Как это работает? Мы помещаем наше поле ввода внутрь элемента формы типа "Группа". Затем для этой группы устанавливаем желаемый цвет фона. Когда поле ввода будет отрисовываться внутри группы, оно будет использовать свой стандартный фон (например, белый), но фон группы будет виден вокруг поля и, в зависимости от расположения и размеров, может создавать впечатление, что сам фон поля серый. Этот метод особенно эффективен, если поле ввода имеет прозрачный фон или если его размеры идеально вписываются в область группы, так что фон группы становится доминирующим.

Порядок действий:

  1. Откроем форму в конфигураторе.
  2. В дереве элементов формы создадим новый элемент типа "Группа". Дадим ей осмысленное имя.
  3. Для созданной группы установим желаемый ЦветФона. Например, Новый Цвет(244, 244, 244) для серого оттенка.
  4. Перетащим наше поле ввода, которое должно быть "только для чтения", внутрь этой новой группы.
  5. Убедимся, что у самого поля ввода не установлено свойство ТолькоПросмотр = Истина, чтобы сохранить возможность копирования.
  6. При необходимости скорректируем размеры поля и группы, чтобы обеспечить наилучший визуальный эффект.

Этот подход является весьма дельным советом, как подтвердили пользователи форума. Он обходит ограничения платформы, связанные с установкой флага "только просмотр", и позволяет легко визуально выделить поля, не затрагивая их функциональность.

Решение 3: Программная эмуляция режима "только просмотр"

Если нам требуется полный контроль над поведением поля и его внешним видом, а также над тем, чтобы оно выглядело и вело себя как поле "только для чтения", но при этом сохранило возможность копирования, мы можем прибегнуть к программной эмуляции режима "только просмотр". Этот метод заключается в том, что мы не устанавливаем свойство ТолькоПросмотр = Истина, которое блокирует ЦветФона, а вместо этого программно отключаем все интерактивные действия пользователя, которые могут привести к изменению значения поля.

Почему это работает? Мы оставляем свойство ТолькоПросмотр в значении Ложь (или по умолчанию), что позволяет свойству ЦветФона корректно работать. При этом мы перехватываем и блокируем все действия пользователя, направленные на изменение значения поля, а также скрываем все элементы управления (кнопки выбора, создания, выпадающие списки), которые могли бы позволить пользователю изменить данные.

Список свойств и событий для блокировки интерактивного редактирования:

Посмотрим на пример кода, который реализует программную эмуляцию режима "только просмотр":


// Предполагаем, что ДоговорКонтрагента - это имя элемента формы
// Шаг 1: Убеждаемся, что ТолькоПросмотр не установлен в Истина
Элементы.ДоговорКонтрагента.ТолькоПросмотр = Ложь;

// Шаг 2: Отключаем основные интерактивные возможности редактирования
Элементы.ДоговорКонтрагента.КнопкаВыбора = Ложь;
Элементы.ДоговорКонтрагента.КнопкаСоздания = Ложь;
Элементы.ДоговорКонтрагента.РедактированиеТекста = Ложь;

// Шаг 3: Теперь мы можем установить желаемый цвет фона
Элементы.ДоговорКонтрагента.ЦветФона = Новый Цвет(244, 244, 244); // Пример серого цвета

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

Для более полной блокировки и устранения любых непредусмотренных способов изменения данных, нам следует использовать более расширенный набор свойств и перехват событий. Рассмотрим уточненное и дополненное решение:


// Предполагаем, что ДоговорКонтрагента - это имя элемента формы

// Шаг 1: Убеждаемся, что ТолькоПросмотр не установлен в Истина (по умолчанию Ложь, если не задано явно)
Форма.Элементы.ДоговорКонтрагента.ТолькоПросмотр = Ложь;

// Шаг 2: Отключаем все кнопки и возможности быстрого ввода
Форма.Элементы.ДоговорКонтрагента.КнопкаВыпадающегоСписка = Ложь;
Форма.Элементы.ДоговорКонтрагента.БыстрыйВыбор = Ложь;
Форма.Элементы.ДоговорКонтрагента.РедактированиеТекста = Ложь;
Форма.Элементы.ДоговорКонтрагента.КнопкаСоздания = Ложь;
Форма.Элементы.ДоговорКонтрагента.ОтображениеКнопкиВыбора = ОтображениеКнопкиВыбора.ОтображатьВПолеВвода;
Форма.Элементы.ДоговорКонтрагента.КнопкаВыбора = Ложь;
Форма.Элементы.ДоговорКонтрагента.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;

// Шаг 3: Отменяем стандартную обработку событий "Очистка" и "НачалоВыбора"
// Это предотвратит попытки очистить поле или открыть форму выбора
Форма.Элементы.ДоговорКонтрагента.УстановитьДействие("Очистка", "лДоговорКонтрагентаОчистка");
Форма.Элементы.ДоговорКонтрагента.УстановитьДействие("НачалоВыбора", "лДоговорКонтрагентаНачалоВыбора");

// Шаг 4: Делаем поле нефокусируемым по Tab
Форма.Элементы.ДоговорКонтрагента.ПропускатьПриВводе = Истина;

// Шаг 5: Устанавливаем желаемый цвет фона
Форма.Элементы.ДоговорКонтрагента.ЦветФона = Новый Цвет(244, 244, 244);

И соответствующие процедуры-обработчики на клиенте:


&НаКлиенте
Процедура лДоговорКонтрагентаОчистка(Элемент, СтандартнаяОбработка) Экспорт
    СтандартнаяОбработка = Ложь; // Отменяем стандартную очистку поля
КонецПроцедуры

&НаКлиенте
Процедура лДоговорКонтрагентаНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) Экспорт
    СтандартнаяОбработка = Ложь; // Отменяем стандартное открытие формы выбора
КонецПроцедуры

Давайте подробно разберем этот расширенный код. Мы начинаем с установки ТолькоПросмотр = Ложь (или просто не устанавливаем его в Истина, так как по умолчанию для многих элементов это значение уже Ложь). Далее мы последовательно отключаем все возможные интерактивные элементы управления и механизмы, которые позволяют пользователю изменить значение поля: кнопки выбора, создания, выпадающие списки, быстрый выбор и историю выбора. Свойство РедактированиеТекста = Ложь полностью блокирует прямой ввод символов с клавиатуры.

Особое внимание уделим методу УстановитьДействие. Этот метод позволяет нам "подменить" или перехватить стандартные действия платформы, связанные с элементом. В нашем случае мы перехватываем события Очистка (которое срабатывает, например, при нажатии комбинации Ctrl+Del) и НачалоВыбора (которое вызывается при попытке открыть форму выбора, например, двойным кликом). Внутри наших обработчиков лДоговорКонтрагентаОчистка и лДоговорКонтрагентаНачалоВыбора мы устанавливаем параметр СтандартнаяОбработка = Ложь. Это означает, что мы отменяем стандартное поведение платформы, не позволяя полю очиститься или открыть форму выбора.

Использование свойства ПропускатьПриВводе = Истина (сообщение 29) дополнительно улучшает пользовательский опыт, так как поле будет игнорироваться при навигации по форме с помощью клавиши Tab. Это делает его еще более похожим на полностью неактивное поле, при этом сохраняя возможность выделения и копирования текста мышью.

После всех этих манипуляций мы можем уверенно установить желаемый ЦветФона для элемента. Поскольку свойство ТолькоПросмотр не активировано, платформа не будет накладывать свои стили, и наш пользовательский фон будет отображаться корректно. Этот метод обеспечивает наиболее полный контроль и позволяет создать абсолютно нередактируемое поле с нужным цветом фона, которое при этом полностью поддерживает копирование.

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

← На главную