Получить количество строк динамического списка 1с
Как известно, в последних версиях конфигураций 1С, работающих в режиме управляемого приложения, широко используется объект ДинамическийСписок. В частности, динамические списки используются для вывода списков справочников, документов и т.п.
Иногда возникает задача полностью обойти весь динамический список и провести с его строками какие-то операции. Но тут возникает проблема: динамический список нигде не хранится целиком (на то он и динамический). Строки динамического списка подгружаются постепенно, порциями. Таким образом, у динамического списка нет итератора, с помощью которого можно было бы его обойти целиком, итоговое количество строк также неизвестно.
Решить эту проблему можно выполнив запрос, аналогичный тому, который выполняется динамическим списком. Но в этом случае, в дополнение к тексту запроса, нужно еще получить и учесть все отборы, сортировки и прочие параметры, которые установил пользователь.
К счастью, начиная с версии платформы 1С:Предприятие 8.3.6.1977, доступен более простой способ.
- Список — элемент управляемой формы, в который выводится динамический список.
- Функция должна преобразовать динамический список в таблицу значений.
- Функция должна выполняться на сервере.
&НаСервере
Функция ДинамическийСписокВТаблицуЗначений ( )
//Получаем схема компановки данных (здесь хранится текст запроса)
Схема = Элементы . Список . ПолучитьИсполняемуюСхемуКомпоновкиДанных ( ) ;
//Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Элементы . Список . ПолучитьИсполняемыеНастройкиКомпоновкиДанных ( ) ;
//Выводим динамический список в таблицу значений
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ( ) ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( Схема , Настройки , , , Тип ( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ) ) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки ) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
Результат = ПроцессорВывода . Вывести ( ПроцессорКомпоновки ) ;
//Возвращаем полученную таблицу значений
Возврат Результат ;
Вот и все. Кстати, еще один плюс данного метода в том, что он работает довольно быстро, даже если строк в динамическом списке много.
Как обойти все строки динамического списка : 2 комментария
У дин.списка есть событие ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Пар. Строки есть итератором
А там разве все строки дин. списка будут доступны? Вроде бы только часть, которая отображается, а остальных строк не будет.
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
Как уже говорилось, динамический список обеспечивает быстрый просмотр больших объёмов данных. Но получить дополнительную информацию, например количество строк в списке, напрямую мы не можем.
Вариант выполнить запрос динамического списка не подходит, потому что есть отборы, которые так же необходимо учитывать.
Как известно, в последних версиях конфигураций 1С, работающих в режиме управляемого приложения, широко используется объект ДинамическийСписок. В частности, динамические списки используются для вывода списков справочников, документов и т.п.
Иногда возникает задача полностью обойти весь динамический список и провести с его строками какие-то операции. Но тут возникает проблема: динамический список нигде не хранится целиком (на то он и динамический). Строки динамического списка подгружаются постепенно, порциями. Таким образом, у динамического списка нет итератора, с помощью которого можно было бы его обойти целиком, итоговое количество строк также неизвестно.
Решить эту проблему можно выполнив запрос, аналогичный тому, который выполняется динамическим списком. Но в этом случае, в дополнение к тексту запроса, нужно еще получить и учесть все отборы, сортировки и прочие параметры, которые установил пользователь.
К счастью, начиная с версии платформы 1С:Предприятие 8.3.6.1977, доступен более простой способ.
- Список — элемент управляемой формы, в который выводится динамический список.
- Функция должна преобразовать динамический список в таблицу значений.
- Функция должна выполняться на сервере.
&НаСервере
Функция ДинамическийСписокВТаблицуЗначений ( )
//Получаем схема компановки данных (здесь хранится текст запроса)
Схема = Элементы . Список . ПолучитьИсполняемуюСхемуКомпоновкиДанных ( ) ;
//Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Элементы . Список . ПолучитьИсполняемыеНастройкиКомпоновкиДанных ( ) ;
//Выводим динамический список в таблицу значений
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных ( ) ;
МакетКомпоновки = КомпоновщикМакета . Выполнить ( Схема , Настройки , , , Тип ( «ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений» ) ) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных ;
ПроцессорКомпоновки . Инициализировать ( МакетКомпоновки ) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений ;
Результат = ПроцессорВывода . Вывести ( ПроцессорКомпоновки ) ;
//Возвращаем полученную таблицу значений
Возврат Результат ;
Вот и все. Кстати, еще один плюс данного метода в том, что он работает довольно быстро, даже если строк в динамическом списке много.
Как программно выделить все строки динамического списка?
В платформе “1с предприятие 8.2″ появился такой замечательный объект как “динамический список“. Данный объект я часто использую в подборах, если не нужно делать сложные расчеты, а просто показать данные и выбрать.
Бывают такие ситуации, что список большой, более 10 позиций, и пользователю необходимо выбрать все строки. Стандартного способа как это сделать я не нашел.
Для решения это задачи я использовал объект “WSCript.Shell“.
В процессе реализации у меня получилось 2 варианта:
Вариант №1
Определим кнопку “Выделить все строки” и в модуль обработчика добавим код:
Код 1C v 8.2 УП
С помощью данного кода выполняется нажатие клавиш “Ctrl + A“, т.е. “выделить все”.
Вариант №2
Вариант №1 не всегда срабатывал. Тогда данный код я переписал следующим образом:
Добавим реквизит формы “ПоследняяСтрокаСписка”
Для списка укажем свойство “Начальное отображение списка” = В конце списка
В процедуру “ПриОткрытии” добавим заполнение реквизита, определенного в пункте 1.
Код 1C v 8.2 УП
Определим кнопку “Выделить все строки” и в модуль обработчика добавим код:
Код 1C v 8.2 УП
С помощью данного кода выполняется нажатие клавиш “Shift + кнопка вверх“.
Хочу обратить внимание. Данное решение не будет работать на клиентах, которые запускаются на Линукс.
Похожие FAQ
Еще в этой же категории
Как на управляемой форме разместить список регистра сведений с отбором? 15
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом » ДинамическийСписок» В поле » Основная табли Поле выбора
Заполнение списка значений в элементе поле выбора на форме 9
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип — Произвольный, Использование — Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Как установить параметр динамического списка? 8
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма
Программное создание таблицы значений с условным оформлением 6
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Как обновить динамический список или реквизит на форме клиента? 6
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Есть динамический список и форма списка справочника. Нужно в форме отображать количество элементов в динамическом списке. Как наиболее правильно это сделать? Какой обработчик события задействовать?
(0) Заменить динамический список на коллекцию.
У динамического списка по определению нет количества (может меняться каждые 0,1 сек.).
или тебе нужно сколько записей из таблицы тебе доступны по правам?
или тебе нужно еще с учетом установленых отборов?
Считать можно АВТОНОМЕРЗАПИСИ.
Но,можно в при получении данных сделать тот же запрос,что и для списка только с приставкой КОЛИЧЕСТВО
(9) Вот ты хороший вопрос задал.
"или тебе нужно еще с учетом установленых отборов?"
Конечно с учетом. Где и кому может понадобиться без учета?
(0) ты же преподаватель и не знаешь ответ на такой простой вопрос?
нету итератора и нету количество
модифицируй запрос чтобы количество выдавал
Если бы дедушка знал количество записей, то он был бы бабушкой.
Вроде бы работала недокументированная магия через построитель запроса если ему источником динамический список засунуть. Тогда он вроде бы может родить запрос с отборами динамического списка.
Слава богу за всю мою практику такая фигня ни разу не потребовалась.
(22) Это понятно. Только как это сделать без контекста? ПриПолученииДанных вызывает процедуру без контекста
(25) Ох уж! Показываешь пользователю работу со списком. Говоришь: смотри как удобно, правую кнопку нажал, в середине есть пункт "Найти. ", и вот ты уже отобрал все нужные тебе записи. Пользователь: Вау! А сколько их?
Пропасть между разработчиками 1С и пользователями их продукта просто огромна. Почему такой очевидный вопрос от пользователя сразу не пришел в голову разработчику?
(26) Спасибо, конечно. Но у меня проблема не в этом. А в том, на какой обработчик события эту роскошь повесить
(28) Говоришь пользователю: смотри как удобно, правую кнопку нажал, в середине есть пункт "Вывести список". Или даже есть кнопка "Еще", а в ней опять таки "Вывести список". И смотришь номер последней строки.
(28) Потому что за таким вопросом, как правило, кроется плохо спроектированный интерфейс и/или бизнес процесс.
(28) Потому что разработчик платформы решал перпендикулярную инженерную задачу - как сделать пользователю комфортную работу со списками потенциально бесконечного размера. Которая исключает знание их количества.
Когда пользователю нужно это знать - это уже задача прикладного программиста обеспечить пользователя подходящими инструментами.
(30) хорошо, что вы машины не проектируете. Смотри как удобно лючок бензобака открыл, веточку в бак вставил, вытаскивает и смотришь уровень топлива
(36) делается отдельная элемента (индикатор уровня топлива) на нужной форме
которая обновляется в нужные моменты
Я так понимаю, что от любого решения Мишенька теперь будет воротить нос и выпендриваться.
Ну, что сказать. Тебе надо - ты и делай, чо.
(42) или по таймеру или в момент неких действий юзера
и да получение уровня топлива никак не привязано к форме списка, это независимое
(45)+ причем лучше совместить, чтобы если очень много действий то не надо каждый раз получать, ибо еще мало времени прошло
(44) Задачи пользователей не всегда возможно решить в реальной жизни так, как пользователям хотелось бы. Иначе все пользователи были бы молодыми, красивыми и богатыми. Но ты не инженер, тебе не понять.
ЗЫ. Но с контекстным событием обновления ДС действительно нехорошо получилось :) Нету его.
(0) отображать кол-во элементов после применения платформенных пользовательских отборов? Если так, то увы не получится - событий нет и их не перехватить
(47) это противоречит асинхронности и отказу от модальности
иначе разрабы конф начали бы на него разное вешать и получать фризы
(49) > иначе разрабы конф начали бы на него разное вешать
Хорошая присказка. Помню ее долго приговаривали, не давая пользователю делать произвольные отборы в динамических списках. Мол тормозить будет по неиндексированным полям. Потом плюнули.
А забирать возможности у разрабов конф из "благих побуждений" - это дорога в ад. Вы или крестик снимите или трусы наденьте.
(50) Нет. Он истину глаголет. В экосистеме 1С, состоящей из разработчиков платформы, разработчиков типовых, разработчиков "последней мили" и пользователей, разработчики типовых - самое слабое звено. Их по хорошему стоило бы давно ликвидировать
(54) Только ликвидаторов потом тоже обязательно зачистить. Там достойных людей никогда не встречается.
(47) Да ладно бы и фиг с ним. Берем неконтекстное ПриПолученииДанных(). Разработчики нам туда вроде как настройки ДС кидают вторым параметром. В настройках вроде как Отбор есть. Казалось бы бери и строй запрос. Ура, вроде как. Ставишь точку останова. Заходишь в список, делаешь отбор через правую кнопку. Смотришь в конфигураторе в отбор. А он ПУСТОЙ. И вот тут начинаешь материться. 1С в очередной раз сожрала у меня время. Чавкнула и не подавилась. Недоделанность хаотично разбросана по всей 1С. Никогда не знаешь, где напорешься. Ну лучше бы не делали этот обработчик события! А начав делать, доделали бы до конца!
Список значений в 1С 8.3 — это объект, позволяющий строить динамические наборы значений и манипулировать ими.
Визуально можно представить как таблицу из четырёх колонок:
- значение,
- картинка,
- пометка,
- представление.
Список значений может быть наполнен значениями любых типов. Значения характеризуются позицией в списке (индексом).
Рассмотрим работу с объектом на примерах:
Создание объекта СписокЗначений
Добавить элемент в список значений
Удалить элемент списка значений
Вставить элемент в список значений
Установить/снять пометки у всех элементов
Найти в списке значений
Узнать индекс элемента с известным значением
Отсортировать список значений
Сдвинуть элемент списка значений
Создать копию списка значений
Получить количество элементов списка значений
Перебор элементов списка значений
Загрузить/выгрузить в массив
Удалить все элементы из списка значений
Интерактивный выбор одного элемента из списка на форме
Модальный и немодальный режим. Универсальный способ:
Интерактивная отметка значений из списка на форме
Модальный и немодальный режим. Универсальный способ:
Преобразования таблицы значений в список значений
Поддержите нас, расскажите друзьям!
СПРОСИТЕ в комментариях!
При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.
Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.
Рассмотрим работу с динамическими списками на примере конфигурации 1С.Управление торговлей. Для примера разберем динамический список для справочника «Контрагенты».
Запустим 1С в режиме «Конфигуратор».
В конфигурации найдем справочник «Контрагенты».
Откроем форму «Форма Списка».
Рассмотрим форму списка справочника. Реквизит «Список» имеет тип «ДинамическийСписок».
Двойным щелчком откроем свойства реквизита.
Нас интересует свойство «Произвольный запрос». Если для данного свойства установлен флаг, то для вывода информации в динамический список мы можем использовать собственный запрос.
Нажмем теперь «Открыть» у свойства «Настройка списка».
Перед нами открывается окно настройки запроса динамического списка. Первая вкладка «Запрос».
Мы можем ка написать запрос вручную в поле «Запрос», так и воспользоваться кнопкой «Конструктор запросов».
На данной вкладке так же стоит обратить внимание на флаги «Динамическое считывание данных» и «Автозаполнение доступных полей».
Флаг «Динамическое считывание данных» определяет размер «части» возвращаемых запросом данных. Т.е. Если флаг установлен, то «части» имеют не большой размер, но при прокрутке динамического списка может происходить небольшое подвисания из-за до получения «частей». Если флаг не установлен, то возвращаемые данные мы получаем большими «частями». Это означает, что первоначально запрос может отрабатывать дольше, но подвисаний в процессе прокрутки не будет.
Флаг «Автозаполнение доступных полей» определяет поля доступные для отбора. Если флаг установлен, то поля верхней выборки становятся доступными для установки отбора.
Вторая вкладка «Настройки».
На данной вкладке мы можем установить некоторые отборы. Стоит обратить внимание на флаг «Включать в пользовательские настройки».
Если мы установили отбор и флаг, то пользователь сможет самостоятельно отключить отбор, воспользовавшись командой «Настроить список».
Так же на вкладке «Настройки» мы можем задавать «Порядок», «Группировки» и «Условное оформление.
В случае, если мы в запросе использовали какие-либо параметры, то необходимо заполнить их значения. Установим значение параметров в модуле формы в процедуре «ПриСозданииНаСервере». Для этого воспользуемся стандартным кодом для установки параметров.
Как оптимизировать работу с программой?
В работе с 1С периодически можно столкнуться с вопросами, который не в состоянии решить обыкновенный пользователь. Если у вас в штате нет специалистов 1С или они решают более стратегические задачи, от которых отвлекать их попросту нерационально, мы приглашаем обратиться за помощью к команде профессионалов.
Мы предлагаем услуги по сопровождению 1С , в рамках которого наши сотрудники смогут оперативно решать подобные и многие другие проблемы. Большой опыт работ и сертифицированные специалисты позволят обеспечить бесперебойную работу с программой, защиту информации и оптимизацию бизнес-процессов.
Вы еще не внедрили 1С или необходимо установить программу в новый филиал компании? Обратитесь за внедрением и настройкой к нам — вы сэкономите свое время и избежите возможных ошибок и проблем в дальнейшем.
Позвоните по номеру телефона, указанному на сайте или заполните форму обратной связи, чтобы наши сотрудники сориентировали по стоимости работ, подобрали оптимальное решение и рассказали, как начать сотрудничество. Ждем вас!
Читайте также: