Добавление доп. реквизита в динамический список программно
Добавление доп. реквизита в динамический список программно
Некоторые пользователи хотят видеть дополнительную аналитику по определенным объектам конфигурации 1С, для реализации этой потребности существует функционал дополнительных реквизитов и сведений, который зачастую выводится в группу «Дополнительно» или «Дополнительные реквизиты».
Мы же разберем как отобразить дополнительные реквизиты в форме списка элементов. Практически всегда в этой форме используется «Динамический список», но данный способ не позволяет использовать это на обычной «Таблице значений».
Как добавить дополнительный реквизит в динамический список:
Получившейся код модуля:
&НаКлиенте Процедура dev_ПриОткрытииПосле(Отказ) ОтображениеДополнительныхРеквизитов(); КонецПроцедуры &НаСервере Процедура ОтображениеДополнительныхРеквизитов() // Получаем набор свойств объекта по пустой ссылке объекта метаданных. НаборСвойств = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(Справочники.Номенклатура.ПустаяСсылка()); // Инициализируем имя набора свойств. ИмяНабора = НаборСвойств[0].Набор.Наименование; Свойства = НаборСвойств[0].Набор.ДополнительныеРеквизиты.Выгрузить().ВыгрузитьКолонку("Свойство"); // Наполняем массив именами доп.реквизитов, которые мы хотим отобразить в списке формы. // Можно создать отдельную настроку, например регистр где будем хранить выводимые поля, // для конкретных объектов метаданных или даже в зависимости от роли. МассивОтображаемыхСвойств = Новый Массив; МассивОтображаемыхСвойств.Добавить("Краткое описание"); // и т.д. // Если например у нас полные права то выведем все доп.реквизиты. Если РольДоступна("ПолныеПрава") Тогда МассивОтображаемыхСвойств = ПолучитьМассивНаименованийСвойств(Свойства); КонецЕсли; // Квадратные скобки обязательны. // Именно так платформа понимает что мы обращаемся к реквизиту ТЧ "ДополнительныеРеквизиты" ШаблонПутьКДанным = "Список.Ссылка.[%1 (%2)]"; // Обход циклом свойств для вывода в список. Для каждого ТекущееСвойство Из Свойства Цикл НаименованиеСвойства = ТекущееСвойство.Наименование; ИмяЭлемента = ТекущееСвойство.ИдентификаторДляФормул; Если МассивОтображаемыхСвойств.Найти(НаименованиеСвойства) <> Неопределено Тогда СтрокаДанные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПутьКДанным, НаименованиеСвойства, ИмяНабора); НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = СтрокаДанные; НовыйЭлемент.Заголовок = НаименованиеСвойства; КонецЕсли; КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьМассивНаименованийСвойств(МассивСвойств) МассивНаименований = Новый Массив; Для каждого Свойство Из МассивСвойств Цикл МассивНаименований.Добавить(Свойство.Наименование); КонецЦикла; Возврат МассивНаименований; КонецФункции;
Данный код проверялся на конфигурации «Бухгалтерия предприятия 3.0», но он подойдет для любой конфигурации.
Как результат работы нашего кода прикладываем скриншот и тестовое расширение конфигурации:
Как видим все доп. реквизиты появились в нашем списке.
Для подключения расширения использовались такие надстройки:
Скачать расширение
Оставить заявку на бесплатную консультацию прямо сейчас!
Добавление доп. реквизита в динамический список |
Я |
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 = Элементы.Добавить("Страница_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. Как программно добавить в динамический список данные?
2. Вариант решения для динамических списков в 1С 8.3
3. Использование Схемы запросов
1. Как программно добавить в динамический список данные?
Использование объекта СхемаЗапроса для универсальной модификации динамических списков.
Дано:
· динамические списки данных объектов конфигурации (списки элементов справочника, журналы документов);
· некоторые данные, которыми нужно программно добавить в динамические списки (каждый элемент списка), содержащиеся, например, в регистрах сведений.
Требуется предложить решение, которое:
· легко масштабируется на любые динамические списки данных в 1С (и может быть перенесено в другую конфигурацию);
· оставляет основную конфигурацию на полной поддержке.
2. Вариант решения для динамических списков в 1С 8.3
Допустим, с помощью расширения добавлен некий регистр сведений, в котором хранятся данные о ссылочных объектах БД (элементы справочника, документы). Необходимо в типовые формы динамических списков в 1С 8.3 и формы выбора добавить информацию из этого регистра, соединив левым соединением с типовым списком.
Можно решить эту задачу так: вынести в расширение формы списка и выбора и переписать произвольный запрос динамического списка. Недостатки этого метода заключаются в том, что при обновлении типовой конфигурации на более свежие релизы придется отслеживать изменения всех типовых произвольных запросов списков, чтобы внести эти изменения в расширение.
3. Использование Схемы запросов
Используем объект «Схема Запросов» в 1С.
В расширении в процедуре ПриСозданииНаСервере (с аннотацией &После) получим запрос динамического списка, передадим его в нашу процедуру, обработаем с помощью объекта СхемаЗапроса и обратно вернемся в текст, содержащий левое соединение с нужным нам регистром.
Ниже приводится примерный текст функции, решающий эту задачу. На большинстве динамических списков в 1С 8.3 он может быть использован без изменений. Вывод новой колонки в форму списка для показа пользователю здесь не рассматривается.
Рисунок 1 Запрос динамического списка
Функция ПолучитьРасширенныйТекстЗапроса(ТекстЗапроса) Экспорт
СхемаЗапроса = Новый СхемаЗапроса;
// передадим текст запроса в Схему запроса
СхемаЗапроса.УстановитьТекстЗапроса(Знач ТекстЗапроса);
//получим последний запрос пакета, к которому будем присоединять таблицу
ПоследнийЗапросПакета = СхемаЗапроса.ПакетЗапросов[СхемаЗапроса.ПакетЗапросов.Количество()-1]);
//Каждый оператор представляет собой запрос ВЫБРАТЬ.
Оператор = ПоследнийЗапросПакета.Операторы[0];
// получаем источники оператора ВЫБРАТЬ
Источники = Оператор.Источники;
ОсновнойИсточник = Источники[0];
//добавим к источникам наш регистр, укажем его псевдоним
НовыйИсточник = Источники.Добавить(«РегистрСведений.Расш_НашРегистр.СрезПоследних», «Расш_НашРегистр»);
// получим псевдоним основном таблицы для формирования условия соединения
ПсевдонимОсновнойТаблицы = ОсновнойИсточник.Псевдоним;
//Сформируем строку соединения
УсловиеСоединения = ПсевдонимОсновнойТаблицы + «.Ссылка = Расш_НашРегистр.Ссылка»;
// получим соединения основного источника и добавим к нему своё
Соединения = ОсновнойИсточник.Соединения;
Соединения.Добавить(НовыйИсточник, УсловиеСоединения);
// установим тип соединения
Соединения[Соединения.Количество()-1].ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
// чтобы в динамическом списке стало доступно для вывода поле из нашего регистра, добавим его в запрос
Оператор.ВыбираемыеПоля.Добавить(«Расш_НашРегистр.НекийРесурс»);
// вернем получившийся запрос
НовыйТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Возврат НовыйТекстЗапроса;
КонецФункции
Специалист компании «Кодерлайн»
Татьяна Федорова