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

1С:Предприятие 8.2 /
Разработчикам /
Разработка пользовательских интерфейсов

См. также

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

2. Команды, которые изменяют объекты и размещаются в форме списка, должны заботиться об обновлении списка объектов после своего выполнения. Например, после изменения одного объекта рекомендуется вызывать метод ОповеститьОбИзменении:

&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОбъектСсылка = ПараметрКоманды; // Меняем объект // … ОповеститьОбИзменении(ОбъектСсылка); КонецПроцедуры

При изменении нескольких объектов целесообразно обновлять список однократно, в конце операции:

&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Для Каждого ОбъектСсылка Из ПараметрКоманды Цикл // Меняем объект // … КонецЦикла; ОповеститьОбИзменении(ТипЗнч(ПараметрКоманды)); КонецПроцедуры

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

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

3.2 Если данные изменяются в какой-либо другой форме (например, в форме объекта), то необходимо организовать обновление списка через оповещение. Для этого в каждой форме объекта, данные которого выводятся в динамическом списке, следует реализовать обработчик события ПослеЗаписи с использованием метода Оповестить:

Оповестить («Запись_», ПараметрыОповещения, ОбъектСсылка);

где

  • Запись_<ИмяОбъекта> — имя события, в котором <ИмяОбъекта> — имя объекта, как оно задано в метаданных. Например, для документа «Расходная накладная» имя события будет «Запись_РасходнаяНакладная».
  • ПараметрыОповещения – как правило, это параметр события ПослеЗаписи формы объекта. Состав свойств структуры может быть расширен исходя из потребностей прикладной логики.
  • ОбъектСсылка – ссылка на записываемый объект.

Пример:

&НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Оповестить(«Запись_РасходнаяНакладная», ПараметрыЗаписи, Объект.Ссылка); КонецПроцедуры

Затем в обработчике событияОповещение в форме динамического списка разместить код по обновлению динамического списка вида:

&НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если Врег(ИмяСобытия) = Врег(«Запись_РасходнаяНакладная») Или Врег(ИмяСобытия) = Врег(«Запись_НакладнаяНаПеремещение») Тогда Элементы.СписокНакладных.Обновить(); КонецЕсли; КонецПроцедуры

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

См. также

  • Особенности реализации команд для форм списков

Другие материалы по теме:
конфигурирование

Как заполнить табличную часть формы программно?  6
  Нужно по кнопке Заполнить — сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П Cодержимое указанного ниже веб-сайта в этом приложении блокируется… Aboutsecurity_1cv8c.exe  1
  Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э rphost занимает память и грузит процессор  18
  У многих возникают проблемы с rphost.exe, разного вида: rphost занимает всю память rphost грузит процессор rphost жрет память причем 1С даже на запущена, а в диспетчере следующее: ежеминутно расчет на 2-3 мегабайта. Как быть и что делат Выгрузка картинок из базы 1С в XML  2
  В нынешнее время для электронного каталога или интернет-магазина необходимо выгружать не только информацию о цене и характеристиках товара, но и сопутствующие изображения. Хранящиеся в базе или связанные с номенклатурой изображения порой приходилось   2
  Думаю, уже многие слышали что KLADR заменен на ФИАС (Федеральная информационная адресная система) Единой информацией из ФИАС будут обязаны пользоваться все ведомства – ГИБДД, Росреестр, ЗАГС, ФМС России и др, в частности Почта России – которая ис Посмотреть все результаты поиска похожих

Пример отбора по организации
Код 1C v 8.2 УП

Полый пример для конфигурации УНФ
Код 1C v 8.2 УП

Еще в этой же категории

Как получить строки табличного поля, отобранные отбором? 3
ОтборСтрок = ТабличнаяЧастьИсточник.ОтборСтрок ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); // Добавляются необходимые отборы, такие же как в отбор Посмотреть все в категории Список Справочника, Документов, Регистров

Сегодня – интересный технический прием для тех, кто занимается разработкой / доработкой конфигураций.

Начиная с версии платформы 8.3.10 работает новое событие динамического списка ПриПолученииДанныхНаСервере.

Что это Вам даст:

  • Возможность вывода любой информации в список
  • Дополнительная оптимизация – данные извлекаются только для видимых строк

Разве этого не было раньше?

На первый взгляд это не отличается принципиально от того, что делали уже несколько лет – всегда можно добавить колонку и заполнить её запросом!

Да, можно было добавить колонку : ))

Разница в том, что в запросе нельзя вывести разнородную информацию в одно поле.

Плюс усложнение запроса приводит к тормозам при отображении списков документов.

В общем, посмотрите 10 минут видео, всё станет понятно 🙂

Видео – событие «ПриПолученииДанныхНаСервере” динамического списка

В видео рассмотрим вывод складских остатков по товарам с разбивкой по складам.

Эту задачу нельзя было решить через корректировку запроса динамического списка (в 8.3.9 и ранее).

Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3

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

Поддержка тренера – 3 месяца. Объем курса – 49 учебных часов.

Не откладывайте свое обучение!

Комментарии / обсуждение (64):

Жалко, что узнал об этом только сейчас. Спасибо!

А не подскажите как вызвать событие ПриПолученииДанныхНаСервере без Элементы.ДинамическийСписок.Обновить()?
Дело в том что на мобильном устройстве, это событие отрабатывает достаточно долго, и обновляет весь список, а мне нужно обновить только одну строку (ну или хотя бы видимую область). Вот и получается что бы обновить 40 строк, я заново инициирую построение запроса

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

Форма подбора. Слева располагается ДеревоИерархии, справа от него ДинамическийСписок в который выводится номенклатура которая в Иерархии конкретно указанной ветки Дерева. В строка ДС (динамического списка) есть количество Номенклатуры выбранного в Корзину. Корзина – РегистрСведений. Когда пользователь нажимает в строке ДС в область колонки Выбранно в обработке Выбора идет внеконтекстная запись в РС Корзина, а потом Элементы.ДС.Обновить();
Проблема в том, что Чем больше содержание ветки дерева, тем дольше идет обновление. При этом, если бы эту же информацию получить в событии ПриПолученииДанныхНаСервере, то там всегда 42 строки, оходятся циклом. Но это событие вызвать просто можно только скролированием, которое к сожалению, не совсем адекватно в данном контексте. Метод УстановитьДействие(), работает только на сервере, но форма для контекстного вызова тяжеловата

Это было очень интересно! Спасибо

Пожалуйста!
Интересного обучения!

Огромное спасибо за эту статью и за курс «Профессиональная разработка интерфейсов и форм 1с 8.3”.
В ERP 2.4 выполнила задачу, которая казалась нерешаемой или затратной.
Познакомившись с данным способом ПриПолученииДанныхНаСервере, применила его для произвольной формы интерфейса и все получилось.

Добрый день, а поиск по этой колонке получается не будет работать?

Добрый день!
Да, все верно.

Отличный мастер-класс от команды профессионалов!
А что если в запросе дин.списка не формировать пустое поле остаток? А вместо этого добавить новое поле в таблицу формы (не связанное с данными), и заполнять его через оформление ячейки… подобно тому как в ОФ методом УстановитьТекст().

Добрый день, Роман! К сожалению, в УФ в таблицу формы динамического списка нельзя добавить поле не связанное с данными.

Здравствуйте Сергей! Да, такой финт и вправду не получится. А точнее поле можно добавить, но оно не отобразится без указания связи с данными. Тогда получается продемонстрированный Вами способ является единственным аналогом события «ПриВыводеСтроки()” обычного приложения.
А возможно ли как то передать в эту процедуру инициализированное значение внешней обработки или СОМ-объекта? чтобы каждый раз не инициализировать его при очередном вызове.

Добрый день, Роман! Корректного способа нет, но можно попробовать использовать временное хранилище.
Общий план такой:
1. При открытии формы инициализируем СОМ-объект, помещаем его в структуру(чтобы ошибок не возникало, так как в хранилище можно помещать только сериализуемые значения, а СОМ-объекты к ним не относятся). Далее структуру помещаем во временное хранилище и полученный адрес помещаем в дополнительные свойства списка.
2. В событии «ПриПолученииДанныхНаСервере” получаем данные из хранилища, проверяем «живой” ли СОМ-объект, если его нет (такое может случится, если хранилище сбрасывалось на диск), тогда придется создавать новый, ну а если есть, тогда пользуемся.

Это все в теории, можете самостоятельно попробовать на практике. Других вариантов я не вижу.

Здравствуйте. Столкнулся вот с какой проблемой: Динамический список, основная таблица Регистр сведений (независимый, непериодический с одним измерением и тремя ресурсами). Добавил два поля для расчета в обработчике «ПриПолученииДанныхНаСервере” (Неопределенно и Ложь). Для правильной работы мне нужно поле из списка. Но в структуре «Данные” доступны только неопределенные поля. Для упрощения приведу запрос:

Чтобы заполнить два последних поля, мне нужно поле «Файл”. Как до него добраться?
Ожидая Ваш вопрос почему мне напрямую не вытащить «ВладельцаФайла” отвечу: Пользователю с ограниченными правами доступны не все таблицы и возникает ошибка с полем «ВладлецФайла” в справочниках (присоединенные файлы). Конфигурация ERP, платформа 8.3.12.1412, режим совместимости не используется.
Нюанс: основная таблица не была указана, но после указания стало еще хуже, т.к. теперь ограниченному пользователю не доступно поле «Файл” (ОпределяемыйТип.ПрисоединенныйФайл) 🙁

Решил вопрос: Во-первых не была указана основная таблица (ну бывает), немного расширил права на регистр и на его поля (на всякий случай на все). И все поля стали доступны.
Всем спасибо.

Сергей, спасибо большое! Как всегда, материал на высоте. Вы наш проводник в мир управляемого интерфейса!:)

Всех с наступившим Новым годом!

А можно вывести цифры (строки) и картинку?

Картинку можно вывести, а вот нумерацию строк в динамическом списке (если я правильно понял вопрос) нет.

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

Переделайте эту часть.

В какой именно момент оптимизатор не будет угадывать, уточните.

Условие ИЛИ оптимизатор не знает как себя вести, для этого рекомендации использовать объединение запросов но использовать условие И – классика. Ну это же из курсов вашего коллеги Андрея Бурмистрова 🙂

Ну да конечно, что если взять к примеру порцию 70 записей это зависит от прокрутки и экрана допустим у меня очень большой экран. То скорее всего будет применятся не индекс сик, а сканирование индекса Будет сканироваться таблица регистра на вхождения склада, да конечно вы накроете по кластерному индексу товарами (хотя и тоже не факт)…

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

Я к чему веду, если вы уж так статью пишите о производительности то и код должен быть 100% максимально идиален.

А еще у Вас потери производительности на сортировке. Вы применили сортировку склада по имени обращаясь к складу через точку. Ну скорее всего потери получения наименования не должно быть поскольку склад должен быть покрыт кластерным индесом и данные должны лежать уже на уровне В-дерева (но это все надо перепроверить).

Рассмотрим работу с динамическими списками на примере конфигурации 1С.Управление торговлей. Для примера разберем динамический список для справочника «Контрагенты».

Запустим 1С в режиме «Конфигуратор».

В конфигурации найдем справочник «Контрагенты».

Откроем форму «Форма Списка».

Рассмотрим форму списка справочника. Реквизит «Список» имеет тип «ДинамическийСписок».

Двойным щелчком откроем свойства реквизита.

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

Нажмем теперь «Открыть» у свойства «Настройка списка».

Перед нами открывается окно настройки запроса динамического списка. Первая вкладка «Запрос».

Мы можем ка написать запрос вручную в поле «Запрос», так и воспользоваться кнопкой «Конструктор запросов».

На данной вкладке так же стоит обратить внимание на флаги «Динамическое считывание данных» и «Автозаполнение доступных полей».

Флаг «Динамическое считывание данных» определяет размер «части» возвращаемых запросом данных. Т.е. Если флаг установлен, то «части» имеют не большой размер, но при прокрутке динамического списка может происходить небольшое подвисания из-за до получения «частей». Если флаг не установлен, то возвращаемые данные мы получаем большими «частями». Это означает, что первоначально запрос может отрабатывать дольше, но подвисаний в процессе прокрутки не будет.

Флаг «Автозаполнение доступных полей» определяет поля доступные для отбора. Если флаг установлен, то поля верхней выборки становятся доступными для установки отбора.

Вторая вкладка «Настройки».

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

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

Так же на вкладке «Настройки» мы можем задавать «Порядок», «Группировки» и «Условное оформление.

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

Как оптимизировать работу с программой?

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

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

Вы еще не внедрили 1С или необходимо установить программу в новый филиал компании? Обратитесь за внедрением и настройкой к нам — вы сэкономите свое время и избежите возможных ошибок и проблем в дальнейшем.

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

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

В статье рассмотрены следующие вопросы:

  1. Как программно создать реквизит формы с типом динамический список и установить для него произвольный запрос.
  2. Как программно добавить на форму элемент управления табличное поле, связать его с реквизитом формы и создать необходимые колонки.
  3. Как программно удалить созданные реквизиты и элементы формы.

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

Сначала, нужно определить событие/команду и процедуру, при выполнении которой будет создаваться динамический список. В нашем случае это будет изменение элемента формы РегистрСведений. В этом элементе пользователь будет выбирать имя регистра сведений, который должен быть отображен в динамическом списке. Создаем процедуру для события ПриИзменении этого элемента:

Процедура РегистрСведенийПриИзменении(Элемент)
//Проверяем, заполнил ли пользователь имя регистра сведений. Если нет, то прерываем процедуру
Если НЕ ЗначениеЗаполнено(Объект.РегистрСведений) Тогда
Возврат;
КонецЕсли;
//Перед созданием нового динамического списка нужно удалить ранее созданный.
//Процедура удаления будет рассмотрена далее
УдалитьЭлементыСписка();
//Создаем новый динамический список.
//Назначение параметров будет описано далее в процедуре СозданиеДинамическогоСписка
СозданиеДинамическогоСписка(«Список», ТекстЗапроса(Объект.РегистрСведений), ПолучитьМассивКолонок(Объект.РегистрСведений), «РегистрСведений.»+Объект.РегистрСведений);
КонецПроцедуры

Для создания динамического списка нам потребуется передать в процедуру несколько параметров. Рассмотрим их.

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

Функция ТекстЗапроса (ИмяРС)
Возврат «ВЫБРАТЬ * ИЗ РегистрСведений.»+ИмяРС+» КАК РегистрСведений»;
КонецФункции

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

&НаСервере
Функция ПолучитьМассивКолонок(ИмяРС)
МассивКолонок = новый массив;
Для каждого Измерение из Метаданные.РегистрыСведений.Измерения Цикл
МассивКолонок.Добавить(Измерение.Имя);
КонецЦикла;
Для каждого Ресурс из Метаданные.РегистрыСведений.Ресурсы Цикл
МассивКолонок.Добавить(Ресурс.Имя);
КонецЦикла;
Для каждого Реквизит из Метаданные.РегистрыСведений.Реквизиты Цикл
МассивКолонок.Добавить(Реквизит.Имя);
КонецЦикла;
Возврат МассивКолонок;
КонецФункции

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

&НаСервере
Процедура СозданиеДинамическогоСписка(
ИмяСписка, //Имя элемента динамического списка на форме и реквизита
ТекстЗапроса, //Текст произвольного запроса для динамического списка
МассивКолонок, //Массив имен колонок табличного поля с динамическим списком
ТаблицаСписка, //Имя основной таблицы динамического списка
ПараметрыЗапроса = Неопределено)//тип структура — содержит перечень параметров, если они используются в запросе.
//Создаем реквизит формы с типом ДинамическийСписок и преданным в процедуру именем
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип(«ДинамическийСписок»));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,»»,ЛОЖЬ);
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//Задаем свойства реквизита
РеквизитДинамическийСписок = ЭтаФорма; //Имя реквизита
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип(«ТаблицаФормы»));
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Создание колонок из переданного массива колонок
Для Каждого ИмяКолонки Из МассивКолонок Цикл
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип(«ПолеФормы»), ТаблицаФормы);
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + «.» + ИмяКолонки;
КонецЦикла;
КонецПроцедуры

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

Перед тем, как создавать новый динамический список нужно попытаться удалить уже существующий (если пользователь его ранее создал). Иначе возникнет ошибка при создании. Рассмотрим процедуру удаления. Она тоже должна выполняться на сервере. Удаление оборачиваем в оператор Попытка, т.к. удаляемого реквизита и элемента формы может не существовать.

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

&НаСервере
Процедура УдалитьЭлементыСписка()
Попытка
Элементы.Удалить(Элементы.Список);
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить(«Список»);
ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
Исключение
КонецПопытки;
КонецПроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *