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

Клюев В.В.

http://prof1c.kklab.ru

РАБОТА С ПЕРЕКЛЮЧАТЕЛЯМИ

Прошу учесть всех пользователей сервиса сайт - материалы размещаю в разделе Начинающим!!!

8.2 Управляемые формы

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

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

Итак, создадим новый справочник и добавим реквизит «Реквизит1», с типом «Булево»

Теперь перейдем на вкладку Формы и добавим новую форму.

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

Итак, что же мы сделали не так?
Давайте посмотрим в свойства реквизита, есть ли там переключение на вид элемента управления.
И мы видим, что Поле переключателя здесь нет!(В чем мы ошиблись?

Видимо, что вид элемента управления на форме - зависит от типа данных, вернемся к свойствам формы, а именно к вкладке реквизиты и изменим свойства нашего реквизита -а именно его тип «Булево», на тип «Число».

Теперь вернемся опять к свойствам элемента управления и проверим, добавился ли Вид элемента управления в его свойствах - - - И урра, мы видим там вид - Поле переключателя.

Теперь смотрим на форму, что мы видим:

Мы видим - 3 значения по умолчанию, 3 переключателя, но нам нужно их два, идем опять в свойства реквизита, и смотрим там свойств «Количество колонок»

Для 2 - поставьте Количество колонок - 2.

Это могло бы немного остановить уставшего программиста)), но теперь и он и мы это знаем!

8.2 Обычные формы.

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

Итак, рассмотрим пример. Есть такой документ корректировка поступления в 1С УПП - он точно есть. Нам однажды понадобилось в него добавить переключатели, чтобы рисовались немного разные проводки для бухгалтерского учета. В чем проблема, казалось бы надо значит надо, сделаем. Но в этой форме уже есть 2 переключателя.

Вот так выглядит форма в которую нам нужно приладить еще переключатели


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

Казалось бы всё просто. Создаем новый реквизит, с типом - «Число» и вставляем 2 переключателя, один из которых будет иметь возможность записать данные в реквизит, а другой нет.

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

При выполнении (при создании нового документа в режиме 1С:Предприятие) мы видим, что сколько бы мы ни старались нажать на Переключатель2 - ничего не происходит. Элементы не работают так как им нужно. Тут есть одна фишка.
Вернитесь в конфигуратор. Выберите пункт в меню Форма -> Настройка порядка обхода … (важно чтобы форма была открыта на экране)


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

ОК. Обновите конфигурацию и попробуйте запустить на выполнение.
Отлично. Всё заработало.

Дополнительно - видео(без звука, итак все понятно)


Прочитал множество форумов, и нигде не увидел доходчивого описания работы с «Переключателем». Вот решил написать сам.

На МОЙ взгляд наиболее часто встречающаяся ошибка - это неправильное представлении об «Переключателе». Когда вы размещаете несколько "Переключателей", например 3, на форме, то многие считают что в логике программы это 3 разных объекта, которые влияют друг на друга. Но, по сути, программа воспринимает все 3 «Переключателя» как один объект. И выбор одного из них меняет состояние этого объекта. Рассмотрим пример.

1. Создадим на форме три переключателя. Для удобства не будем менять названий.
2. Выделите «Переключатель1». В его свойстве в разделе «ОСНОВНЫЕ» поставьте галочку первый в группе. «ТИП ЗНАЧЕНИЯ» выберем число. (Далее рассмотрим почему именно число). Длину можно поставить равной единице, но особой функциональности это не несёт.
3. Выделяем «Переключатель2» в графе «ВЫБИРАЕМОЕ ЗНАЧЕНИЕ» поставим 1.
4. Выделяем «Переключатель3» в графе «ВЫБИРАЕМОЕ ЗНАЧЕНИЕ» поставим 2.
По сути 3 и 4 - м действиями вы установили флаг, который будет меняться при выборе соответствующего «Переключателя». В «Переключатель1» по дефолту «ВЫБИРАЕМОЕ ЗНАЧЕНИЕ» стоит ноль.
5. Проверьте стоят ли переключатели в «ПОРЯДКЕ ОБХОДА» по порядку. (например: 13,14,15)(Рис.1). необходим неразрывный порядок обхода по переключателем. включен автопорядок обхода (позиции пронумерованы 13, 15, 20)(Рис.2) в этом случае переключатели друг под другом работать не будут.Следует снять с формы использование автопорядка и если необходимо вручную указать порядок следования.

Как установить порядок обхода для реквизитов. Находясь в форме, в меню "Диалог" надо снять галку "Автоматический порядок обхода". После этого можно либо воспользоваться "Диалог"->"Настройка порядка обхода", либо "Диалог"->"Порядок обхода". Наиболее удобным, мне кажется второй способ. При этом способе у каждого реквизита появляется картинка с номером реквизита. Вам остается только щелкать мышкой по цифрам, выбирая реквизиты в том порядке, который нужен Вам.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

6. Выделяем «Переключатель1» и пишем у него нужную нам процедуру.
Например:

ЭФ=ЭлементыФормы; Если Переключатель1=0 Тогда ЭФ.СостояниеОплаты.Значение = "Неоплачено"; ИначеЕсли Переключатель1=1 Тогда ЭФ.СостояниеОплаты.Значение = "Частично оплачено"; ИначеЕсли Переключатель1=2 Тогда ЭФ.СостояниеОплаты.Значение = "Оплачено"; КонецЕсли;

7. Жмём F7. Жмём F5. Смотрим всё работает мы молодцы. И большой БОСС даёт нам премию.

ПОЯСНЕНИЕ К КОДУ

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

ПОСЛЕСЛОВИЕ:

Данный код приведен как пример работы с переключателями. На мой взгляд так более наглядно и понятно. Но стоит упомянуть, что в "ТипЗначения" можно выбирать сразу то, что нужно - предопределенное значение справочника, перечисления, например, или строковое значение. То есть в указанном примере можно было сразу назначить переключателям в качестве значений не 0,1,2, а сразу "Неоплачено", "Частично оплачено", "Оплачено". И тогда код сведется в одну строчку:

ЭлементыФормы.СостояниеОплаты.Значение = Переключатель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С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

Внимание!

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