Динамический список
Динамический список — это интерфейсный объект встроенного языка, который используется для отображения различных списков объектов базы данных или необъектных данных — записей регистров.
Например, динамический список используется для отображения списка документов продажи товара.
Динамические списки в формах строятся на основе системы компоновки данных. Для динамического списка разработчик или указывает отображаемый объект конфигурации (фактически выбирает таблицу), или задает произвольный текст запроса, который будет использован для считывания данных.
Система автоматически выполняет считывание данных запроса порциями, по мере навигации пользователя по списку.
Для динамических списков с произвольными запросами существует возможность указать ключевые поля для запроса. Это позволяет спискам работать более эффективно и обеспечивать всю базовую функциональность, включая группировку записей.
Настройка списков
Система предоставляет пользователю широкие возможности по настройке внешнего вида списков. Можно менять их внешний вид (список, дерево), можно задавать различные группировки, отборы, а также можно устанавливать условное оформление списков в зависимости от тех данных, которые в нем отображаются. Подробнее…
Вывод списков
Для большинства списков система предоставляет возможность их вывода для печати или для сохранения их на диске в виде файла. Подробнее…
Работа с динамическим списком в 1С 8.3 (8.2)
В последних версиях 1С появилась отличная функция, можно наконец нормально работать с «номенклатурой», чего очень не хватало предыдущих версиях 1С. Динамический список позволяет и фильтровать информацию и во время сортировки видеть всю информацию по остаткам. Дальше мы рассмотрим, как помогают в работе динамические списки и какие новые функции они перед нами открывают.
Создание формы выбора в Динамических списках
Используем определенную начальную конфигурацию 1С. В ней уже создаем отдельную форму для выбора.
Когда добавляем эту форму, программа сама дает ей тип «Динамический список». Далее открываем ее свойства и вбираем поле произвольный запрос, в нем ставим галочку. Это дает нам полные возможности нашего списка. Мы сможем указать собственный запрос, которые обладает определенными характеристиками.
Теперь кликаем на гиперссылку открыть.
Появляется другая форма с уже созданным нами запросом. В это форме находятся все поля справочника «Номенклатура». С помощью
Используем нужный нам запрос для динамического списка
Начинаем писать нужный запрос, который охватывает остатки и цены.
Специалисты 1С ответят на любые вопросы
и помогут абсолютно бесплатно!
Вкладка «Настройки»
Далее нажимаем на кнопку настройки и перед нами появляется форма, в которой можно совершать любую сортировку по всем полям.
Указываем нужные нам параметры запроса используя динамический список
Надо помнить, что в команде обязательны 2 параметра. Это период и тип цены. Нужно указать их в команде, в противном случае произойдет сбой и наш запрос не будет выполнен. Укажем эти параметры в форме. Также нам нужно будет прописать определенные строки, которые указаны ниже в модуле формы.
После этих действий мы можем использовать таблицу значений. Она будет заполняться данными с определенным товаром и после все это переносить в документ.
Еще у нас есть возможность поставить галочку в пункте «Запрашивать количество». Это даст нам еще расширить возможности подбора по дополнительным параметрам.
Динамический список 1С
Динамический список 1С предназначен для вывода на форму любых данных в произвольном виде. Эти данные могут быть представлены в виде списка, таблицы или дерева. Динамический список позволяет делать сортировку выводимых данных, отбор, группировку, условное оформление и т.д. Причём, отбор, группировку и прочее может делать как разработчик, так и пользователь.
Динамический список 1С можно создать в качестве реквизита управляемой формы. Для этого достаточно, типу реквизита присвоить значение ДинамическийСписок.
В моем примере динамический список создан на основной форме обработки.
Для того, чтобы динамический список выводил какие-то данные, нам следует или указать основную таблицу в свойствах динамического списка, или написать произвольный запрос на языке запросов 1С.
Динамический список 1С — основная таблица
Динамическому списку можно назначить основную таблицу. Основная таблица – это произвольный объект метаданных (документ, справочник, регистр значения и т.д.), данные которого должны отобразиться в динамическом списке.
Например, в качестве основной таблицы выберем справочник Номенклатура.
И поместим динамический список на форму в виде таблицы, не забыв добавить колонки при размещении.
Если мы сейчас откроем обработку в пользовательском режиме 1С: Предприятия, то на основной форме обработки будет номенклатура в виде иерархического списка.
Можно сделать отображение списка в виде дерева. Для этого можно изменить режим просмотра таблицы на форме в пользовательском режиме.
Либо, поменять значение свойства Отображение таблицы формы, в которой был размещен динамический список.
После этого, динамический список на форме будет в виде дерева.
Произвольный запрос динамического списка 1С
Помимо использования основной таблицы, можно также динамический список сделать на основании запроса. Причем, можно взять за основу основную таблицу. Для примера, выведем вместе с номенклатурой цены, которые хранятся в периодическом регистре сведений Цены номенклатуры. Если мы в свойстве Произвольный запрос динамического списка установим флаг, при уже выбранной основной таблице, то у нас основная таблица будет взята за основу при формировании запроса.
Чтобы посмотреть на запрос, следует нажать на гиперссылку Открыть свойства НастройкаСписка.
В случае произвольного запроса мы можем изменить набор данных, который должен отображаться в динамическом списке. Но в этом случае все равно рекомендуется указывать основную таблицу, необходимо это делать для того, чтобы платформа могла определить, какая информация в этом динамическом списке главная, а какая второстепенная, и исходя из этого настроить стандартные команды. В том случае, если у Вас несколько таблиц и они связаны каким-то соединением, то все равно рекомендуется всегда указывать основную таблицу, потому что в противном случае производительность основного списка будет желать лучшего.
Свяжем справочник Номенклатура с виртуальной таблицей срез последних регистра сведений Цены номенклатуры.
Для этого, вызовем конструктор запроса из окна динамического списка, и добавим в список таблиц запроса виртуальную таблицу СрезПоследних. У виртуальной таблицы выберем ресурс Цена, который поместим в список полей, применив к этому полю функцию ЕстьNULL.
Свяжем левым соединением таблицу номенклатуры с виртуальной таблицей СрезПоследних регистра сведений.
И исправим имя поля Цена.
Наш запрос готов.
Обратите внимание на свойства «Динамическое считывание данных», которое есть и в свойствах динамического списка, когда указана основная таблица, и в том случае, когда указан произвольный запрос . Если это свойство установлено, то считывание данных происходит порциями, т.е. выбираются только те данные, которые необходимы для отображения на экране. В целях улучшения производительности, лучше всегда это свойство устанавливать.
Поскольку, мы переделывали существующий динамический список, то поле цена в таблице формы не отобразилось. Добавим это поле.
После такой доработки динамического списка, на в таблице на форме будут отображаться цены у номенклатуры.
Очень подробно работа с динамическими списками дается в моей книге «Основы разработки в 1С: Такси».
В этой книге вы научитесь:
- Настраивать динамические списки;
- Работать с поиском в динамическом списке;
- Программировать динамические списки (программная установка параметров, отборов, группировок, сортировок и условного оформления).
У вас, как у читателя блога, есть скидка 15 % по промо-коду: 48PVXHeYu
Более подробно о работе с другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.
В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком
Для моих читателей, купон на скидку 25%: hrW0rl9Nnx
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Вступайте в мои группы:
One Reply to “Динамический список 1С”
Если всё сделал по инструкции и при переключении в «Иерархический список» получаю ошибку «Обнаружено рассогласование при получении данных.» то как исправить?
1С 8.3 Динамический список — Программист 1С Минск. Автоматизация бизнеса.
✔ Чтение динамического списка
&НаКлиенте
Функция ЧтениеДинамическогоСписка ( СписокМ , Поле , Значение , ВидСравнения );
// Получаем СКД с текстом запроса
СКД_запрос = Элементы . Список . ПолучитьИсполняемуюСхемуКомпоновкиДанных ();
// Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Элементы . Список . ПолучитьИсполняемыеНастройкиКомпоновкиДанных ();
// Получаем макет с учетом настроек
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( СКД_запрос , Настройки . Тип ( «ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений» ));
// Выполняем инициализацию динамического списка
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки );
ПроцессорВыводаРезультата = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
// Выводим реультат
Результат = ПроцессорВыводаРезультата . Вывести ( ПроцессорКомпоновки );
&НаСервере
Процедура СозданиеДинамическогоСписка (
ИмяДинамичСписка = «Список» , // тип строка — имя будущего списка на форме и реквизита
ТекстЗапроса = «» , // тип строка — запрос, если он не указан, необходимо указать таблицу
МассивКолонокДС , // тип массив — массив создаваемых колонок, значения тип строка. Пример: «Д,ДоговораКонтрагента» значит будет создана колонка
// с заголовком «Д» и колонкой списка «ДоговораКонтрагента». Если указать просто «ДоговораКонтрагента»,
// заголовок будет идентичен заголовку по умолчанию типа «Договор контрагента».
СписокДействийДС = Неопределено, // типа структура — структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействийДС = Новый Структура(«Выбор,ПриАктивизацииСтроки»,»СписокВыбор»,»СписокПриАктивизацииСтроки»)
ТаблицаДинамичСписка = «» , // тип строка — содержит имя основной таблицы, пример: «Документ.РеализацияТоваров»
ДобавитьВ = «» , // тип строка — имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
ВставитьПеред = «» , // тип строка — имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
СвояКоманднаяПанель = Ложь, // тип булево — если ИСТИНА, скрывает стандартную панель и создает свою пустую для будушего наполнения ИмяДинамичСписка+»КоманднаяПанель2″
ПараметрыЗапроса = Неопределено) //тип структура — содержит перечень параметров, если они используются в запросе.
//Защита от дурака
Если ТекстЗапроса = «» И ТаблицаДинамичСписка = «» Тогда Сообщить ( «Ошибка формирования динамического списка, укажите запрос или таблицу» ); Возврат; КонецЕсли;
//Создаем свою командную панель, тот случай когда я не нашел способа снять галочку «Автозаполнение»
Если СвояКоманднаяПанель Тогда
Если ВставитьПеред = «» Тогда
ГруппаДинамическогоСписка = Элементы . Добавить ( «Группа» + ИмяДинамичСписка + «CоСвоейКоманднойПанелью» , Тип ( «ГруппаФормы» ),?( ДобавитьВ = «» , ЭтаФорма , ЭтаФорма . Элементы [ ДобавитьВ ]));
Иначе
ГруппаДинамическогоСписка = Элементы . Вставить ( «Группа» + ИмяДинамичСписка + «CоСвоейКоманднойПанелью» , Тип ( «ГруппаФормы» ),?( ДобавитьВ = «» , ЭтаФорма , ЭтаФорма . Элементы [ ДобавитьВ ]), ЭтаФорма . Элементы [ ВставитьПеред ]);
КонецЕсли;
ГруппаДинамическогоСписка . Вид = ВидГруппыФормы . ОбычнаяГруппа ;
ГруппаДинамическогоСписка . ОтображатьЗаголовок = Ложь;
ГруппаДинамическогоСписка . Отображение = ОтображениеОбычнойГруппы . Нет ;
ГруппаДинамическогоСписка . Группировка = ГруппировкаПодчиненныхЭлементовФормы . Вертикальная ;
КоманднаяПанельСписка = Элементы . Добавить ( ИмяДинамичСписка + «КоманднаяПанель2» , Тип ( «ГруппаФормы» ), ГруппаДинамическогоСписка );
КоманднаяПанельСписка . Вид = ВидГруппыФормы . КоманднаяПанель ;
КонецЕсли;
//Создаем реквизит формы
ТипыРеквизита = Новый Массив ;
ТипыРеквизита . Добавить ( Тип ( «ДинамическийСписок» ));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов ( ТипыРеквизита );
ДинамическийСписок = Новый РеквизитФормы ( ИмяДинамичСписка , ОписаниеТиповДляРеквизита ,, «» ,Ложь); //Имя реквизита
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить ( ДинамическийСписок );
//Задаем свойства реквизиту
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
РеквизитДинамическийСписок = ЭтаФорма [ ИмяДинамичСписка ]; //Имя реквизита
Если ТекстЗапроса = «» Тогда
РеквизитДинамическийСписок . ПроизвольныйЗапрос = Ложь;
РеквизитДинамическийСписок . ОсновнаяТаблица = ТаблицаДинамичСписка ;
Иначе
РеквизитДинамическийСписок . ПроизвольныйЗапрос = Истина;
РеквизитДинамическийСписок . ТекстЗапроса = ТекстЗапроса ;
Если ТаблицаДинамичСписка <> «» Тогда РеквизитДинамическийСписок . ОсновнаяТаблица = ТаблицаДинамичСписка ; КонецЕсли;
КонецЕсли;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра Из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок . Параметры . УстановитьЗначениеПараметра ( Параметра . Ключ , Параметра . Значение );
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
Если Ложь
Или ВставитьПеред = «»
Или СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
Тогда
ТаблицаФормы = Элементы . Добавить ( ИмяДинамичСписка , Тип ( «ТаблицаФормы» ),?( СвояКоманднаяПанель , ГруппаДинамическогоСписка ,?( ДобавитьВ = «» , ЭтаФорма , ЭтаФорма . Элементы [ ДобавитьВ ])));
Иначе
ТаблицаФормы = Элементы . Вставить ( ИмяДинамичСписка , Тип ( «ТаблицаФормы» ),?( ДобавитьВ = «» , ЭтаФорма , ЭтаФорма . Элементы [ ДобавитьВ ]), ЭтаФорма . Элементы [ ВставитьПеред ]);
КонецЕсли;
ТаблицаФормы . ПутьКДанным = ИмяДинамичСписка ; //Имя реквизита
//Если своя панель тогда скрываем стандартную
Если СвояКоманднаяПанель Тогда
Элементы [ ИмяДинамичСписка ]. ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы . Нет ;
КонецЕсли;
//Создание колонок на основание МассивКолонокДС
Для Каждого Элемента Из МассивКолонокДС Цикл
ПараметрыКолонки = СтрЗаменить ( Элемента , «,» , Символы . ПС );
Если СтрЧислоСтрок ( ПараметрыКолонки ) > 1 Тогда
Заголовок = СтрПолучитьСтроку ( ПараметрыКолонки , 1 );
ИмяКолонки = СтрПолучитьСтроку ( ПараметрыКолонки , 2 );
Иначе
Заголовок = «» ;
ИмяКолонки = ПараметрыКолонки ;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы . Добавить ( ИмяДинамичСписка + ИмяКолонки , Тип ( «ПолеФормы» ), ТаблицаФормы );
Если Заголовок <> «» Тогда НоваяКолонкаТаблицы . Заголовок = Заголовок ; КонецЕсли;
НоваяКолонкаТаблицы . ПутьКДанным = ИмяДинамичСписка + «.» + ИмяКолонки ;
КонецЦикла;
//Задаем действия (События) на основание СписокДействийДС, если он определен
Если СписокДействийДС <> Неопределено Тогда
ПереченьСвойств = «ПриИзменении
|Выбор
|ПриАктивизацииСтроки
|ВыборЗначения
|ПриАктивизацииПоля
|ПриАктивизацииЯчейки
|ПередНачаломДобавления
|ПередНачаломИзменения
|ПередУдалением
|ПриНачалеРедактирования
|ПередОкончаниемРедактирования
|ПриОкончанииРедактирования
|ОбработкаВыбора
|ПередРазворачиванием
|ПередСворачиванием
|ПослеУдаления
|ПриСменеТекущегоРодителя
|ОбработкаЗаписиНового
|ПриСохраненииПользовательскихНастроекНаСервере
|ПередЗагрузкойПользовательскихНастроекНаСервере
|ПриЗагрузкеПользовательскихНастроекНаСервере
|ПриОбновленииСоставаПользовательскихНастроекНаСервере
|ОбработкаЗапросаОбновления
|ПриПолученииДанныхНаСервере
|НачалоПеретаскивания
|ПроверкаПеретаскивания
|ОкончаниеПеретаскивания
|Перетаскивание» ;
Для Счетчик = 1 По 28 Цикл
ИмяСвойства = СтрПолучитьСтроку ( ПереченьСвойств , Счетчик );
Элементы [ ИмяДинамичСписка ]. УстановитьДействие ( ИмяСвойства ,?( СписокДействийДС . Свойство ( ИмяСвойства ), СписокДействийДС [ ИмяСвойства ], «» ));
КонецЦикла;
КонецЕсли;