СправочникСписок.Отбор.Ссылка.Значение. 3 страница



Специальные приемы разработки


               
 
 
   
 
   
 
   





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


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

Например, если в форме существует элемент управления табличное
поле, можно в качестве данных указать ему имя реквизита
«СправочникСписок», которь1Й имеет Утш Рек
СправочникСписок.Номенклатура. значения


 



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

В числе прочего, это расширение добавляет элементам управлени одно важное свойство - Данные.Это свойство имеет тип Строка



Специальные приемы разработки


Формы


 


           
   
 
   
 
   


Если на этой же форме разместить поле ввода, то его свойство
Данныеможет иметь значение



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

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

Следующим важным свойством, которым обладают элементы управления расположенные в форме, является свойство «ТипЗначения».Это свойство содержит тип реквизита, данные которого отображает элемент управления. При выборе в конфигураторе значения свойства Данные,свойство Типзначения заполняется автоматически, на основании типа выбранных данных.

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

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

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

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

• Число,

• Строка,

• Дата,

• СправочникСсылка.Клиенты,

• СправочникСсылка.Сотрудники,


 


508



Специальные приемы разработки


Формы


 


СправочникСсылка.Номенклатура,

то можно ограничить пользователя лишь возможностью ввода значений примитивных типов:

• Число,

• Дата,

• Строка:


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

Например, как в приведенном выше примере, когда в реквизите уже хранится значение типа СправочникСсылка.Клиенты.В этом случае ограничение типа будет игнорироваться, т.е. тип отображаемых данных будет обладать «большим весом», чем поле ввода, эти данные отображающее. Такое решение вполне логично, поскольку именно реквизит содержит данные, а поле ввода - всего лишь инструмент для их отображения.


 


510



[ециальные приемы разработки


Формы


 


       
 
 
   

 

Связанные списки

П

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

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

Рассмотрим вариант создания такой связи между списками на примере списка документа «ПриходнаяНакладная», в котором будут отображаться движения документа по регистру «ОстаткиМатериалов». Откроем конфигуратор и создадим основную форму списка документа «ПриходнаяНакладная». Уменьшим высоту табличного поля списка документа и на освободившемся пространстве расположим табличное поле с именем «ТабличноеПоле» и типом РегистрНакопленияСписок.ОстаткиМатериалов:

Добавим на форму табличное поле...


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

Для этого откроем палитру свойств добавленного нами табличного поля и воспользуемся свойством «Связь по регистратору». Связь по регистратору мы будем устанавливать с обработчиком события «При активизации строки» верхнего поля «ДокументСписок»:

Установим связь по регистратору... \


 


512



Специальные приемы разработки


Фс


 


Теперь запустим 1С:Предприятие в режиме отладки и проверим работу связанных списков:


Чтобы выполнить этот пример, уберем для нижнего табличного поля связь по регистратору, а для верхнего создадим обработчик события «При активизации строки»:



ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)

ЭлементыФормы.ТабличноеПоле.Значение.Отбор.Регистратор

.Установить(Элемент.ТекущаяСтрока, Истина); КонецПроцедуры


Обратите внимание, что при перемещении в верхнем списке, данные нижнего списка меняются соответствующим образом:



 


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


514



Специальные приемы разработки


Формы


 


Изменение источника данных табличного поля

В

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

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

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


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

Затем создадим вторую кнопку с заголовком «Стоимость материалов». Напишем подсказку - «Отобразить движения по регистру «Стоимость материалов».

Нажмем «ОК» и расположим кнопки в форме:

Откроем палитру свойств кнопки «ОстаткиМатериалов» и укажем, что тип выбираемого значения будет Строка,а выбираемое значение будет равно «Остатки».

По умолчанию все кнопки имеют тип выбираемого значения Числои выбираемое значение 0, поэтому для того, чтобы можно было анализировать состояние группы переключателей, необходимо для каждой кнопки в этой группе задать уникальное выбираемое значение. Кроме этого, одна из кнопок в группе всегда должна быть первой в группе - именно по ее значению можно будет определить состояние группы, а переключение кнопок в группе будет выполняться в порядке обхода элементов управления формы (Форма | Порядок обхода).По умолчанию установлен автопорядок обхода элементов формы (свойство формы «Автопорядок обхода»). Поэтому если вам


 


516



Специальные приемы разработки


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

Сейчас нас устраивает автоматический порядок обхода элементов и поэтому мы создадим обработчик события «ПриОткрытии» формы, и зададим в нем начальное значение нашего переключателя:


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

Откройте 1С:Предприятие в режиме отладчика и проверьте работу списка документа «ПриходнаяНакладная».


Процедура ПриОткрытии()

ОстаткиМатериалов = "Остатки"; КонецПроцедуры;

Теперь добавим в форму новый реквизит, который будет являться
вторым источником данных для нашего табличного поля. Назовем его
«РегистрСписок» и установим его тип

РегистрНакопленияСписок.СтоимостьМатериалов:



 


           
   
 
   
 
 
   
 

его

тип

Укажем РегистрНакопленияСписок.СтоимостьМатериалов.

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

ПроцедураОстаткиМатериаловПриИзменении(Элемент)

Если ОстаткиМатериалов = "Остатки" Тогда ЭлементыФормы.ТабличноеПоле.Данные = "ТабличноеПоле";

