1С 8.3 Динамический список - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Динамический список

Данные > Примеры кода 1С > 1С 8.3 Динамический список
Реклама:
Динамический список в 1С 8.3 -  это интерфейсный объект встроенного языка, который строится на формах на основе системы компоновки данных и используется для отображения различных списков объектов базы данных (независимо от типа) или необъектных данных. Предоставляет возможность задавать произвольный текст запроса (доступен конструктор запроса), который будет использован для считывания данных или указать объект конфигурации, который будет отображаться (по факту: выбрать таблицу). В запросе можно указывать различные отборы по разным полям. Параметры запроса можно устанавливать программно (удобно при создании подбора).

При работе с динамическим списком нужно знать некоторые принципы:
  • Если галочка "Произвольный запрос" (в свойствах) не установлена, то в параметре "Основная таблица" видна таблица из которой заполняются данные.
  • Меню "Настройка списка" (в свойствах). Можно указать параметры:
      • Отбор динамического списка;
      • Группировки;
      • Сортировку;
      • Оформление.
  • Рекомендуется индексировать поля (данные которых используются).
  • Свойство "Автозаполнение доступных полей" позволяет системе установить доступные поля для группировки, отбора, порядка, выбора.
  • Желательно не использовать сложные запросы (такие расчеты лучше проектировать на стадии формирования регистров), так как динамический список обновляется в режиме реального времени, что существенно влияет на производительность. Оптимально - это использование основной таблицы или простые запросы.
  • При наличии в конфигурации модуля БСП, рекомендуется использовать соответствующие общие процедуры.
Чтение динамического списка в 1С 8.3:
&НаКлиенте
Функция ЧтениеДинамическогоСписка(СписокМ, Поле, Значение, ВидСравнения);

   // Получаем СКД с текстом запроса
   СКД_запрос  = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();

   // Получаем настройки пользователя (отборы, сортировки и т.п.)
   Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

   // Получаем макет с учетом настроек
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД_запрос ,Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

   // Выполняем инициализацию динамического списка
   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
   ПроцессорВыводаРезультата  = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

   // Выводим реультат
   Результат = ПроцессорВыводаРезультата.Вывести(ПроцессорКомпоновки);

   Возврат Результат;

