Как программно изменить заголовки всех переключателей в одной группе в 1С 7.7?

Программист 1С v7.7
← На главную

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

Мы проанализируем ситуацию с переключателями в 1С 7.7. Когда мы говорим о группе переключателей, важно понимать ее внутреннее устройство. Группа формируется следующим образом: мы размещаем на форме несколько элементов типа "Переключатель", один из которых помечаем как "Первый в группе". Далее мы настраиваем порядок обхода элементов формы так, чтобы все остальные переключатели, входящие в эту логическую группу, следовали непосредственно за первым. Важно, чтобы между ними не было других элементов управления, иначе группа будет разбита. Идентификатор, который мы присваиваем первому переключателю, используется для управления всей группой. При выборе любого переключателя в этой группе, значение его идентификатора меняется: 1 — если выбран первый, 2 — если второй по порядку обхода, и так далее. Мы можем читать это значение, чтобы понять, какой переключатель выбран, и записывать его, чтобы программно установить выбор. Но как быть с заголовками? Стандартными средствами менять заголовок каждого отдельного элемента в группе невозможно. Давайте рассмотрим несколько подходов, которые помогут нам решить эту проблему.

Подход 1: Использование надписей для имитации заголовков переключателей

Один из наиболее гибких и распространенных способов обойти ограничение на изменение заголовков переключателей — это использование отдельных элементов "Надпись" для отображения текста. Этот метод позволяет нам полностью контролировать текст каждого "заголовка" независимо от самого элемента переключателя. Мы рассмотрим этот подход подробнее.

Шаг 1: Подготовка элементов формы

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

Шаг 2: Программное управление заголовками

Теперь, когда элементы формы готовы, мы можем программно изменять текст каждой "надписи". Для этого мы используем метод Заголовок() для элемента Надпись. Например, чтобы изменить заголовок первой надписи, мы пишем:

Форма.НадписьВариант1.Заголовок("Новый текст для варианта 1");

Шаг 3: Реализация логики выбора переключателя

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

  1. Определяем идентификатор группы: Предположим, что наш первый переключатель в группе имеет идентификатор ГруппаВыбора. Этот идентификатор будет хранить значение выбранного варианта (1, 2, 3...).
  2. Обрабатываем клики по надписям: В процедуре ПриНажатии() для каждой надписи мы присваиваем соответствующее значение идентификатору группы и затем обновляем визуальное отображение.

Давайте посмотрим на пример кода в модуле формы, который демонстрирует этот подход:


// Переменная в модуле формы для отслеживания выбранного значения
// Идентификатор основного переключателя группы на форме
// Пусть это будет "ПереключательГруппы"

Перем ВыбранноеЗначениеГруппы; 

Процедура ПриОткрытии()
    // Устанавливаем начальное значение и обновляем заголовки
    ВыбранноеЗначениеГруппы = 1; // По умолчанию выбран первый вариант
    Форма.ПереключательГруппы = ВыбранноеЗначениеГруппы; // Устанавливаем флажок
    ОбновитьСостояниеПереключателей();
КонецПроцедуры

Процедура ОбновитьСостояниеПереключателей()
    // Изменяем заголовки надписей в зависимости от выбранного значения
    Если ВыбранноеЗначениеГруппы = 1 Тогда
        Форма.НадписьВариант1.Заголовок("Вариант 1 (Выбрано)");
        Форма.НадписьВариант2.Заголовок("Вариант 2");
        Форма.НадписьВариант3.Заголовок("Вариант 3");
    ИначеЕсли ВыбранноеЗначениеГруппы = 2 Тогда
        Форма.НадписьВариант1.Заголовок("Вариант 1");
        Форма.НадписьВариант2.Заголовок("Вариант 2 (Выбрано)");
        Форма.НадписьВариант3.Заголовок("Вариант 3");
    ИначеЕсли ВыбранноеЗначениеГруппы = 3 Тогда
        Форма.НадписьВариант1.Заголовок("Вариант 1");
        Форма.НадписьВариант2.Заголовок("Вариант 2");
        Форма.НадписьВариант3.Заголовок("Вариант 3 (Выбрано)");
    КонецЕсли;

    // Мы также можем изменять стили или цвета надписей, чтобы сделать выбор более очевидным
    // Например, если FormEx установлен, можно менять цвет шрифта:
    // FormEx.НадписьВариант1.ЦветШрифта = ...
КонецПроцедуры

Процедура НадписьВариант1_ПриНажатии()
    ВыбранноеЗначениеГруппы = 1;
    Форма.ПереключательГруппы = ВыбранноеЗначениеГруппы; // Обновляем состояние основного переключателя
    ОбновитьСостояниеПереключателей();
КонецПроцедуры

Процедура НадписьВариант2_ПриНажатии()
    ВыбранноеЗначениеГруппы = 2;
    Форма.ПереключательГруппы = ВыбранноеЗначениеГруппы;
    ОбновитьСостояниеПереключателей();
КонецПроцедуры

Процедура НадписьВариант3_ПриНажатии()
    ВыбранноеЗначениеГруппы = 3;
    Форма.ПереключательГруппы = ВыбранноеЗначениеГруппы;
    ОбновитьСостояниеПереключателей();
КонецПроцедуры

// Также необходимо обработать событие ПриИзменении() для самого переключателя группы,
// если пользователь кликнет не на надпись, а на саму "точку" переключателя
Процедура ПереключательГруппы_ПриИзменении()
    ВыбранноеЗначениеГруппы = Форма.ПереключательГруппы;
    ОбновитьСостояниеПереключателей();
КонецПроцедуры

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

Подход 2: Использование обычных кнопок как переключателей

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

Шаг 1: Создание кнопок

Мы размещаем на форме несколько элементов типа "Кнопка". Для каждой кнопки мы устанавливаем свой уникальный идентификатор (например, КнопкаВыбор1, КнопкаВыбор2 и т.д.) и присваиваем ей начальный заголовок. Изначально мы можем настроить их так, чтобы они выглядели как обычные кнопки.

Шаг 2: Программное управление заголовками и состоянием

Для изменения заголовков кнопок мы используем стандартный метод Заголовок():

Форма.КнопкаВыбор1.Заголовок("Новый текст для Кнопки 1");

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

  1. Изменение заголовка: Добавляем к заголовку текст, указывающий на выбор (например, "Выбрано").
  2. Использование внешних компонент: Если в нашей конфигурации используется внешняя компонента, такая как FormEx, она может предоставлять дополнительные методы для изменения цвета шрифта, фона или состояния кнопки (например, "вдавленная"). Если FormEx доступен, мы можем использовать методы типа FormEx.КнопкаВыбор1.ЦветШрифта = RGB(0,0,255); или FormEx.КнопкаВыбор1.УстановитьФлажок(1);.
  3. Смена картинок: Если наша кнопка поддерживает картинку, мы можем менять ее на "выбранную" и "невыбранную" версии.

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

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

Пример кода, демонстрирующий этот подход:


// Переменная в модуле формы для хранения идентификатора выбранной кнопки
Перем ВыбраннаяКнопкаИД;

Процедура ПриОткрытии()
    // Устанавливаем начальное значение и обновляем состояние кнопок
    ВыбраннаяКнопкаИД = "КнопкаВыбор1"; // По умолчанию выбрана первая кнопка
    ОбновитьСостояниеКнопок();
КонецПроцедуры

Процедура ОбновитьСостояниеКнопок()
    // Сбрасываем заголовки и состояние всех кнопок в "невыбранное"
    // Если используем FormEx, то также сбрасываем стили или флажки
    Форма.КнопкаВыбор1.Заголовок("Вариант 1");
    // Если FormEx установлен: FormEx.КнопкаВыбор1.ЦветШрифта = RGB(0,0,0); FormEx.КнопкаВыбор1.УстановитьФлажок(0);
    
    Форма.КнопкаВыбор2.Заголовок("Вариант 2");
    // Если FormEx установлен: FormEx.КнопкаВыбор2.ЦветШрифта = RGB(0,0,0); FormEx.КнопкаВыбор2.УстановитьФлажок(0);

    Форма.КнопкаВыбор3.Заголовок("Вариант 3");
    // Если FormEx установлен: FormEx.КнопкаВыбор3.ЦветШрифта = RGB(0,0,0); FormEx.КнопкаВыбор3.УстановитьФлажок(0);

    // Устанавливаем заголовок и состояние для выбранной кнопки
    Если ВыбраннаяКнопкаИД = "КнопкаВыбор1" Тогда
        Форма.КнопкаВыбор1.Заголовок("Вариант 1 (Выбрано)");
        // Если FormEx установлен: FormEx.КнопкаВыбор1.ЦветШрифта = RGB(255,0,0); FormEx.КнопкаВыбор1.УстановитьФлажок(1);
    ИначеЕсли ВыбраннаяКнопкаИД = "КнопкаВыбор2" Тогда
        Форма.КнопкаВыбор2.Заголовок("Вариант 2 (Выбрано)");
        // Если FormEx установлен: FormEx.КнопкаВыбор2.ЦветШрифта = RGB(255,0,0); FormEx.КнопкаВыбор2.УстановитьФлажок(1);
    ИначеЕсли ВыбраннаяКнопкаИД = "КнопкаВыбор3" Тогда
        Форма.КнопкаВыбор3.Заголовок("Вариант 3 (Выбрано)");
        // Если FormEx установлен: FormEx.КнопкаВыбор3.ЦветШрифта = RGB(255,0,0); FormEx.КнопкаВыбор3.УстановитьФлажок(1);
    КонецЕсли;
КонецПроцедуры

Процедура КнопкаВыбор1_ПриНажатии()
    ВыбраннаяКнопкаИД = "КнопкаВыбор1";
    ОбновитьСостояниеКнопок();
КонецПроцедуры

Процедура КнопкаВыбор2_ПриНажатии()
    ВыбраннаяКнопкаИД = "КнопкаВыбор2";
    ОбновитьСостояниеКнопок();
КонецПроцедуры

Процедура КнопкаВыбор3_ПриНажатии()
    ВыбраннаяКнопкаИД = "КнопкаВыбор3";
    ОбновитьСостояниеКнопок();
КонецПроцедуры

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

Подход 3: Использование индивидуальных элементов "Переключатель" без формирования стандартной группы

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

Принцип работы

Если мы размещаем на форме несколько элементов "Переключатель" и каждому из них присваиваем собственный, уникальный идентификатор (например, ПереключательА, ПереключательБ, ПереключательВ) и при этом ни один из них не имеет признака "Первый в группе" или же каждый является "Первым в группе" для себя (что по сути делает их отдельными), то они перестают образовывать стандартную группу в понимании 1С 7.7. В этом случае каждый такой элемент "Переключатель" становится отдельным объектом на форме, и мы можем обращаться к его свойствам, включая Заголовок(), индивидуально.

Шаг 1: Размещение и именование элементов

  1. Мы добавляем на форму элементы "Переключатель" в необходимом количестве.
  2. Для каждого элемента мы устанавливаем уникальный идентификатор (например, ПереключательОдин, ПереключательДва, ПереключательТри).
  3. Мы не устанавливаем признак "Первый в группе" ни для одного из них, или же убеждаемся, что они не объединены в группу по порядку обхода. По сути, каждый переключатель действует как отдельный элемент управления.
  4. Мы создаем обработчик события ПриНажатии() для каждого из этих переключателей.

Шаг 2: Программное управление заголовками

Теперь, когда каждый переключатель является независимым объектом с собственным идентификатором, мы можем напрямую изменять его заголовок:


Форма.ПереключательОдин.Заголовок("Новый текст для первого варианта");
Форма.ПереключательДва.Заголовок("Новый текст для второго варианта");

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

Шаг 3: Реализация логики группы переключателей

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

Давайте рассмотрим пример кода в модуле формы:


// Переменная в модуле формы для хранения идентификатора текущего выбранного переключателя
Перем ТекущийВыбранныйПереключательИД;

Процедура ПриОткрытии()
    // Устанавливаем начальное значение и обновляем состояние и заголовки переключателей
    ТекущийВыбранныйПереключательИД = "ПереключательОдин"; // По умолчанию выбран первый
    ОбновитьСостояниеИЗаголовкиПереключателей();
КонецПроцедуры

Процедура ОбновитьСостояниеИЗаголовкиПереключателей()
    // Проходим по всем нашим "независимым" переключателям и устанавливаем их состояние и заголовки
    
    // Сбрасываем флажки и устанавливаем базовые заголовки для всех
    Форма.ПереключательОдин.УстановитьФлажок(0);
    Форма.ПереключательОдин.Заголовок("Вариант 1");

    Форма.ПереключательДва.УстановитьФлажок(0);
    Форма.ПереключательДва.Заголовок("Вариант 2");

    Форма.ПереключательТри.УстановитьФлажок(0);
    Форма.ПереключательТри.Заголовок("Вариант 3");

    // Теперь устанавливаем флажок и, возможно, изменяем заголовок для выбранного
    Если ТекущийВыбранныйПереключательИД = "ПереключательОдин" Тогда
        Форма.ПереключательОдин.УстановитьФлажок(1);
        Форма.ПереключательОдин.Заголовок("Вариант 1 (Выбрано)");
    ИначеЕсли ТекущийВыбранныйПереключательИД = "ПереключательДва" Тогда
        Форма.ПереключательДва.УстановитьФлажок(1);
        Форма.ПереключательДва.Заголовок("Вариант 2 (Выбрано)");
    ИначеЕсли ТекущийВыбранныйПереключательИД = "ПереключательТри" Тогда
        Форма.ПереключательТри.УстановитьФлажок(1);
        Форма.ПереключательТри.Заголовок("Вариант 3 (Выбрано)");
    КонецЕсли;
КонецПроцедуры

Процедура ПереключательОдин_ПриНажатии()
    // Проверяем, если этот переключатель уже выбран, ничего не делаем,
    // иначе обновляем выбор
    Если ТекущийВыбранныйПереключательИД <> "ПереключательОдин" Тогда
        ТекущийВыбранныйПереключательИД = "ПереключательОдин";
        ОбновитьСостояниеИЗаголовкиПереключателей();
    КонецЕсли;
КонецПроцедуры

Процедура ПереключательДва_ПриНажатии()
    Если ТекущийВыбранныйПереключательИД <> "ПереключательДва" Тогда
        ТекущийВыбранныйПереключательИД = "ПереключательДва";
        ОбновитьСостояниеИЗаголовкиПереключателей();
    КонецЕсли;
КонецПроцедуры

Процедура ПереключательТри_ПриНажатии()
    Если ТекущийВыбранныйПереключательИД <> "ПереключательТри" Тогда
        ТекущийВыбранныйПереключательИД = "ПереключательТри";
        ОбновитьСостояниеИЗаголовкиПереключателей();
    КонецЕсли;
КонецПроцедуры

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

Выводы и рекомендации

Как мы видим, прямых и простых способов изменить заголовки всех переключателей в стандартной группе 1С 7.7 не существует из-за особенностей архитектуры платформы. Однако, мы рассмотрели несколько надежных обходных путей:

  1. Использование Надписей: Этот метод является одним из самых чистых и рекомендуемых, когда нам нужен полный контроль над текстом заголовков и требуется сохранить визуальное отображение "точки" переключателя. Мы получаем гибкость в управлении текстом и внешним видом, при этом используя встроенную логику группы переключателей для значения.
  2. Использование Кнопок: Этот подход дает нам максимальную свободу в дизайне и поведении, позволяя создавать полностью кастомизированные "переключатели". Он идеален, когда нам нужно полностью переосмыслить внешний вид и функциональность элементов выбора, но требует полной ручной реализации логики группы.
  3. Индивидуальные Переключатели: Если мы готовы отказаться от автоматической логики группы переключателей в 1С 7.7 и управлять состоянием каждого переключателя вручную, то присвоение каждому уникального идентификатора позволяет напрямую изменять их заголовки. Этот метод является прямым использованием элемента Переключатель для управления его заголовком, но требует дополнительной работы по имитации группового поведения.

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

← На главную