иначе ЭлементыФормы.ТабличноеПоле.Данные = "РегистрСписок";

КонецЕсли;

ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();

ДокументСписокПриАктивизацииСтроки(ЭлементыФормы.ДокументСписок); КонецПроцедуры


518



Специальные приемы разработки


Формы


 


Изменение данных табличного поля путем установки типа значения

К

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

Нашей задачей будет создание в форме списка аналогичного механизма отображения движений документов «ОказаниеУслуги» в регистрах накопления.

Откроем конфигуратор и создадим основную форму списка документа «ОказаниеУслуги» с помощью конструктора. Расположим на ней переключатель из трех кнопок:

Зададим следующие выбираемые значения переключателей:

• «ОстаткиМатериалов» - «Остатки»,

• «СтоимостьМатериалов» - «Стоимость»,

• «Продажи» - «Продажи».


Под переключателем расположим табличное поле с именем «ТабличноеПоле», типом ТаблицаЗначений и пустым свойством Данные:

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

Процедура ПриОткрытии()

ОстаткиМатериалов = "Остатки"; Массив = Новый Массив;

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

ТабПоле.Значение.Отбор.Регистратор.Установить(, Истина); КонецПроцедуры

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


 


520



Специальные приемы разработки


Формы


 


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

Затем создадим процедуру обработки события «ПриИзменении» переключателя, в которой, в зависимости от установленного значения переключателя, будем изменять свойство ТипЗначениятабличного поля:

ПроцедураОстаткиМатериаловПриИзменении(Элемеит)

Если ОстаткиМатериалов = "Остатки" тогда

НужныйТип = Тип("РегистрНакопленияСписок.ОстаткиМатериалов"); ИначеЕсли ОстаткиМатериалов = "Стоимость" тогда

НужныйТип = ТипС'РегистрНакопленияСписок.СтоимостьМатериалов"); ИначеЕсли ОстаткиМатериалов = "Продажи" тогда

НужныйТип = Тип("РегистрНакопленияСписок.Продажи"); КонецЕсли;

Массив = Новый Массив();

Массив.Добавить(НужныйТип);

НашеОписание = Новый ОписаниеТипов(Массив);

ТабПоле = ЭлементыФормы.ТабличноеПоле; ТабПоле.ТипЗначения = НашеОписание; ТабПоле.СоздатьКолонки();

НашОтбор = ТабПоле.Значение.Отбор;

ЗначениеОтбора = ЭлементыФормы.ДокументСписок.ТекущаяСтрока; НашОтбор.Регистратор.УстановитьСЗначениеОтбора, Истина); КонецПроцедуры


Теперь осталось только создать обработчик события хПриАктивизацииСтроки» табличного поля «ДокументСписок»:

ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)

НашОтбор = ЭлементыФормы.ТабличноеПоле.Значение.Отбор; Если Элемент.ТекущиеДанные = Неопределено Тогда

НашОтбор.Регистратор.Установить(, Истина); Иначе

НашОтбор.Регистратор.Установить(Элемент.ТекущаяСтрока, Истина); КонецЕсли; КонецПроцедуры

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

Запустите 1С:Предприятие и проверьте работу списка документа «ОказаниеУслуги».


Действия, выполняемые этой процедурой, аналогичны предыдущей, за исключением того, что ОписаниеТиповмы формируем исходя из положения переключателя, и отбор устанавливаем по значению ссылки на документ, выделенный в верхнем табличном поле «ДокументСписок».


522



Специальные приемы разработки


Формы


 


Вычисляемые колонки в списках

Н

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

Мы рассмотрим эту ситуацию на примере отображения актуальной цены в списке справочника «Номенклатура».

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

В табличное поле списка справочника Номенклатура добавим колонку Цена...

Создадим обработчик события табличного поля «При выводе строки», и добавим в него следующий текст:

Процедура СправочникСписокПриВыволеСтроки(Элемент,ОформлениеСтр(

ДанныеСтроки)

//для элементов отобразим цену и...

Если Не ДанныеСтроки.ЭтоГруппа тогда ОтборНоменклатуры = Новый Структура; ОтборНоменклатутш.ВставитьС'Номенклатура", ДанныеСтроки.Ссылка);


ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина; АктуальнаяЦена = РегистрыСведений.Цены

.ПолучитьПоследнее(, ОтборНоменклатуры.Цена; ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;

//низкие цены выделим другим цветом Если АктуальнаяЦена<500 тогда

ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WEBЦвета.Васильковый; КонецЕсли; КонецЕсли; КонецПроцедуры

Обработчик события табличного поля «При выводе строки» передает три параметра: «Элемент» - само табличное поле, для которого было вызвано это событие, «ОформлениеСтроки» - объект, содержащий оформление выводимой строки табличного поля и «ДанныеСтроки» - элемент выборки справочника «Номенклатура», отображаемый в выводимой строке.

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

Затем мы анализируем значение выведенной цены и если оно находится в нижнем ценовом диапазоне (менее 500 рублей), выделяем это значение васильковым цветом. Для указания цвета мы используем системный набор значений WEBL4BeTa.

Запустим 1С:Предприятие в режиме отладки и посмотрим, какой внешний вид примет теперь справочник «Номенклатура»: