Добавление доп. реквизита в динамический список |
Я |
13.08.21 — 15:46
Приветствую всех.
подымалась мне такая задача.
Как добавить в динамический список доп реквизит программно? и условное оформление по нему.
все мы знаем что в клиенте можно через еще — изменить форму добавить доп реквезит(например в справочнике подразделения организаций у нас есть доп рек. цех) на форму списка.
а как сделать то же самое программно? я так и не смог найти.
а потом сделать по нем условное оформление.( но думаю при решении 1 вопроса решиться и 2).
если у нас динамический список произвольныйЗАПРОС = ИСТИНА. то все понятно — меняем запрос добавляя туда данные
но в нашем случае ЛОЖЬ и просто задана основная таблица и все.
как в нашем случае вывести доп рек программно на управляемую форму?
1 — 16.08.21 — 15:18
ап
пока в голову пришло только разворотить все через расширение и поставить произвольныйЗАПРОС = ИСТИНА и дальше от этого плясать
2 — 16.08.21 — 15:24
создай поле и пропиши ПутьКДанным типа «ПодразделениеОрганизации.Цех»
делов то
3 — 16.08.21 — 15:38
(2) Неверно!
Доп рек -ты лежат в таблице привязанной к объекту. это не просто реквизит объекта.
4 — 16.08.21 — 15:41
(3) а зачем программно? добавляйте непрограммно. поставьте галку Произвольный запрос и вперед.
5 — 16.08.21 — 15:42
(3) ты про Характеристики что-то слышал?
6 — 16.08.21 — 15:47
(4) ну вот разве что так, но хотелось бы программно. нельзя?
(5) что то слышал — но при чем тут они? как они связаны с доп рек-ми?
7 — 16.08.21 — 15:49
(6) самым тесным образом
8 — 16.08.21 — 15:57
(7) простите, но вы не помогаете решить проблему.
дайте ссылку что ли хотя бы — где характеристики делают как доп рек-ты и программно выводят на динамический список где роизвольныйЗАПРОС = лЛожь.
9 — 16.08.21 — 15:59
(8) как по-твоему, откуда дин.список узнает откуда ему брать доп.реквизиты, если они лежат в другой таблице?
10 — 16.08.21 — 16:04
(9) Через запрос . а уж как он там платформе его формирует — то мне не ведомо.
11 — 16.08.21 — 16:09
(6) если программно это в 10 раз дольше. А результат, если что-то поменяется в динамическом списке, то программное еще быстрее рухнет. Так что то же самое, что и не программно. В случае динамического списка без разницы.
12 — 16.08.21 — 16:10
13 — 16.08.21 — 16:10
(10) через характеристики )))
14 — 16.08.21 — 16:11
(11) не поныл вас.
ну может не в 10 а в 3 раза дольше. ну что жеш.
насчет «рухнет» не согласен.
15 — 19.08.21 — 10:20
Короче может кому пригодиться
1. Сделать все красиво не получилось(т.е. добавить програмно доп рек на форму и отбор по нему)
2. Начало процедуры в расширении при создании на сервере
2.1 Выбираем своим запросом ссылки с этим доп рек-ом
2.2 делаем условное оформление где выделяем цветом строку с нужным значением доп рек-та(не отбор, но видимо выделяем для пользователя)
2.3 при изменении(а значит кто то записал элемент справочника) — обновляем список из 2.1 и обновляем его в отборе условного оформления из 2.2.
Итого получаем — рек-та нет на форме, но форма реагирует цветным выделением строки для нужного значения доп рек-та.
Да, это только условное выполнение конкретной задачи для доп рек-ты у которого ограниченное(заранее заданное) кол-во значений.
Как можно сделать лучше?
16 — 19.08.21 — 12:09
Поле.ПутьКДанным = «Список.Ссылка.[наименование доп реквизита]»;
при условии, что в метаданных заданы характеристики для этого объекта..
17 — 19.08.21 — 12:11
(16) метаданные из (12).. квадратные скобки обязательны..
18 — 19.08.21 — 12:12
(0) никак кроме как добавлением поля в запрос демонического списка, условное оформление не имеет отношения к данным списка, оно всего лишь его разукрашивает
AceVi
19 — 19.08.21 — 12:51
(18) еще как имеет.
1. Отбор по данным списка( что именно разукрашиваем)
2. Оформляемые поля- сиречь колонки списка для рзукрашивания.
как видим оформление — напрямую зависит от данных.
(16) это не спортивно — стандартную конфу менять нельзя а в расширении характеристики добавлять нельзя.
отклонено.
Добавление доп. реквизита в динамический список программно
Добавление доп. реквизита в динамический список программно
Некоторые пользователи хотят видеть дополнительную аналитику по определенным объектам конфигурации 1С, для реализации этой потребности существует функционал дополнительных реквизитов и сведений, который зачастую выводится в группу «Дополнительно» или «Дополнительные реквизиты».
Мы же разберем как отобразить дополнительные реквизиты в форме списка элементов. Практически всегда в этой форме используется «Динамический список», но данный способ не позволяет использовать это на обычной «Таблице значений».
Как добавить дополнительный реквизит в динамический список:
Получившейся код модуля:
&НаКлиенте Процедура dev_ПриОткрытииПосле(Отказ) ОтображениеДополнительныхРеквизитов(); КонецПроцедуры &НаСервере Процедура ОтображениеДополнительныхРеквизитов() // Получаем набор свойств объекта по пустой ссылке объекта метаданных. НаборСвойств = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(Справочники.Номенклатура.ПустаяСсылка()); // Инициализируем имя набора свойств. ИмяНабора = НаборСвойств[0].Набор.Наименование; Свойства = НаборСвойств[0].Набор.ДополнительныеРеквизиты.Выгрузить().ВыгрузитьКолонку("Свойство"); // Наполняем массив именами доп.реквизитов, которые мы хотим отобразить в списке формы. // Можно создать отдельную настроку, например регистр где будем хранить выводимые поля, // для конкретных объектов метаданных или даже в зависимости от роли. МассивОтображаемыхСвойств = Новый Массив; МассивОтображаемыхСвойств.Добавить("Краткое описание"); // и т.д. // Если например у нас полные права то выведем все доп.реквизиты. Если РольДоступна("ПолныеПрава") Тогда МассивОтображаемыхСвойств = ПолучитьМассивНаименованийСвойств(Свойства); КонецЕсли; // Квадратные скобки обязательны. // Именно так платформа понимает что мы обращаемся к реквизиту ТЧ "ДополнительныеРеквизиты" ШаблонПутьКДанным = "Список.Ссылка.[%1 (%2)]"; // Обход циклом свойств для вывода в список. Для каждого ТекущееСвойство Из Свойства Цикл НаименованиеСвойства = ТекущееСвойство.Наименование; ИмяЭлемента = ТекущееСвойство.ИдентификаторДляФормул; Если МассивОтображаемыхСвойств.Найти(НаименованиеСвойства) <> Неопределено Тогда СтрокаДанные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПутьКДанным, НаименованиеСвойства, ИмяНабора); НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = СтрокаДанные; НовыйЭлемент.Заголовок = НаименованиеСвойства; КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьМассивНаименованийСвойств(МассивСвойств) МассивНаименований = Новый Массив; Для каждого Свойство Из МассивСвойств Цикл МассивНаименований.Добавить(Свойство.Наименование); КонецЦикла; Возврат МассивНаименований; КонецФункции;
Данный код проверялся на конфигурации «Бухгалтерия предприятия 3.0», но он подойдет для любой конфигурации.
Как результат работы нашего кода прикладываем скриншот и тестовое расширение конфигурации:
Как видим все доп. реквизиты появились в нашем списке.
Для подключения расширения использовались такие надстройки:
Скачать расширение
Оставить заявку на бесплатную консультацию прямо сейчас!
Для того, чтобы добавить новые реквизиты в динамический список на управляемой форме можно восльзоваться следующим программным кодом:
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ДинамическийСписок.ТекстЗапроса);ЗапросВыбора = СхемаЗапроса.ПакетЗапросов[0];ОператорВыбора = ЗапросВыбора.Операторы[0];
ОператорВыбора.ВыбираемыеПоля.Добавить(«ИмяСправочника.ИмяРеквизита1»);
ОператорВыбора.ВыбираемыеПоля.Добавить(«ИмяСправочника.ИмяРеквизита2»);ДинамическийСписок.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
[Практика программирования] Управляемые формы 1С 8: как программно изменить запрос динамического списка и программно вывести колонку добавленного реквизита списка
Ранее уже описывалось в соответствующей статье то, как разместить программно в форме колонку реквизита объекта базы (например, документа или справочника). В этой статье будет рассмотрено как программно добавить колонку с флажком в список управляемой формы с динамическим списком, данные для которого выбираются произвольным запросом.
Для программного добавления элементов управляемой формы должно быть учтено условие о том, что добавление происходит на стороне сервера, а не на клиенте (не в процедуре «ПриОткрытии», как это было в обычном приложении). И так можно ошибочно подумать по старой привычке (если есть опыт программирования в обычном интерфейсе), учитывая архитектуру платформы 1С: Предприятие 8.2 и 8.3. Ведь процедура «ПриОткрытии» формы есть и в управляемом приложении, но через не создать программно и не разместить элементы для прикладной задачи. Поэтому «&НаСервере» и преимущественно в процедуре «ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)» формы документа или элемента справочника или формы списка теперь происходит программное добавление каких-либо элементов формы.
В общем информация о том, как программно изменить текст запроса динамического списка, использующего произвольный запрос можно найти на странице сайта ИТС 1С, если у Вас есть доступ. Но если доступа нет, то можете сильно не расстраиваться — информация на странице как и во многих случаях методологической информации от 1С носит условно практический характер. А это означает, что мелочи и нюансы, о которых бы было неплохо упомянуть на указанной странице ИТС, не упомянуты никак. И их понимание будет происходить на практике. Вот часть такой практики изложена ниже на прикладной задаче.
Нажатие на изображении увеличит его
Рис. 1. Пример теоретического кода для программного изменения текста произвольного динамического списка для управляемой формы в 1С 8.
Прикладная задача заключалась в том, чтобы выводить программно в управляемую форму списка документов «Реализация товаров и услуг» колонку добавленного реквизита документа. Реквизит с именем «ДопМФ_Отгружено» тип «Булево», в данном примере добавлен в расширении, но может быть и добавлен в основной конфигурации, если она на частичной поддержке. Как вывести программно элемент формы, содержащей флажок, добавленного реквизита, повторимся, можно изучить в соответствующей статье, о которой уже упоминалось в начале страницы.
Рис. 2. Пример добавленного реквизита объекта конфигурации (документа) в 1С 8 для дальнейшего программного вывода колонки в управляемую форму списка объекта.
Прежде чем перейти непосредственно к программному добавлению колонки элемента таблицы формы нужно добавить его выбор в текст запроса динамического списка. Таким образом подготовительный рабочий исполняемый код получается примерно следующим:
1 | | | СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); |
2 | | | СвойстваСписка.ОсновнаяТаблица = «Документ.РеализацияТоваровУслуг»; |
3 | | | СвойстваСписка.ДинамическоеСчитываниеДанных = Истина; |
4 | | | ИсхТекстаЗапроса = СписокРеализацииТоваровУслуг.ТекстЗапроса; |
5 | | | |
СвойстваСписка.ТекстЗапроса = СтрЗаменить(ИсхТекстаЗапроса, «ВЫБРАТЬ», «ВЫБРАТЬ»+Символы.ПС+«РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,»); |
6 | | | |
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокРеализацииТоваровУслуг, СвойстваСписка); |
7 | | | //СписокРеализацииТоваровУслуг.Параметры.УстановитьЗначениеПараметра(«Параметр1», 42); |
Прокомментируем его основные моменты. В строке 1 происходит получение структуры через функцию «СтруктураСвойствДинамическогоСписка()» общего модуля «ОбщегоНазначения» для заполнения ее значений и передачи для заполнения свойств динамического списка. Для ключа «ОсновнаяТаблица» структуры в строке 2 указывается название основной таблицы, которая используюется для динамического списка, в примере это «Документ.РеализацияТоваровУслуг». Значение ключа структуры в строке 3 «ДинамическоеСчитываниеДанных» в значении «Истина». В строках 4 и 5 ведется произвольная модификация запроса.
Нажатие на изображении увеличит его
Рис. 3. Пример исходного текста произвольного запроса динамического списка реквизита управляемой формы списка документов.
Можно просто подготовить новый или измененный исходный текст запроса для указания его в ключе «ТекстЗапроса» структуры. В данном же случае была использована хитрость, чтобы минимизировать зависимость от изменений разработчиков. Происходит модификация исходного текста запроса, который определили разработчики, за счет замены подстроки «ВЫБРАТЬ», которая есть в любом запросе, на подстроку так же содержащее это обязательное слово текста запроса и текст для выборки значения добавленного реквизита документа «ДопМФ_Отгружено». Таким образом, доработка в расширении может сломаться тогда, когда разработчики существенным образом изменять исходный текст запроса. И на примере строки 5 помещаем новый вариант текста запроса в структуру. В данном примере получилось, что запрос содержит одну дополнительную строчку, чтобы выбирать значения добавленного реквизита. Порядок следования полей выборки в запросе для динамического списка не имеет значения.
Т.е. в практической задаче начало запроса программно изменялось:
С: |
ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, |
На: |
ВЫБРАТЬ РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено, РеализацияТоваровУслуг.Ссылка, |
Особенно обратим внимание на то, к каким объектам ведется обращение в строке 7, когда выполняется установка новой настройки для динамического списка с помощью процедуры «УстановитьСвойстваДинамическогоСписка» общего модуля «ОбщегоНазначения». В этом месте важно не перепутать, т.к. в типовой конфигурации названия элемента формы таблицы-списка и реквизита формы одинаковые. А важно, что первым параметром передается элемент управляемой формы — Таблица реквизита формы. Не перепутать его с названием реквизита формы, к которому ранее обращались для получения текста исходного запроса. Вторым параметром передается заполненная структура. Строка 7 в данном примере закомментирована, т.к. в данной прикладной задаче в тексте запроса не содержится параметров. Но, если параметр есть, то устанавливается через свойство «Параметры» и метод «УстановитьЗначениеПараметра» реквизита управляемой формы, а не элемента формы. Установка значения по имени параметра по коду как для классического запроса в 1С: первое значение — текстовое имя параметра, второе значение — собственно значение для параметра.
Нажатие на изображении увеличит его
Рис. 4. Сравнение одноименных реквизита и элемента управляемой формы 1С 8 для программного изменения текста произвольного запроса динамического списка этого реквизита формы.
После модификации текста произвольного динамического запроса реквизита управляемой формы 1С 8, становится возможным размещение колонки нового реквизита. И теперь рассмотрим код для программного вывода, размещения, добавления (как будет угодно) колонки в элемент-таблицу формы.
Нажатие на изображении увеличит его
Рис. 5. Пример кода в 1С 8 для программного вывода колонки нового реквизита объекта конфигурации, в частности документа, в элемент «Таблица» управляемой формы
По логике программного вывода в прикладной задачи новая колонка, напомним с флажком, должна выводиться сразу после колонки «Номер», содержащей данные номеров документов списка. Код на скриншоте содержит условие на то, что если колонка «Номер» по каким то причинам, например скрыта пользователем в управляемой форме, что вполне может быть (странно но может быть, ведь номер для документа является ключевым реквизитом для работы пользователей), то тогда новая колонка будет выведена самой первой в списке.
1 | | | ТаблицаФормы = Элементы.СписокРеализацииТоваровУслуг; |
2 | | | КолонкаВставки = ТаблицаФормы.ПодчиненныеЭлементы.Найти(«Номер»); |
3 | | | |
4 | | | КолонкаОтгружено = Элементы.Вставить(«_Отгружено», Тип(«ПолеФормы»), ТаблицаФормы, КолонкаВставки); |
5 | | | КолонкаОтгружено.Вид = ВидПоляФормы.ПолеФлажка; |
6 | | | КолонкаОтгружено.Заголовок = «О.»; |
7 | | | КолонкаОтгружено.Подсказка = «Отгружено»; |
8 | | | КолонкаОтгружено.ТолькоПросмотр = Истина; |
9 | | | КолонкаОтгружено.ШиринаЭлемента = 5; |
10 | | | КолонкаОтгружено.ПутьКДанным = «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»; |
Есть небольшие отличия от случая, который уже упоминался выше, добавления колонки для элемента формы Таблица динамического списка, как было описано смежной статье. В смежном случае был пример для таблицы, данными (ПутьКДанным) которой выступал «динамический список», но у которого основанием выступала таблица, а не произвольный запрос. Если отличия не учесть, то будут просто возникать ошибки. В данном же примере
Отличия заключаются в двух местах кода. Во-первых, это обращение к свойству «ШиринаЭлемента, а не просто «Ширина» как в случае, если колонка — это программно выводимая колонка динамического списка, но у которого указана «Основная таблица» и не используется произвольный запрос. Т.е. для программно добавляемой колонки динамического списка с произвольным запросом указывается свойство «ШиринаЭлемента».
Во-вторых, очень важно правильно указать значение свойства «ПутьКДанным», иначе можно получить ошибку:
Нажатие на изображении увеличит его
Рис. 6. Пример ошибки «Недопустимое значение» при указании неверного значения для свойства «ПутьКДанным» элемента управляемой формы .
{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(26)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
КолонкаОтгружено.ПутьКДанным = «Объект.СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»;
по причине:
Недопустимое значение
Недопустимое значение
Конечно, подобную ошибку можно «поймать» и при других условиях. Но когда она касается свойства «ПутьКДанным», то это явно говорит о том, что указанное строковое значение попросту не верное. Следует тщательно проанализировать корректность ее составления, т.к. в реквизитах управляемых форм можно запутаться.
Нажатие на изображении увеличит его
Рис. 7. Демонстрация того, что данные элемента формы Таблица — это динамический произвольный запрос.
В текущей задаче реквизит формы (он не основной) носит имя «СписокРеализацийТоваровУслуг», а не так, как часто можно встретить в конфигурации, что основной реквизит формы носит имя «Объект». И значения для добавленной колонки берется из реквизита типа «ДинамическийСписок» и для элемента формы. Поэтому строка для «ПутьКДанным» — «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено» с указанием через «.» имени нового реквизита.
Это все условия и нюансы, с которыми пришлось столкнуться на практике для программной модификации произвольного запроса динамического списка реквизита управляемой формы в 1С 8, чтобы потом программно вывести колонку нового реквизита объекта конфигурации базы в элемент «Таблица» формы .
Оцените, оказалась ли эта публикация полезна для Вас?
© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
25-11-2021
Журавлев А.С.
(Сайт azhur-c.ru)
Назад
При доработке типовых решений для упрощения дальнейшей поддержки и обновления использую программное создание динамического списка и вывод его на форму.
Содержание
- Задача
- Решение
- Создание страниц
- Перемещение элементов формы
- Программное создание динамического списка
- Небольшая хитрость
- Результат
Задача
Считаем, что есть типовая форма списка номенклатуры с динамическим списком. На форму необходимо добавить страницы: на первой выводить типовой список, а на второй список номенклатуры и данные РС «Данные для обработки». На текущий момент форма выглядит так:
Решение
План работ следующий:
- Создать страницы на форме;
- Переместить типовой динамический список на нужную страницу;
- Создать динамический список и вывести его на нужную страницу.
Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код
Создание страниц
Собственно создадим группу с видом «Страницы», и в нее добавим две группы с видом «Страница»
Страницы = Элементы.Добавить("Страницы", Тип("ГруппаФормы"), ЭтаФорма); Страницы.Вид = ВидГруппыФормы.Страницы; Страницы.Заголовок = "Страницы"; Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы); Страница_1.Вид = ВидГруппыФормы.Страница; Страница_1.Заголовок = "Страница 1"; Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы); Страница_2.Вид = ВидГруппыФормы.Страница; Страница_2.Заголовок = "Страница 2";
Программное формирование реквизитов и элементов формы можно в статье 1С. Программное добавление и удаление реквизитов формы
Перемещение элементов формы
Для перемещения типового динамического списка воспользуемся методом коллекции элементов формы Переместить()
Элементы.Переместить(Элементы.Список, Страница_1);
Программное создание динамического списка
Добавляем реквизит формы с типом Динамический список и определяем основные свойства.
// Создадим реквизит формы динамическог списка ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок"))); ИзменитьРеквизиты(ДобавляемыеРеквизиты); // Опишем параметры динамического списка ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос = Истина; ЭтаФорма.Список_Альтернативный.ТекстЗапроса = "ВЫБРАТЬ | Спр_Номенклатура.Ссылка КАК Ссылка, | Спр_Номенклатура.Код КАК Код, | Спр_Номенклатура.Наименование КАК Наименование, | Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления, | Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа, | ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан, | ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке |ИЗ | Справочник.Номенклатура КАК Спр_Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки | ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)"; ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура";
Теперь создадим элементы формы относящиеся к динамическому списку
//Создание элементов формы эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2); эл_Список.ПутьКДанным = "Список_Альтернативный"; эл_Список.Отображение = ОтображениеТаблицы.Список; эл_Список.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.Нет; эл_Список.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.Нет; эл_Список.ПоложениеСостоянияПросмотра = ПоложениеСостоянияПросмотра.Нет; эл_Список.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Нет; эл_Список.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Ссылка"; НоваяКолонка.Видимость = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.ПометкаУдаления"; НоваяКолонка.Видимость = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Код"; НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Наименование"; НоваяКолонка.Ширина = 20; НоваяКолонка.РастягиватьПоГоризонтали = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Обработан"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.ОшибкаПриОбработке"; НоваяКолонка.Заголовок = "Ошибка"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.НоменклатурнаяГруппа";
Небольшая хитрость
Как видно из кода, на форме не отображается поле «Ссылка», если на клиенте программно обратиться к текущим данным нашего списка, то свойства ссылка в полученной коллекции не будет. Для предотвращения такой ситуации необходимо указать обязательность использования поля, тогда свойство будет передаваться на клиент всегда
ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина);
Результат
Теперь проверяем, что у нас получилось. Первая страница, на которую мы перенесли типовой список
Вторая страница с нашим сформированным списком
И результирующий код:
#Область ОбработчикиСобытийформы &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) #Область СозданиеСтраниц Страницы = Элементы.Добавить("Страницы", Тип("ГруппаФормы"), ЭтаФорма); Страницы.Вид = ВидГруппыФормы.Страницы; Страницы.Заголовок = "Страницы"; Страница_1 = Элементы.Добавить("Страница_1", Тип("ГруппаФормы"), Страницы); Страница_1.Вид = ВидГруппыФормы.Страница; Страница_1.Заголовок = "Страница 1"; Страница_2 = Элементы.Добавить("Страница_2", Тип("ГруппаФормы"), Страницы); Страница_2.Вид = ВидГруппыФормы.Страница; Страница_2.Заголовок = "Страница 2"; #КонецОбласти #Область ПеремещениеТиповогоДинамическогоСписка Элементы.Переместить(Элементы.Список, Страница_1); #КонецОбласти #Область СозданиеДинамическогоСписка // Создадим реквизит формы динамическог списка ДобавляемыеРеквизиты = Новый Массив; ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Список_Альтернативный", Новый ОписаниеТипов("ДинамическийСписок"))); ИзменитьРеквизиты(ДобавляемыеРеквизиты); // Опишем параметры динамического списка ЭтаФорма.Список_Альтернативный.ПроизвольныйЗапрос = Истина; ЭтаФорма.Список_Альтернативный.ТекстЗапроса = "ВЫБРАТЬ | Спр_Номенклатура.Ссылка КАК Ссылка, | Спр_Номенклатура.Код КАК Код, | Спр_Номенклатура.Наименование КАК Наименование, | Спр_Номенклатура.ПометкаУдаления КАК ПометкаУдаления, | Спр_Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа, | ЕСТЬNULL(ДанныеДляОбработки.Обработан, ЛОЖЬ) КАК Обработан, | ЕСТЬNULL(ДанныеДляОбработки.ОшибкаПриОбработке, ЛОЖЬ) КАК ОшибкаПриОбработке |ИЗ | Справочник.Номенклатура КАК Спр_Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки | ПО (ДанныеДляОбработки.Номенклатура = Спр_Номенклатура.Ссылка)"; ЭтаФорма.Список_Альтернативный.ОсновнаяТаблица = "Справочник.Номенклатура"; // Установка обязательного использования ЭтаФорма.Список_Альтернативный.УстановитьОбязательноеИспользование("Ссылка", Истина); //Создание элементов формы эл_Список = Элементы.Добавить("Список_Альтернативный", Тип("ТаблицаФормы"), Страница_2); эл_Список.ПутьКДанным = "Список_Альтернативный"; эл_Список.Отображение = ОтображениеТаблицы.Список; эл_Список.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.Нет; эл_Список.ПоложениеУправленияПоиском = ПоложениеУправленияПоиском.Нет; эл_Список.ПоложениеСостоянияПросмотра = ПоложениеСостоянияПросмотра.Нет; эл_Список.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоиска.Нет; эл_Список.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; НоваяКолонка = Элементы.Добавить("Список_Альт_Ссылка", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Ссылка"; НоваяКолонка.Видимость = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_ПометкаУдаления", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.ПометкаУдаления"; НоваяКолонка.Видимость = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_Код", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Код"; НоваяКолонка = Элементы.Добавить("Список_Альт_Наименование", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Наименование"; НоваяКолонка.Ширина = 20; НоваяКолонка.РастягиватьПоГоризонтали = Ложь; НоваяКолонка = Элементы.Добавить("Список_Альт_Обработан", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.Обработан"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_ОшибкаПриОбработке", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.ОшибкаПриОбработке"; НоваяКолонка.Заголовок = "Ошибка"; НоваяКолонка.Вид = ВидПоляФормы.ПолеФлажка; НоваяКолонка = Элементы.Добавить("Список_Альт_НоменклатурнаяГруппа", Тип("ПолеФормы"), эл_Список); НоваяКолонка.ПутьКДанным = "Список_Альтернативный.НоменклатурнаяГруппа"; #КонецОбласти КонецПроцедуры #КонецОбласти
Статья писалась по итогу выполнения работы, в рамках которой требовалось выводить на форму содержимое различных регистров сведений. Вывод содержимого осуществляется через динамический список.
В статье рассмотрены следующие вопросы:
- Как программно создать реквизит формы с типом динамический список и установить для него произвольный запрос.
- Как программно добавить на форму элемент управления табличное поле, связать его с реквизитом формы и создать необходимые колонки.
- Как программно удалить созданные реквизиты и элементы формы.
Итак, в начале у нас не должно быть реквизитов и элементов формы с тем динамическим списком, который мы планируем создавать.
Сначала, нужно определить событие/команду и процедуру, при выполнении которой будет создаваться динамический список. В нашем случае это будет изменение элемента формы РегистрСведений. В этом элементе пользователь будет выбирать имя регистра сведений, который должен быть отображен в динамическом списке. Создаем процедуру для события ПриИзменении этого элемента:
Процедура РегистрСведенийПриИзменении(Элемент)
//Проверяем, заполнил ли пользователь имя регистра сведений. Если нет, то прерываем процедуру
Если НЕ ЗначениеЗаполнено(Объект.РегистрСведений) Тогда
Возврат;
КонецЕсли;
//Перед созданием нового динамического списка нужно удалить ранее созданный.
//Процедура удаления будет рассмотрена далее
УдалитьЭлементыСписка();
//Создаем новый динамический список.
//Назначение параметров будет описано далее в процедуре СозданиеДинамическогоСписка
СозданиеДинамическогоСписка(«Список», ТекстЗапроса(Объект.РегистрСведений), ПолучитьМассивКолонок(Объект.РегистрСведений), «РегистрСведений.»+Объект.РегистрСведений);
КонецПроцедуры
Для создания динамического списка нам потребуется передать в процедуру несколько параметров. Рассмотрим их.
Во-первых, нужно сформировать текст запроса для динамического списка. Для его формирования нам потребуется имя регистра сведений. В запросе будут выбираться все поля регистра.
Функция ТекстЗапроса (ИмяРС)
Возврат «ВЫБРАТЬ * ИЗ РегистрСведений.»+ИмяРС+» КАК РегистрСведений»;
КонецФункции
Во-вторых, потребуется массив колонок, которые мы хотим вывести на форму. Колонки возьмем из полей регистра сведений. А их в свою очередь получим из метаданных регистра.
&НаСервере
Функция ПолучитьМассивКолонок(ИмяРС)
МассивКолонок = новый массив;
Для каждого Измерение из Метаданные.РегистрыСведений[ИмяРС].Измерения Цикл
МассивКолонок.Добавить(Измерение.Имя);
КонецЦикла;
Для каждого Ресурс из Метаданные.РегистрыСведений[ИмяРС].Ресурсы Цикл
МассивКолонок.Добавить(Ресурс.Имя);
КонецЦикла;
Для каждого Реквизит из Метаданные.РегистрыСведений[ИмяРС].Реквизиты Цикл
МассивКолонок.Добавить(Реквизит.Имя);
КонецЦикла;
Возврат МассивКолонок;
КонецФункции
Теперь можно приступить к созданию динамического списка и выводу его на форму. Добавлять реквизиты и элементы формы можно только на сервере.
&НаСервере
Процедура СозданиеДинамическогоСписка(
ИмяСписка, //Имя элемента динамического списка на форме и реквизита
ТекстЗапроса, //Текст произвольного запроса для динамического списка
МассивКолонок, //Массив имен колонок табличного поля с динамическим списком
ТаблицаСписка, //Имя основной таблицы динамического списка
ПараметрыЗапроса = Неопределено)//тип структура — содержит перечень параметров, если они используются в запросе.
//Создаем реквизит формы с типом ДинамическийСписок и преданным в процедуру именем
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип(«ДинамическийСписок»));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,«»,ЛОЖЬ);
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//Задаем свойства реквизита
РеквизитДинамическийСписок = ЭтаФорма[ИмяСписка]; //Имя реквизита
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип(«ТаблицаФормы»));
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Создание колонок из переданного массива колонок
Для Каждого ИмяКолонки Из МассивКолонок Цикл
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип(«ПолеФормы»), ТаблицаФормы);
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + «.» + ИмяКолонки;
КонецЦикла;
КонецПроцедуры
Данная процедура использует произвольные запросы в динамическом списке. Если это не требуется, процедуру можно модифицировать.
Перед тем, как создавать новый динамический список нужно попытаться удалить уже существующий (если пользователь его ранее создал). Иначе возникнет ошибка при создании. Рассмотрим процедуру удаления. Она тоже должна выполняться на сервере. Удаление оборачиваем в оператор Попытка, т.к. удаляемого реквизита и элемента формы может не существовать.
При использовании процедуры удаления реквизитов и элементов формы нужно учитывать, что удалить можно только реквизиты и элементы, созданные программно.
&НаСервере
Процедура УдалитьЭлементыСписка()
Попытка
Элементы.Удалить(Элементы.Список);
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить(«Список»);
ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
Исключение
КонецПопытки;
КонецПроцедуры
В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы
Contents
- 1 Введение в управляемые формы 1С
- 2 Создание реквизита типа таблица значений и вывод на форму
- 3 Добавление условного оформления таблицы формы
- 4 Создание реквизита типа динамический список с заданными настройками и вывод на форму
- 5 Вывести динамический список в элементы управляемой формы 1С
- 6 Обновление параметров динамического списка программно
- 7 Полезные ссылки
Перед прочтением данной статьи рекомендуется ознакомиться с первой частью, в которой описаны примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними.
В данной же части будет рассмотрено программное создание динамических списков, таблиц значений на форме, их вывод в элементы формы и стандартные возможности для работы.
Модифицировать формы рекомендуется программно для удобного обновления конфигураций и исключения конфликтов, а также для удобной поддержки кода. Со статьями о механизмах модификации можно ознакомиться в разделе полезных ссылок.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними можно будет посмотреть в части 1.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Создание реквизита типа таблица значений и вывод на форму
&НаСервере Процедура пр_СоздатьТаблицуЗначений() МассивДобавляемыхРеквизитов = Новый Массив; //добавить реквизит ТЗ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ТаблицаЗначений", Новый ОписаниеТипов("ТаблицаЗначений"))); //добавить каждую колонку как отдельный реквизит МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Период", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),"пр_ТаблицаЗначений" ,"Период")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"пр_ТаблицаЗначений" ,"Номенклатура")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"пр_ТаблицаЗначений" ,"Характеристика")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"),"пр_ТаблицаЗначений" ,"Вид цены")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Цена", Новый ОписаниеТипов("Число", ,,Новый КвалификаторыЧисла(15,2)), "пр_ТаблицаЗначений" ,"Цена")); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуЗначений() пр_ВывестиТаблицуНаФорму(ЭтаФорма, "пр_ТаблицаЗначений", Элементы["пр_Страница2"], "Таблица цен"); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; ТаблицаФормы.ИзменятьСоставСтрок = Ложь; ТаблицаФормы.РазрешитьНачалоПеретаскивания = Ложь; СтруктураСвойств = Новый Структура(); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры &НаСервере Процедура пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, ИмяКолонки, СтруктураСвойств = Неопределено) НоваяКолонка = Форма.Элементы.Добавить(ИмяТаблицы+ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы); НоваяКолонка.Заголовок = ИмяКолонки; НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки; НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; Если НЕ СтруктураСвойств = Неопределено Тогда Для Каждого КлючЗначение Из СтруктураСвойств Цикл Попытка НоваяКолонка[КлючЗначение.Ключ] = СтруктураСвойств[КлючЗначение.Ключ]; Исключение КонецПопытки; КонецЦикла; КонецЕсли; КонецПроцедуры
Добавление условного оформления таблицы формы
Создаем условное оформление для таблицы:
- если реквизит формы Использование (тип булево) = Истина, тогда разрешаем изменять цену в строках таб. части;
- если в строке таб части цена не заполнена, то выделять фон ячейки «Цена» розовым.
&НаСервере Процедура пр_ДобавитьУОТаблицыФормы() //условное оформление формы //если реквизит Использование = Истина, то разрешать изменять цену ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_Использование"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); ЭлементОформления.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.КрасноФиолетовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нужно указать имя соответствующего элемента на форме ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; //условное оформление формы //если в строке цена = 0, тогда строку закрашиваем розовым ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначений.Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; // либо задаем свой ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Розовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления //чтобы выделить всю строку, нужно добавить все ячейки строки, пока же выделим одну ячейку "Цена" ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; КонецПроцедуры
В процедуру команды добавим вызов серверной процедуры для заполнения таблицы цен в зависимости от выбранной номенклатуры и характеристики:
&НаКлиенте Процедура пр_Команда1(Команда) пр_Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура пр_Команда1НаСервере() ЭтаФорма["пр_ТаблицаЗначений"].Очистить(); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Номенклатура", ЭтаФорма.пр_Номенклатура); Запрос.УстановитьПараметр("Характеристика", ЭтаФорма.пр_Характеристика); Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Период КАК Период, | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | , | Номенклатура = &Номенклатура | И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Стр = ЭтаФорма["пр_ТаблицаЗначений"].Добавить(); ЗаполнитьЗначенияСвойств(Стр, Выборка); КонецЦикла; КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьТаблицуЗначений(); пр_ВывестиТаблицуЗначений(); пр_ДобавитьУОТаблицыФормы(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Создание реквизита типа динамический список с заданными настройками и вывод на форму
На странице 3 создадим динамический список с выводом всех цен выбранной номенклатуры и характеристики.
Добавим Условное Оформление дин. списка, отбор и сортировку программно.
&НаСервере Процедура пр_СоздатьДинамическийСписок() //создать дин. список с произвольным запросом ТекстЗапроса = "ВЫБРАТЬ | ЦеныНоменклатуры.Период КАК Период, | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Характеристика КАК Характеристика, | ЦеныНоменклатуры.ВидЦены КАК ВидЦены, | ЦеныНоменклатуры.Цена КАК Цена, | ЦеныНоменклатуры.Регистратор КАК Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |ГДЕ | ЦеныНоменклатуры.Номенклатура = &Номенклатура | И ЦеныНоменклатуры.Характеристика = &Характеристика"; МассивДобавляемыхРеквизитов = Новый Массив; //создать реквизит дин. списка МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ДинамическийСписок", Новый ОписаниеТипов("ДинамическийСписок"),,,ЛОЖЬ)); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; //если запрос не произвольный, тогда используем следующий код: //РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь; //РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина; РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Номенклатура", ЭтаФорма["пр_Номенклатура"]); РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Характеристика", ЭтаФорма["пр_Характеристика"]); //не будем выводить эту колонку в списке, но нужен к ней доступ всегда РеквизитДинамическийСписок.УстановитьОбязательноеИспользование("Регистратор", Истина); КонецПроцедуры &НаСервере Процедура пр_ДобавитьОтборДинамическийСписок() ЭлементОтбора = ЭтаФорма["пр_ДинамическийСписок"].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // больше или меньше и т.п. ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = Дата('2015.01.01 00:00:00'); КонецПроцедуры &НаСервере Процедура пр_ДобавитьУОДинамическийСписок() //если цена от 4000 до 5000, то выделять зеленым ЭлементОформления = ЭтаФорма["пр_ДинамическийСписок"].УсловноеОформление.Элементы.Добавить(); //сначала добавим группу И ГруппаОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОформления.Использование = Истина; ГруппаОформления.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; // Создаем условие отбора в созданной группе: цена > 4000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 4000; //правым значением может выступать ПолеКомпоновкиДанных формы или списка //ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); ЭлементОтбора.Использование = Истина; //второй элемент отбора: цена < 5000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 5000; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленыйЛес); // Возможно обращение как по индексу так и установка через метод //Элемент = ЭлементОформления.Оформление.Элементы[0]; //Элемент.Значение = Цвет; ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нуджно указать ее имя поля ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Период"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Характеристика"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ВидЦены"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Цена"); ПолеОформления.Использование = Истина; КонецПроцедуры &НаСервере Процедура пр_ДобавитьСортировкуДинамическийСписок() ЭлементСортировки = ЭтаФорма["пр_ДинамическийСписок"].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период"); ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; ЭлементСортировки.Использование = Истина; КонецПроцедуры
Вывести динамический список в элементы управляемой формы 1С
Для вывода дин. списка воспользуемся процедурами, которые использовали при выводе таблицы значений, так как это один тип — ДанныеФормыКоллекция.
&НаСервере Процедура пр_ВывестиДинамическийСписок() пр_ВывестиДинамическийСписокНаФорму(ЭтаФорма, "пр_ДинамическийСписок", Элементы["пр_Страница3"], "Таблица цен"); КонецПроцедуры Процедура пр_ВывестиДинамическийСписокНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; СтруктураСвойств = Новый Структура("Вид", ВидПоляФормы.ПолеНадписи); //если нужны какие-то специфические свойства колонки, то нужно их добавить в структуру свойств пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры
Обновление параметров динамического списка программно
Если в запросе дин. списка используются параметры, то их необходимо обновлять при изменении соответствующих реквизитов.
&НаСервере Процедура пр_ОбновитьПараметрДинСписков(ИмяЭлемента, ТекСсылка) РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(ИмяЭлемента, ТекСсылка); КонецПроцедуры &НаКлиенте Процедура пр_НоменклатураПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Номенклатура", ЭтаФорма["пр_Номенклатура"]); КонецПроцедуры &НаКлиенте Процедура пр_ХарактеристикаПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Характеристика", ЭтаФорма["пр_Характеристика"]); КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьДинамическийСписок(); пр_ДобавитьОтборДинамическийСписок(); пр_ДобавитьСортировкуДинамическийСписок(); пр_ДобавитьУОДинамическийСписок(); пр_ВывестиДинамическийСписок(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Содержимое регистра сведений ЦеныНоменклатуры:
Динамический список на форме:
Полезные ссылки
1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание реквизитов , команд, элементов (Часть 1)