1с получить выделенные строки динамического списка

Обновлено: 03.07.2024

Работа табличного поля с динамическими списками

Табличное поле может отображать два типа данных : динамические списки и статические данные . Особенностью динамических списков является использование при обращении к базе данных механизма динамической выборки , при которой данные считываются не полностью , а блоками . Особенностью статических данных является хранение в памяти всех данных . Примерами динамических списков являются списки справочников , документов , регистров , а примерами статических данных - таблица значений , дерево значений , табличная часть , наборы записей .

При отображении динамических списков табличное поле особым образом отображает полосу прокрутки - в ней бегунок отображается только в трех положениях : вверху , в центре и внизу , и имеет постоянный размер . Такое поведение связано с тем , что табличное поле для уменьшения объема выбираемых данных загружает из базы данных только часть списка , причем, считывание может происходить начиная с любой записи, в том числе и из середины списка . Тем самым табличное поле содержит только видимую часть списка и , следовательно , не имеет информации об положении строки в списке и количестве строк в списке . Поэтому бегунок не отражает положение видимой части списка и используется только для перемещения в начало и конец списка , а также к текущей строке списка . Также положение бегунка указывает на достижение начала или конца списка , это происходит если пользователь попытался выйти за границы списка .

Множественное выделение строк

При выделении группы строк в табличном поле ( например , при нажатии Shift+Home или Shift+End) выделяются только первая и последняя строка списка . Такое поведение характерно для табличных полей , отображающих динамические списки . Как уже было сказано выше , табличное поле при работе с динамическими списками оперирует только видимой частью списка и не имеет информации о положении строки в списке . Следовательно , при выборе группы записей , невозможно однозначно определить, какая из выбранных строк является первой , а какая последней . Следовательно , невозможно определить направление выделения строк , что не позволяет быстро определить диапазон строк .

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

Особенности использования свойств ТекущиеДанные и ТекущаяСтрока

Табличное поле предоставляет свойства ТекущиеДанные и ТекущаяСтрока . Отличие между этими свойствами состоит в том , что свойство ТекущиеДанные содержит значения считанных данных текущей строки табличного поля , а свойство ТекущаяСтрока содержит значение , идентифицирующее строку . Следует отметить , что свойство ТекущиеДанные содержит коллекцию значений текущей строки , соответствующую коллекции колонок отображаемого динамического списка , при этом если нужного поля нет в текущих данных , то его можно добавить в коллекцию полей списка используя метод " Добавить " коллекции колонок списка .

Свойство ТекущиеДанные предназначено для получения значений колонок текущей строки , а свойство ТекущаяСтрока для получения и установки текущей строки табличного поля.

Следует заметить, что для объектных данных (Справочник, Документ и т.д.) в качестве значения свойства ТекущаяСтрока используется ссылка на объект базы данных. Соответственно при обращении к свойствам этого значения будет выполняться считывание объекта базы данных.

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

Особенности работы в режиме отображения дерева

В режиме отображения дерева табличное поле , отображающее динамические списки , особым образом отображает кнопки раскрытия узлов . Используется два цвета отображения кнопки : черный и серый . Если при попытке открытия узла дерева было обнаружено, что дочерних узлов нет , то кнопка рисуется серым цветом , иначе - черным . Такое поведение обусловлено тем , что определение наличия подчиненных узлов требует дополнительных ресурсов и при считывании данных не происходит . Поэтому для удобства пользователя узлы , у которых не было обнаружено дочерних узлов , запоминаются табличным полем . Также стоит отметить , что цвет кнопки никак не влияет на последующее раскрытие узлов дерева .

Затупил над простым вопросом. На УФ есть динамический список с основной таблицей в виде РС подчиненного регистратору. Надо получить значения из определенных колонок выделенных пользователем строк. В ТЧ это решается через получение ИД строк и метода:

У динамического списка такового нет. Как быть?

salt7; An-Aleksey; i.c.h; MariusUrsus; Serega-artem; Sashares; + 6 – Ответить

(19)Понятно.
Сначала надо в отдельный массив выделенные строки добавить.

А потом уже его обходить для получения данных.

(1) ВыделенныеСтроки (SelectedRows)
Использование:
Только чтение.
Описание:
Тип: Массив.
Содержит массив идентификаторов выделенных строк. (2) Так ИД получить не проблема, проблема получить данные по этим ИД. (6) Вы вопрос читали? Нет у динамического списка НайтиПоИдентификатору() ! (4) В выделенные строки заглядывали? Идентификаторами для динамического списка, основная таблица которого – РС, являются ключи записи этого РС. (11)А если убрать основную таблицу, то просто число.
Поэтому не суть что там. На УФ есть динамический список с основной таблицей в виде РС подчиненного регистратору. (13)Это я видел.
Я к тому, что из ключей ничего получить нормально нельзя. (14) Как раз из данных строки вы ничего не получите, точнее получите значения отображаемых колонок. При работе с ДС всегда следует работать с идентификаторами строк (ТекущаяСтрока / ВыделенныеСтроки). Надо получить значения из определенных колонок выделенных пользователем строк.

Именно это можно сделать из текущих данных, как предложено в (10)

При работе с ДС всегда следует работать с идентификаторами строк
Пока ничего полезного по теме вы не сказали.
Вот у вас идентификатор КлючЗаписи регистра, дальше что?

(16) Ваш вариант работает, но как-то странно: выводится информация только по части строк, причем закономерности особой не вижу! Буду копать дальше.

Про КлючЗаписи знаю, игрался долго с ним перед тем как задать вопрос на форму, но ничего путного не получил.

(19)Понятно.
Сначала надо в отдельный массив выделенные строки добавить.

А потом уже его обходить для получения данных.

(23)Сложно))
И максимум, что увижу - измерения.
А если надо ресурс или реквизит - предлагаете заново читать по ключу? (26) Вы получите Набор значений, однозначно идентифицирующих запись регистра. Этого более чем достаточно.

(27)
Если нужно получить значение из списка, который показывается пользователю на форме, считаю, что получать ключи регистра, потом по ключам читать записи регистра - не адекватное решение.

Если же нужно получить данные записей РС, которых нет в колонках списка, то ваш вариант, бесспорно, подходит.

(28) Это работает точно так же как с динамическим списком справочника или документа. Если вам понадобится получить какой-либо реквизит документа из выделенной строки списка, вы вряд ли будете его вытаскивать из данных строки – вы возьмете ссылку документа и на сервере получите его значение в запросе. Иначе вам необходимо предусмотреть наличие этой колонки в списке, пользовательскую видимость или включенное свойство реквизита ДС "Использовать всегда". (1)Если не указывать основную таблицу (если она регистр сведений), то в целом можно.

(5)Предыдущий комментарий не корректный. Извиняюсь.
Можно так:

Взять выделенные строки списка.
В цикле устанавливать текущей строкой - одну из выделенных.
Из ТекущихДанных брать значение.

Особенности использования метода ДанныеСтроки()

Табличное поле предоставляет свойства "ТекущиеДанные", "ТекущаяСтрока", а также метод ДанныеСтроки(). Свойство "ТекущиеДанные" содержит значения считанных данных текущей строки табличного поля, а свойство "ТекущаяСтрока" содержит значение, идентифицирующее строку. Следует отметить, что свойство "ТекущиеДанные" содержит коллекцию значений текущей строки, соответствующую коллекции колонок отображаемого динамического списка. Метод "ДанныеСтроки" возвращает коллекцию значений произвольной строки динамического списка, отображаемого табличным полем. При этом возвращаемая коллекция значений также соответствует коллекции колонок отображаемого динамического списка.

Метод "ДанныеСтроки" может использоваться для обхода различных коллекций строк табличного поля (например, коллекции выделенных строк при множественном выделении или массива строк, полученного при перетаскивании данных из одного табличного поля в другое). Также данный метод можно использовать для проверки возможности вставки данных в табличное поле при перетаскивании.

Поясним использование данного метода на следующем примере. Пусть существует форма подбора номенклатуры, на которой расположено табличное поле, отображающее справочник номенклатуры. Требуется осуществлять подбор номенклатуры из данного табличного поля, причем, подбирать можно только те строки, у которых не установлена пометка удаления. Для упрощения примера будем осуществлять подбор только при помощи механизма перетаскивания. Для этого у табличного поля, отображающего справочник номенклатуры, необходимо установить свойство "РазрешитьНачалоПеретаскивания", а также установить режим множественного выделения строк, используя свойство "РежимВыделения". Далее, при обработке события «НачалоПеретаскивания» необходимо проверить в массиве перетаскиваемых строк (он передается через свойство «Значение» параметра "ПараметрыПеретаскивания" в обработчике события) наличие строк, помеченных на удаление и если такие строки существуют, то удалить их из массива. Пример обработчика события приведен ниже :

Обход коллекции выделенных строк можно пояснить на следующем примере. Пусть существует табличное поле, отображающее список справочника "Номенклатура". Требуется сохранить в текстовом документе все выделенные строки данного справочника, причем, сохранять необходимо только значения видимых колонок табличного поля. В приведенном ниже примере запись выделенных строк осуществляется при нажатии на специальную кнопку " Записать" :

Более подробно ознакомиться с особенностями реализации перетаскивания в формах можно в разделе "Особенности реализации перетаскивания в формах".

Читайте также: