Лабораторная работа 5. Работа с Формой

5.1. Из чего состоит форма?
5.2. Реквизиты формы
    5.2.1. Реквизиты формы и их связь с элементами формы
    5.2.2. Два объекта (реквизита) в одной форме и связь между ними
5.3. Использование объекта типа "ДеревоЗначений"
5.4. Привязка элементов формы
5.5. Что мы узнали

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

 

 

5.1. Из чего состоит форма?

Для того чтобы понять, из чего состоит форма, откроем в Конфигураторе основную форму списка справочника "Подразделения" (см. рис. 5.1).


Рис. 5.1. Окно редактора форм Конфигуратора.

Мы видим, что это окно имеет внизу три закладки:

*       Диалог;

*       Модуль;

*       Реквизиты;

Диалог состоит из отдельных элементов диалога, которые размещены в форме.

Каждый из элементов и сама форма в целом обладают необходимым набором свойств, которые позволяют задать поведение формы в режиме "1Средприятие".

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

Модуль в форме предназначен в основном для размещения в форме процедур - обработчиков событий.

При необходимости, в этом модуле могут быть размещены вспомогательные процедуры и функции, которые вызываются из процедур – обработчиков событий. Если разработчик конфигурации предполагает осуществлять открытие формы программным путем (метод .ПолучитьФорму(…);), то в модуле формы можно разместить дополнительные переменные, процедуры и функции с дополнительным ключевым словом Экспорт, обращение к которым возможно через объект типа "Форма".

5.2. Реквизиты формы

5.2.1. Реквизиты формы и их связь с элементами формы
5.2.2. Два объекта (реквизита) в одной форме и связь между ними

Закладка "Реквизиты" (см. рис. 5.2) определяет, какие данные должна отображать форма и как она должна себя вести в целом.


Рис. 5.2. Реквизиты формы.

Реквизитов может быть много. Из этого следует, что в одной форме можно одновременно отображать несколько разных объектов (необязательно как-то связанных друг с другом).

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

Именно основной реквизит определяет поведение формы в целом.

 

 

5.2.1. Реквизиты формы и их связь с элементами формы

В форму можно вставлять элементы управления разных типов. Если выбрать пункт меню "Форма – Вставить элемент управления…", то система откроет диалог "Вставка элемента управления" (см. рис. 5.3).

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


Рис. 5.3. Типы элементов управления.

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

 "Данные".

Приведем пример: выделим в центре формы списка справочника "Подразделения" элемент формы типа "Табличное поле" и откроем его свойства (см. рис. 5.4).

Мы видим, что в качестве источника данных выступает реквизит с именем "СправочникСписок". Для того чтобы понять что это за объект, необходимо в редакторе форм "перевернуть" закладку.

Откройте закладку "Реквизиты" (см. рис. 5.2) и убедитесь в том, что СправочникСписок имеет тип "СправочникСписокодразделения".

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


Рис. 5.4. Свойство "Данные" элемента формы.

 

5.2.2. Два объекта (реквизита) в одной форме и связь между ними

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

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

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

Упражнение №5.1.

Откройте форму "ОсновнаяФормаСписка" справочника "Подразделения". Откройте закладку "Реквизиты" и нажмите на кнопку Ins на клавиатуре, после чего заполните свойства нового реквизита следующими значениями:

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


Рис. 5.5. Форма списка справочника "Подразделения" после изменений.

Вставьте в форму элемент управления "Табличное поле", используя команду "Форма – Вставить элемент управления".

В открывшемся диалоге выберите элемент управления "Табличное поле" и заполните его свойства следующими значениями:

Нажмите на кнопку "ОК" и расположите элемент в свободной области формы (см. рис 8.6).


Рис. 5.6. Форма списка после вставки второго табличного поля.

Сейчас это поле никак не связано с реквизитами формы. Чтобы установить такую связь мы изменим свойства элементов формы "СписокФирм" и "СправочникСписок":

Упражнение №5.2.

Установите для элемента формы "СписокФирм" свойство "Данные" в значение "СписокФирм".

Что произошло с табличным полем?

Установите для элемента "СписокФирм" свойство "Только просмотр".

Удалите колонку "Код".

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

Используя кнопку выбора, в свойстве "Связь по владельцу" отройте диалог "Выбор связи". На закладке "События" выберите событие "ПриАктивизацииСтроки" для объекта "СписокФирм" (см. рис. 5.7).

Сохраните и обновите конфигурацию и проверьте работу формы.


Рис. 5.7. Диалог "Выбор связи".

 

 

5.3. Использование объекта типа "ДеревоЗначений"

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

В формах достаточно часто встречаются элементы формы типа "Табличное поле". Указав для этого поля свойство "Данные" мы устанавливаем связь между списком записей какого-либо прикладного объекта и элементом формы. При этом заполнение этого элемента конкретными строками берет на себя сама форма – программировать ничего не нужно.

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

В этом разделе мы рассмотрим указанную проблему на примере формы списка справочника "Сотрудники".

В форме списка справочника "Сотрудники" слева расположено дерево, которое отображает группы справочника. Нашему пользователю будет удобнее, если слева будут отображаться в одном дереве как фирмы, так и подразделения, которые им принадлежат. Это должно выглядеть так, как это изображено на рисунке 5.8.

К сожалению, сама форма (без программирования) не может отобразить в этом элементе формы необходимые нам данные.

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


Рис. 5.8. Дерево значений, которое содержит список фирм и подразделений.

Но сначала нам нужно будет выполнить подготовительные действия, выполнив следующее упражнение:

Следующие действия мы проделаем уже на закладке "Диалог".

Здесь мы исправим свойства элемента диалога "Дерево".


Рис. 5.9. Форма списка после выполнения упражнения №5.4.

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


Рис. 5.10. Новая колонка в дереве значений.

Теперь нам предстоит заполнить дерево конкретными значениями. Но когда (в какой момент) мы можем это сделать?

Для того чтобы понять какое событие использовать, следует выделить саму форму как объект и в окне "Свойства" обратиться к группе свойств "События" (см. рис. 5.11).


Рис. 5.11. События формы.

Дерево мы будем заполнять пока однократно - "при открытии" формы. Поскольку список фирм и подразделений с течением времени изменяется мало.

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

Процедура ПриОткрытии()
    // Вставить содержимое обработчика.
КонецПроцедуры

Внутри этой процедуры мы можем написать цикл выборки из справочника "Фирмы":

//ПриОткрытии() - заполняет элемент формы "Дерево"
//конкретными значениями
Процедура ПриОткрытии()
    ВыборкаФирм = Справочники.Фирмы.Выбрать();
    Пока
ВыборкаФирм.Следующий() Цикл
        Ссылка = ВыборкаФирм.Ссылка;
    КонецЦикла;
КонецПроцедуры

Теперь нам нужно куда-то сохранить нашу ссылку…

Сохранять ссылку мы будем в строку объекта типа "ДеревоЗначений", используя для хранения ссылки одноименную колонку.

Но как добраться до этого объекта?

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

Однако это будет объект как элемент формы. У этого объекта есть свойство Значение, которое и будет содержать ссылку на объект типа "ДеревоЗначения".

Сам объект дерево значений имеет две коллекции (свойства) – Колонки и Строки. Колонки мы добавлять не собираемся, т.к. планируем увеличивать количество строк в дереве. Поэтому нам придется записать в модуле: ЭлементыФормы.Дерево.Значение.Строки.

Это выражение по типу данных в системе называется "КоллекцияСтрокДереваЗначений". У всех коллекций в языке "1Средприятия" есть метод .Добавить(). Для данного типа данных этот метод вернет ссылку на добавленную строку.

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

Упражнение №5.7.

Наберите в модуле формы следующий текст:

//ПриОткрытии() - заполняет элемент формы "Дерево"
// конкретными значениями

Процедура ПриОткрытии()
    ВыборкаФирм = Справочники.Фирмы.Выбрать();
    Пока
ВыборкаФирм.Следующий() Цикл
        СтрокаСФирмой = ЭлементыФормы.Дерево.Значение.Строки.Добавить();
        СтрокаСФирмой.Ссылка = ВыборкаФирм.Ссылка;
    КонецЦикла;
КонецПроцедуры

Обновите конфигурацию и проверьте работу формы списка справочника "Сотрудники".

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

*       либо это - Выбрать(Родитель, Владелец, Отбор, Порядок);

*       либо это - ВыбратьИерархически(Родитель, Владелец, Отбор, Порядок);

Метод .Выбрать(…) будет выбирать записи, которые расположены на одном уровне. А метод .ВыбратьИерархически(…) будет выбирать все записи распложенные на текущем и нижележащем уровнях.

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

Добавить новый уровень в дерево значений мы сможем, если для конкретной строки обратимся к ее свойству Строки, которое специально предназначено для обращения к строкам на ниже лежащем уровне:

СтрокаСПодразделением = СтрокаСФирмой.Строки.Добавить();

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

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

У этой процедуры три параметра.

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

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

Упражнение №5.7 (продолжение).

Наберите в модуле формы следующий текст:

//ПриОткрытии() - заполняет элемент формы "Дерево"
// конкретными значениями

Процедура ПриОткрытии()
    ВыборкаФирм = Справочникиирмы.Выбрать();
    Пока
ВыборкаФирм.Следующий() Цикл
        СтрокаСФирмой = ЭлементыФормы.Дерево.Значение.Строки.Добавить();
        СтрокаСФирмой.Ссылка = ВыборкаФирм.Ссылка;
        ДобавитьУровеньПодразделений(
        СтрокаСФирмой,
        Справочники.Подразделения.ПустаяСсылка(),
        ВыборкаФирм.Ссылка);
    КонецЦикла;
КонецПроцедуры

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

Нам осталось сделать совсем немного. А именно: указать системе, что список, расположенный справа, связан с колонкой "Ссылка" дерева, которое расположено слева.

Упражнение №5.5.

Выделите в элементе формы "Дерево" колонку "Ссылка" и установите, используя кнопку выбора для нее свойство "Тип значения":


Рис. 5.12. Выбор составного типа данных.

Чтобы проделать это, необходимо в диалоге "Редактирование типа данных" установить флаг "Составной тип" (см. рис. 5.12).

Указанные выше действия были необходимы для того, чтобы установить связь по владельцу в табличном поле "Список":

Выделите в диалоге табличное поле с именем "СправочникСписок".

Очистите свойство "Связь по родителю", используя для этого кнопку очистки. Используя кнопку выбора, установите свойство "Связь по владельцу" в значение: ЭлементыФормыерево.ТекущиеДанные.Ссылка (см. рис. 5.13).

Проверьте работоспособность формы в режиме "1Средприятие".


Рис. 5.13. Выбор связи с Владельцем.

 

5.4. Привязка элементов формы

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

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

А что должно происходить с элементами формы при таких действиях пользователя? На этот вопрос и позволяет ответить настройка привязки каждого элемента формы.

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

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

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

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

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

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


Рис. 5.14. Проверка формы списка справочника "Подразделения".

Упражнение №5.10.

Используя пункт меню "Форма – Вставить элемент управления…", вставьте в форму элемент типа "Разделитель".

Новый элемент следует расположить между элементами "Дерево" и "СправочникСписок" (см. рис. 5.15).


Рис. 5.15. Расположение разделителя в форме.

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

Проверьте работу формы, в том числе и в режиме "1Средприятие".

Следующее упражнение предназначено для самостоятельного закрепления только что рассмотренного материала:

 

 

5.5. Что мы узнали

В этой главе мы рассмотрели основные приемы работы с формой как в Конфигураторе, так и в режиме "1Средприятие".

Напомним, что форма состоит из Диалога, Модуля и Реквизитов.

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

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

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

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

.