Клюев В.В.
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С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.
Программная модификация формы может потребоваться в нескольких случаях:
- При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
- При реализации некоторых общих алгоритмов. Например, в подсистеме «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
- При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.
В управляемой форме можно программно добавить, изменить и удалить:
- реквизиты;
- локальные команды;
- элементы.
Все указанные операции возможны только на сервере.
Программное изменение формы имеет ограничения:
- Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
- Нельзя назначить реквизит основным.
Изменение команд формы
Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды
Добавить(< ИмяКоманды >)
Количество ()
Найти(< ИмяКоманды >)
Удалить(< Команда >)
Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.
В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды. Добавить(«ИсторияИзменений» );
Команда. Действие = ;
Команда. Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда )
// действия команды
КонецПроцедуры
Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .
Изменение реквизитов формы
Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты (< Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Изменение реквизитов выполняется методом ИзменитьРеквизиты (<ДобавляемыеРеквизиты >, <УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .
Внимание!
Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.
Создадим новый реквизит формы с именем Покупатель:
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты. Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов («СправочникСсылка.Контрагенты»), «Клиент»));// Изменения состава реквизитов
);
Изменение элементов формы
Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:
Вставить(< Имя>, < ТипЭлемента>, < Родитель>, < Элемент >)
Добавить(< Имя>, < ТипЭлемента>, < Родитель >)
Количество ()
Найти(< Имя >)
Переместить(< Элемент>, < Родитель>, < МестоРасположения >)
Удалить(< Элемент >)
Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить() , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:
- ГруппаФормы;
- ТаблицаФормы;
- ПолеФормы;
- КнопкаФормы.
Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(< ИмяСобытия>, < Действие >) .
Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.
Добавление команды и связанной с ней кнопки:
// Создание команды
Команда = Команды. Добавить(«ИсторияИзменений» );
Команда. Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда. Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы. Добавить(«ИсторияИзменений» , Тип(«КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;
Добавление реквизита и связанного с ним поля ввода:
// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты. Добавить (Новый РеквизитФормы («Покупатель» , Новый ОписаниеТипов («СправочникСсылка.Контрагенты» ), «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы. Добавить(«Покупатель» , Тип(«ПолеФормы» ));
Элемент. Вид = ВидПоляФормы. ПолеВвода;
Элемент. ПутьКДанным = «Покупатель» ;
Назначение элементу формы обработчика события:
ЭлементПокупатель. УстановитьДействие («ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );
&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении (Элемент )
// Действия события
КонецПроцедуры
Внимание!
Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие()
, рекомендуется задавать префикс Подключаемый_.
Внимание!
Скачать обработку с примерами программного поиска и изменения реквизитов, команд и элементов управляемой формы можно .