Вопрос: есть "динамический список" с произвольным запросом, в который добавлено дополнительное поле типа булево , которе используется в качестве флажка для интерактивного выбора пользователем элементов из этого списка.
Теперь надо как-то обойти этот список и выполнить действие если флажок установлен.
Элементы.Список - не обходится, выдаёт ошибку - нет итератора.
Просьба подсказать как можно обойти его в цикле - сложность в том, что надо учесть выбор пользователем дополнительно добавленного флажка ?
(1) andpyxa,
получить текущие значения параметров (если есть) и отбора списка, и с ними выполнить этот запрос в коде, а результат выгрузить в таблицу значений и обходить.
Для й=0 по элементы.список.количесто()-1 цикл
Индекс=Элементы.Список.Индекс(й);
Если Индекс.Пометка тогда
Сообщить("В элементе с номером "+й+1+"пометка");
иначе
Сообщить("В элементе с номером "+й+1+"нет пометки");
КонецЕсли;
Конеццикла;
Основная идея понятна? Не проерял в синтакс помошнике, но есть возможность получить индекс строки по ее номеру, вроде так
1. Запрос выполнить не получится, потому что надо учитывать выбранные пользователем строки.
2. У динамического списка нет ни индекса ни метода количество().
(6) andpyxa,
если нужно работать с выделенными строками, то это не динамический список. Смотри таблицу формы (она отображает и динамический список), у нее есть свойство-массив ВыделенныеСтроки.
Люди, пока курил Вашу тему, ОБНАРУЖИЛ (!! благодаря (9)):
динамический список МОЖНО "спозиционировать" с помощью Ссылки на объект данных, указанный в Основной таблице запроса ДС. Т.е., и перебрать ДС можно точно таким же образом.. К примеру:
Хочу в документе ЗаказТП организовать Подбор из справочника Номенклатура.
В открываемой из документа ЗаказТП форме списка справочника Номенклатура в процедуре ПриОткрытии я пишу:
Для каждого рСтрока из тзВыбранныеТовары Цикл
//____ позиционирую список на текущую номенклатуру
Элементы.Список.ТекущаяСтрока = рСтрока.Номенклатура;
//____ и устанавливаю текущее количество
Элементы.Список.ТекущиеДанные.Количество = рСтрока.Количество;
КонецЦикла;
тзВыбранныеТовары - таблица значений с номенклатурой (столбы Номенклатура, Количество), которую я заполняю заранее по табличной части документа ЗаказТП.
Список - имя реквизита формы списка справочника Номенклатура (собственно, ДС). Поле "Количество" - дополнительное поле, специально для обозначения пользователем выбираемого количества, в произвольном запросе Динамического списка оно было обозначено как:
"ВЫБРАТЬ ...ля-ля-ля...,
0 КАК Количество
ИЗ ...ля-ля-ля... ", и так далее
Andrino, все верно написал. У автора работает пользователь именно с таблицей на форме, и именно с нее нужно считывать строки на клиенте для это есть все! И не нужно воротить непосредственно объект "динамический список".
... решил дополнить ветку готовым кодом (для платформы 8.3.6.1977 и выше).
После перебора предложенных вариантов, продолжил поиски и встретил
зазеркалье 1С где предложенный код выводит результат в табличный документ, а тут в таблицу/дерево значений:
материал на сайте итс
в ТаблицеРезультат будет ровно то, что в таблице на форме с учетом применённых отборов и сортировок.
Если пожелает душа, то можно из таблицы высыпать в массив колонку с ссылкой, отдать клиенту и рисовать процесс обработки в духе:
сч = 0; СчМах = МассивСсылок.Количество();
Для каждого эл Из МассивСсылок Цикл
Элементы.ТаблицаНаФорме.ТекущаяСтрока = эл;
сч=сч+1; Состояние(эл, сч/СчМах*100,"... обработка", БиблиотекаКартинок.Обработка);
ЧегоТоСделатьНаСервере(эл);
ОбработкаПрерыванияПользователя();
КонецЦикла;
Элементы.ТаблицаНаФорме.Обновить();
(14) Тоже вожусь с этим. Дело в том, что если колонки с ссылкой нет в таблице формы (например, она просто скрыта через Изменить форму...), то этого поля не будет в
ТаблицаРезультат. пока не получилось добиться, чтобы ссылка попадала в результат и тогда, когда она скрыта
(19) Так лучше никогда не делать, это Костыль. Неважно, уверен ли в том, что сейчас отображаются все данные, а не порция. Неважно, уверен ли в том, что это не войдет в привычку, что в дальнейшем в выборку не попадет больше элементов и не начнутся порции. Неопытный программист с радостью возьмет такое на вооружение на все случаи - "здорово же, и нет этой всякой мути с компоновками/процессорами". Я и сам со всем "этим" постоянно призалипаю, но посчитал долгом прокомментировать.
сч = 0;
Для каждого эл Из спСсылок Цикл
сч = сч + 1;
Элементы.Список.ТекущаяСтрока = эл.Значение;
Элементы.Список.ТекущиеДанные.НомСтр = сч;
КонецЦикла;
Оно только в конце пронумеровало - в остальных строках успело затереться
И очень долго обрабатывается "Элементы.Список.ТекущаяСтрока = эл.Значение".
В основном список выводится с отбором и там совсем не много строк - чаше всего даже без прокрутки все видно.
Есть стабильный и быстрый способ нумерации?
Выполнить обход динамического списка можно в событии СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки), где Строки можно использовать как итератор цикла при обходе.
Вызвать событие можно так: Элементы.Список.Обновить().
Передать данные можно через ДополнительныеСвойства динамического списка:
- в вызывающей процедуре: Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("МоиДанные", МоиДанные);
- в коде события СписокПриПолученииДанныхНаСервере: Настройки.ДополнительныеСвойства.Свойство("МоиДанные");
Конечно же мы понимаем, что такая обработка приведет только к обходу выбранной порции данных (не всех данных, которые могут быть получены при прямом исполнении запроса динамического списка). Но для ряда ситуаций этого будет достаточно.