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

1. Поле ввода
2. Флажок
3. Переключатель

Поле ввода

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

Выбор из списка (РежимВыбораИзСписка)

Выбор из другой формы (Кнопка выбора)

Кнопки регулирования

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

Процедура пвВыборНоменклатурыРегулирование(Элемент, Направление, СтандартнаяОбработка)
//Выбираем данные для поля ввода
// в данном случае справочник Номенклатура
Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| Номенклатура.Ссылка Как Товар
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|УПОРЯДОЧИТЬ ПО
| Номенклатура.Код";
ТЗНоменклатура = Запрос.Выполнить().Выгрузить();

//ищем текущий элемент справочника указанный в поле ввода
ТекЭлемент = ТЗНоменклатура.Найти(Элемент.значение);

Если ТекЭлемент = Неопределено Тогда
// если не нашли элемент тогда устанавливаем номер индекса
// за пределами таблицы значений, т.к. самый первый элемент в
// таблице значений имеет индекс 0
ТекИндекс = -1;
Иначе
// если элемент найден получаем его индекс
ТекИндекс = ТЗНоменклатура.Индекс(ТекЭлемент);
КонецЕсли;

// рассчитываем новый индекс в зависимости от нажатия кнопки
// минус перед переменной Направление стоит для того, чтобы при
// нажатии на верхнюю стрелку показывался элемент стоящий выше
// а следовательно с меньшим индексом
НовИндекс = ТекИндекс-Направление;

// получаем количество элементов в справочнике
// вычетаем единицу т.к. все коллекции в 8.1 начинаются с 0
КоличествоЭлементов = ТЗНоменклатура.Количество()-1;

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

КонецПроцедуры

Флажок

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

Переключатель

Переключатель используется для выбора одного значения из небольшого количества возможных (желательно не более пяти) при этом значения не могут сочетаться, Например: подходит для выбора пола человека. Другой пример: допустим, фирма даёт одну из 3-х скидок на товар, при этом скидки не суммируются:

В данном случае удобство использования переключателей может заключаться в том, что каждый из них может иметь какое-то значение, которое устанавливается в свойстве "Выбираемое значение". И тогда "Скидка 5%" может хранить значение 5 или 0,05.

При использовании переключателей важно помнить три вещи:

      У первого переключателя должно стоять свойство "ПервыйВГруппе" (в данном примере это переключатель "Скидка 5%").

      Переключатели, относящиеся по смыслу к одной группе должны в настройке порядка обхода идти подряд, без прерываний другими элементами формы. Порядок обхода задается из меню "Форма -> Настройка порядка обхода", для данного примера это выглядит так:

  1. Тип выбираемого значения устанавливается у переключателя имеющего свойство "ПервыйВГруппе".

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

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

В типовой конфигурации 1С инициализация переключателей реализуется следующим образом: Процедура ВводНового(Копирование) // инициализация прочих реквизитов Валютный = 1; КонецПроцедуры //ВводНового Вроде бы достаточно просто, но если учесть, что на первое место в группе переключателей обычно ставится самое востребованное значение, могли бы инициализацию сделать и на автомате средствами платформы.

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

Рассмотрим пример использования значения переключателя: Если Валютный = 2 Тогда СчетКассы = СчетПоКоду("50.11"); Иначе СчетКассы = СчетПоКоду("50.1"); КонецЕсли; Для того чтобы понять этот код, необходимо перейти на форму и определить, что реквизит «Валютный» это идентификатор первого элемента в группе переключателей «Касса». Сама группа состоит из 2-х элементов: «рублевая (Кт 50.1)» и «валютная (Кт 50.11)». Только после это становится ясно, что вопреки привычной логике, «Валютный = 2» это признак валютной кассы, а «Валютный = 1 или 0» - рублевой.

Упростить понимание кода можно с помощью определения переменных модуля формы с именами и значениями, соответствующими позициям переключателя. Для данного примера это были бы переменные: Перем кТипКассы_Рублевая, кТипКассы_Валютная;

В блоке инициализации модуля определяем их значения: кТипКассы_Рублевая = 1; кТипКассы_Валютная = 2;

В результате исходный код преобразуется к виду: Если Валютный = кТипКассы_Валютная Тогда СчетКассы = СчетПоКоду("50.11"); ИначеЕсли Валютный = кТипКассы_Рублевая Тогда СчетКассы = СчетПоКоду("50.1"); Иначе Предупреждение("Не указан тип кассы."); КонецЕсли;

В заключение хочу заметить, что на мой взгляд, созданием групп переключателей имеет смысл лишь в том случае, когда в группе не больше 4-х (максимум 5-и) элементов. В противном случае, имеет смысл воспользоваться полем со списком, т.к. оно будет занимать значительно меньше места на форме.

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

Программная модификация формы может потребоваться в нескольких случаях:

  • При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
  • При реализации некоторых общих алгоритмов. Например, в подсистеме «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
  • При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.

В управляемой форме можно программно добавить, изменить и удалить:

  • реквизиты;
  • локальные команды;
  • элементы.

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды

    Добавить(< ИмяКоманды >)

    Количество ()

    Найти(< ИмяКоманды >)

    Удалить(< Команда >)

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды. Добавить(«ИсторияИзменений» );
Команда. Действие = ;
Команда. Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда )
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты (< Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты (<ДобавляемыеРеквизиты >, <УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

Создадим новый реквизит формы с именем Покупатель:


ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты. Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов («СправочникСсылка.Контрагенты»), «Клиент»));

// Изменения состава реквизитов
);

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

    Вставить(< Имя>, < ТипЭлемента>, < Родитель>, < Элемент >)

    Добавить(< Имя>, < ТипЭлемента>, < Родитель >)

    Количество ()

    Найти(< Имя >)

    Переместить(< Элемент>, < Родитель>, < МестоРасположения >)

    Удалить(< Элемент >)

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить() , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

  • ГруппаФормы;
  • ТаблицаФормы;
  • ПолеФормы;
  • КнопкаФормы.

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(< ИмяСобытия>, < Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

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

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты. Добавить (Новый РеквизитФормы («Покупатель» , Новый ОписаниеТипов («СправочникСсылка.Контрагенты» ), «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы. Добавить(«Покупатель» , Тип(«ПолеФормы» ));
Элемент. Вид = ВидПоляФормы. ПолеВвода;
Элемент. ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель. УстановитьДействие («ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении (Элемент )
// Действия события
КонецПроцедуры

Внимание!

Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие() , рекомендуется задавать префикс Подключаемый_.

Внимание!

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

1С создаются системой автоматически при использовании прикладного решения. Являются основой представления (отображения) информации в системе "1С:Предприятие".

Структура формы 1С

Форма в представляет собой логическое описание состава формы. элементов описывает то, как будет выглядеть форма. Размещение элементов формы выполняется системой автоматически при её отображении.

Отображаемая часть формы (видимая пользователю) описывается как дерево, включающее элементы формы (см. рис. ниже, поле "Элементы формы"):

  • группы, включающей другие элементы,
  • поля ввода,
  • флажки,
  • переключатели,
  • кнопки,
  • таблицы, которые включают элементы-колонки и т. д.

"Элементы формы 1С"

[свернуть]

Группа элементов формы может представляться как

  1. панель с рамкой,
  2. панель со страницами (закладками),
  3. собственно страница,
  4. командная панель.

Вся функциональность формы описывается в виде:

  • реквизитов (данных, с которыми работает форма);
  • команд (выполняемых действий).

Настройка внешнего вида управляемой формы

Настройка внешнего вида управляемой формы пользователем

Настройка внешнего вида управляемой формы может осуществляться на пользовательском уровне. Для данной возможности в действиях формы существует команда "Ещё" - "Изменить форму" (управление только теми элементами формы, которые определены на этапе разработки или по стандартным правилам автогенерации формы).

"Ещё" - "Изменить форму"

Команда "Ещё" - "Изменить форму":

После нажатия "Изменить форму" показывается окно настройки формы 1С:

[свернуть]

Кроме того, в пользовательском режиме возможно:


  • изменять порядок следования форм, переносить их из одной колонки в другую (если рабочий стол организован в две колонки), однако изменить количество колонок на рабочем столе нельзя;
  • выводить информацию в виде отдельных окон (при вызове навигационной команды нужно удерживать клавишу Shift).

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

Настройка внешнего вида управляемой формы разработчиком

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

  • команды самой формы;
  • глобальные команды, используемые в всей конфигурации;
  • параметризуемые команды, которые будут открывать другие формы с учетом конкретных данных текущей формы.

Рисунок (изменение формы 1С разработчиком)

[свернуть]

При разработке формы 1С необходимо:

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

Более подробную информацию по работе с формами в курсе "Работа с формами в "1С:Предприятии 8.3", http://www.1c.ru/rus/partners/training/uc1/course.jsp?id=161.

Добавляем на форму рамку группы и на нее размещаем переключатели через пункт меню Форма -> Вставить элемент управления… и в открывшемся окне выбираем переключатели:

В правой части окна добавляем значение переключателя столько, сколько нам необходимо, ставим галочку на «Акции – первый в группе», для того чтоб данный переключатель выбирался автоматически.

После того как добавим переключатели выберем тип данных для первого значения «Акции», в нашем случае присваиваем значение «ТипЦБ»:

А само значение переключателя вводится в Данные -> Выбираемое значение. Для Акции это 0, Облигации – 1, Векселя - 2 и Паи – 3. Но до введения этих данных необходимо проверить порядок.

Если переключатели идут не по порядку, то не будет осуществлено переключение, то есть не сможем выбрать значение облигации. Для того чтобы включить эту возможность, необходимо выбрать меню Форма -> Настройка порядка обхода и все переключатели разместить по порядку.

Проверьте значение выбираемого значения переключателей после исправления порядка.

Остается только в событии переключателя «акции» «При изменении» написать код программы:

Если ТипЦБ = 0 Тогда

ИначеЕслиТипЦБ = 1 Тогда

ЭтаФорма.ЭлементыФормы.Поступление.Колонки.НКД.Доступность = 1; // только для облигаций разрешаем НКД

ИначеЕслиТипЦБ = 2 Тогда

ЭтаФорма.ЭлементыФормы.Поступление.Колонки.НКД.Доступность = 0;

ИначеЕслиТипЦБ = 3 Тогда

ЭтаФорма.ЭлементыФормы.Поступление.Колонки.НКД.Доступность = 0;

КонецЕсли;

Теперь при выборе переключателя «Облигации» дается возможность редактировать значение колонки НКД.