КонецФункции
Программное создание динамического списка в 1С 8.3 от rpgshnik:
&НаСервере
Процедура СозданиеДинамическогоСписка(
   ИмяДинамичСписка = "Список", // тип строка - имя будущего списка на форме и реквизита
   ТекстЗапроса = "",  // тип строка - запрос, если он не указан, необходимо указать таблицу
   МассивКолонокДС,  // тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
// с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента",
//  заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
   СписокДействийДС = Неопределено,  // типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействийДС = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
   ТаблицаДинамичСписка = "", // тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваров"
   ДобавитьВ = "", // тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
   ВставитьПеред = "", // тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
   СвояКоманднаяПанель = Ложь, // тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будушего наполнения ИмяДинамичСписка+"КоманднаяПанель2"
   ПараметрыЗапроса = Неопределено) //тип структура - содержит перечень параметров, если они используются в запросе.

   //Защита от дурака
   Если ТекстЗапроса = "" И ТаблицаДинамичСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;

   //Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
   Если СвояКоманднаяПанель Тогда
       Если ВставитьПеред = "" Тогда
           ГруппаДинамическогоСписка  = Элементы.Добавить("Группа" + ИмяДинамичСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]));
       Иначе
           ГруппаДинамическогоСписка  = Элементы.Вставить("Группа" + ИмяДинамичСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
       КонецЕсли;
       ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
       ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
       ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
       ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
       КоманднаяПанельСписка  = Элементы.Добавить(ИмяДинамичСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
       КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;
   КонецЕсли;

   //Создаем реквизит формы
   ТипыРеквизита = Новый Массив;
   ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
   ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
   ДинамическийСписок = Новый РеквизитФормы(ИмяДинамичСписка, ОписаниеТиповДляРеквизита,,"",Ложь); //Имя реквизита
   ДобавляемыеРеквизиты = Новый Массив;
   ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);

   //Задаем свойства реквизиту
   ИзменитьРеквизиты(ДобавляемыеРеквизиты);
   РеквизитДинамическийСписок = ЭтаФорма[ИмяДинамичСписка]; //Имя реквизита
   Если ТекстЗапроса = "" Тогда
       РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
       РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаДинамичСписка;
   Иначе
       РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
       РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
       Если ТаблицаДинамичСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаДинамичСписка; КонецЕсли;
   КонецЕсли;

   //Заполняем параметры если они были указаны
   Если ПараметрыЗапроса <> Неопределено Тогда
       Для Каждого Параметра Из ПараметрыЗапроса Цикл
           РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
       КонецЦикла;
   КонецЕсли;

   //Размещаем реквизит на форме
   Если Ложь
       Или ВставитьПеред = ""
       Или СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
       Тогда
       ТаблицаФормы = Элементы.Добавить(ИмяДинамичСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ])));
   Иначе
       ТаблицаФормы = Элементы.Вставить(ИмяДинамичСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);
   КонецЕсли;
   ТаблицаФормы.ПутьКДанным = ИмяДинамичСписка; //Имя реквизита

   //Если своя панель тогда скрываем стандартную
   Если СвояКоманднаяПанель Тогда
       Элементы[ИмяДинамичСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
   КонецЕсли;

   //Создание колонок на основание МассивКолонокДС
   Для Каждого Элемента Из МассивКолонокДС Цикл
       ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
       Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
           Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
           ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
       Иначе
           Заголовок = "";
           ИмяКолонки = ПараметрыКолонки;
       КонецЕсли;
       НоваяКолонкаТаблицы = Элементы.Добавить(ИмяДинамичСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
       Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
       НоваяКолонкаТаблицы.ПутьКДанным = ИмяДинамичСписка + "." + ИмяКолонки;
   КонецЦикла;

   //Задаем действия (События) на основание СписокДействийДС, если он определен
   Если СписокДействийДС <> Неопределено Тогда
       ПереченьСвойств = "ПриИзменении
       |Выбор
       |ПриАктивизацииСтроки
       |ВыборЗначения
       |ПриАктивизацииПоля
       |ПриАктивизацииЯчейки
       |ПередНачаломДобавления
       |ПередНачаломИзменения
       |ПередУдалением
       |ПриНачалеРедактирования
       |ПередОкончаниемРедактирования
       |ПриОкончанииРедактирования
       |ОбработкаВыбора
       |ПередРазворачиванием
       |ПередСворачиванием
       |ПослеУдаления
       |ПриСменеТекущегоРодителя
       |ОбработкаЗаписиНового
       |ПриСохраненииПользовательскихНастроекНаСервере
       |ПередЗагрузкойПользовательскихНастроекНаСервере
       |ПриЗагрузкеПользовательскихНастроекНаСервере
       |ПриОбновленииСоставаПользовательскихНастроекНаСервере
       |ОбработкаЗапросаОбновления
       |ПриПолученииДанныхНаСервере
       |НачалоПеретаскивания
       |ПроверкаПеретаскивания
       |ОкончаниеПеретаскивания
       |Перетаскивание";
       Для Счетчик = 1 По 28 Цикл
           ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
           Элементы[ИмяДинамичСписка].УстановитьДействие(ИмяСвойства,?(СписокДействийДС.Свойство(ИмяСвойства),СписокДействийДС[ИмяСвойства],""));
       КонецЦикла;
   КонецЕсли;

КонецПроцедуры

Программное удаление динамического списка в 1С 8.3 от rpgshnik:
&НаСервере
Процедура УдалениеДинамическогоСписка(ИмяДинамичСписка);

   Если ЭтаФорма.Элементы.Найти(ИмяДинамичСписка) <> Неопределено Тогда
       //Удаляем реквизиты формы
       МассивУдаляемыхРеквизитов = Новый Массив;
       МассивУдаляемыхРеквизитов.Добавить(ИмяДинамичСписка);
       ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);

       //Удаляем эелементы формы
       Элементы.Удалить(Элементы[ИмяДинамичСписка]);
   КонецЕсли;

   //Удаляем командную панель свою, если есть
   Если Элементы.Найти(ИмяДинамичСписка + "КоманднаяПанель2") <> Неопределено Тогда
       Элементы.Удалить(Элементы[ИмяДинамичСписка + "КоманднаяПанель2"]);
   КонецЕсли;

   //Удаляем группу созданую при условие если нужна своя командная панель
   Если Элементы.Найти("Группа" + ИмяДинамичСписка + "CоСвоейКоманднойПанелью") <> Неопределено Тогда
       Элементы.Удалить(Элементы["Группа" + ИмяДинамичСписка + "CоСвоейКоманднойПанелью"]);
   КонецЕсли;

КонецПроцедуры
Изменение запроса динамического списка в 1С 8.3:
&НаСервере
Процедура ИзменитьЗапросНаСервере()

   ТекстЗапроса = "ВЫБРАТЬ
    |    ЮрЛица.Наименование КАК Наименование,
    |    ЮрЛица.Заказчик КАК Заказчик,
    |    ЮрЛица.ОсновнойМенеджер КАК ОсновнойМенеджер,
    |    ЮрЛица.Комментарий КАК Комментарий,
    |    ЕСТЬNULL(ВложенныйЗапрос.Значение, """") КАК Перевозчик,
    |    ЮрЛица.Ссылка
    |ИЗ
    |    Справочник.ЮрЛица КАК ЮрЛица
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ЮрЛицаДополнительныеРеквизиты.Ссылка КАК Ссылка,
    |            ЮрЛицаДополнительныеРеквизиты.Свойство КАК Свойство,
    |            ЮрЛицаДополнительныеРеквизиты.Значение КАК Значение
    |        ИЗ
    |            Справочник.ЮрЛица.ДополнительныеРеквизиты КАК ЮрЛицаДополнительныеРеквизиты
    |        ГДЕ
    |            ЮрЛицаДополнительныеРеквизиты.Свойство.Наименование = ""Перевозчик"") КАК ВложенныйЗапрос
    |        ПО ЮрЛица.Ссылка = ВложенныйЗапрос.Ссылка";

   ДинамичСписок.ТекстЗапроса = ТекстЗапроса;

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗапрос(Команда)

   ИзменитьЗапросНаСервере();

КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонкиПослеИзмененияЗапросаНаСервере()

   НоваяКолонкаТаблицы = Элементы.Вставить("Перевозчик",Тип("ПолеФормы"),Элементы.ДинамичСписок,Элементы.ДинамичСписокКомментарий);
   НоваяКолонкаТаблицы.ПутьКДанным = "ДинамичСписок.Перевозчик";

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьКолонкиПослеИзмененияЗапроса(Команда)

   ДобавитьКолонкиПослеИзмененияЗапросаНаСервере();

КонецПроцедуры
Добавить колонки в динамическом списке в 1С 8.3:
&НаКлиенте
Процедура ДобавитьКолонку(Команда)

   ДобавитьКолонки();

КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонки()

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

КонецПроцедуры
Установка отбора пользовательских настроек в динамическом списке в 1С 8.3:
&НаКлиенте
Процедура ЗапускПользователем();

   ФормаСпискаМ = ОткрытьФорму("Справочник.Материалы.ФормаСписка");
   УстановитьОтборДинамическогоСписка(ФормаСпискаМ.Список, "ПометкаУдаления", Ложь, ВидСравненияКомпоновкиДанных.Равно);

КонецПроцедуры


&НаКлиенте
Процедура УстановитьОтборДинамическогоСписка(СписокМ, Поле, Значение, ВидСравнения);

   // Аналог процедуры в БСП:
   // https://1cnik.by/bsp_ustanovitjelementotboradinamicheskogospiska.php
   Для Каждого ЭлементМ Из СписокМ.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
       Если ТипЗнч(ЭлементМ) = Тип("ОтборКомпоновкиДанных") Тогда

           ПользовательскиеОтборы = ЭлементМ.Элементы;
           НовыйОтбор = Неопределено;

           Для Каждого ЭлементОтбора Из ПользовательскиеОтборы Цикл
               Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Поле) Тогда
                   НовыйОтбор = ЭлементОтбора;
                   Прервать;
               КонецЕсли;
           КонецЦикла;

           Если ЭлементОтбора = Неопределено Тогда
               НовыйОтбор = ПользовательскиеОтборы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
               НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Поле);
           КонецЕсли;

           НовыйОтбор.ВидСравнения = ВидСравнения;
           НовыйОтбор.Использование = Истина;
           НовыйОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
           НовыйОтбор.ПравоеЗначение = Значение;

       КонецЕсли;
   КонецЦикла;

КонецПроцедуры
📰 Актуальные новости с тегом #ДинамическийСписок:
  • В версии 8.3.21 реализована возможность получения навигационной ссылки на объект или запись текущей строки динамического списка без необходимости открывать форму объекта/записи.
    Реализовано свойство расширения таблицы формы для динамического списка РазрешитьПолучатьНавигационнуюСсылкуТекущейСтроки. Для расширения таблицы формы для динамического списка реализованы обработчики событий ОбработкаПолученияСпискаНавигационныхСсылок и ОбработкаПолученияНавигационнойСсылки.
    Диалог получения навигационной ссылки формы переработан с учетом данной возможности.
    В диалоге получения навигационной ссылки на начальной странице отображаются все варианты ссылок, полученные у всех форм на начальной странице.
  • В версии 8.3.21 при настройке характеристик объектов конфигурации реализована возможность указать, что характеристика может содержать более одного значения. Реализована поддержка этой возможности в системе компоновки данных и динамическом списке.
    Для объекта ОписаниеХарактеристик реализованы свойства ПолеИспользованияМножественныхЗначений, ПолеКлючаМножественныхЗначений, ПолеПорядкаМножественныхЗначений.
    Если в информационной базе указаны множественные характеристики, то при переходе на предыдущие версии платформы, данные в результате компоновки данных могут "задваиваться". В связи с этим не рекомендуется использовать предыдущие версии системы "1С:Предприятие" после указания множественных значений характеристик.
0
Комментарии
____________________
Copyright by 1Cnik.by©, «Программист 1С в г.Минске», 21.11.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому