Как обойти динамический список с произвольным запросом ?

1. andpyxa 31.10.12 21:23 Сейчас в теме
Вопрос: есть "динамический список" с произвольным запросом, в который добавлено дополнительное поле типа булево , которе используется в качестве флажка для интерактивного выбора пользователем элементов из этого списка.

Теперь надо как-то обойти этот список и выполнить действие если флажок установлен.

Элементы.Список - не обходится, выдаёт ошибку - нет итератора.

Просьба подсказать как можно обойти его в цикле - сложность в том, что надо учесть выбор пользователем дополнительно добавленного флажка ?
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. Win98 01.11.12 08:43 Сейчас в теме
(1) andpyxa, имхо, выгрузить в обычный список и с ним работать. Динамический только для отображения хорош, чтобы не гонять большие объемы данных.
FIERYLIONS; +1 Ответить
5. Andrino 01.11.12 09:23 Сейчас в теме
(1) andpyxa,
получить текущие значения параметров (если есть) и отбора списка, и с ними выполнить этот запрос в коде, а результат выгрузить в таблицу значений и обходить.
2. deniseek77 86 31.10.12 21:37 Сейчас в теме
Для й=0 по элементы.список.количесто()-1 цикл
Индекс=Элементы.Список.Индекс(й);
Если Индекс.Пометка тогда
Сообщить("В элементе с номером "+й+1+"пометка");
иначе
Сообщить("В элементе с номером "+й+1+"нет пометки");
КонецЕсли;
Конеццикла;



Основная идея понятна? Не проерял в синтакс помошнике, но есть возможность получить индекс строки по ее номеру, вроде так
3. mymyka 01.11.12 08:34 Сейчас в теме
(2)у Дин. списка нет метода количество(), на то он и динамический.
6. andpyxa 01.11.12 11:43 Сейчас в теме
1. Запрос выполнить не получится, потому что надо учитывать выбранные пользователем строки.
2. У динамического списка нет ни индекса ни метода количество().
FIERYLIONS; +1 Ответить
8. Andrino 02.11.12 10:54 Сейчас в теме
(6) andpyxa,
если нужно работать с выделенными строками, то это не динамический список. Смотри таблицу формы (она отображает и динамический список), у нее есть свойство-массив ВыделенныеСтроки.
Egovigor; FIERYLIONS; +2 Ответить
7. ilya.ilya 01.11.12 11:46 Сейчас в теме
(0) Вопрос: как реализовали интерактивный выбор в динамическом списке? А то была давно такая задача - не вышло.. (данные ведь только для чтения)
9. zba 48 13.01.13 19:41 Сейчас в теме
Я вот так сделал через опу конечно но работает, если большой конечно не большой список список, иначе тупить будет
	  
   ОбщийОбемВДинСписке=0;
   Элементы.СписокВыбора.ТекущаяСтрока=1;
   пока элементы.СписокВыбора.ТекущаяСтрока<>неопределено  цикл
	  ОбщийОбемВДинСписке= ОбщийОбемВДинСписке+  элементы.СписокВыбора.ТекущиеДанные.Объем;
	  новстр=объект.Номенклатра.Добавить();
	  новстр.номенклатура=элементы.СписокВыбора.ТекущиеДанные.номенклатура;
	  новстр.объем=элементы.СписокВыбора.ТекущиеДанные.объем; 
	  новстр.количество=элементы.СписокВыбора.ТекущиеДанные.количество;
	  
	  Элементы.СписокВыбора.ТекущаяСтрока=Элементы.СписокВыбора.ТекущаяСтрока+1;

	
   конеццикла
Показать
taramaz; Ili4hKing; houpl; Alex_E; Михаська; Klyacksa; dDeneb; Dr.ZIG; HenrySLAV; _Sedoy; arccos6pi; sergathome; FIERYLIONS; +13 Ответить
10. FIERYLIONS 222 13.01.13 19:58 Сейчас в теме
(9) zba, классно главное решение нашел а то я столько голову напрягал )))
13. dDeneb 16.03.16 21:50 Сейчас в теме
Люди, пока курил Вашу тему, ОБНАРУЖИЛ (!! благодаря (9)):
динамический список МОЖНО "спозиционировать" с помощью Ссылки на объект данных, указанный в Основной таблице запроса ДС. Т.е., и перебрать ДС можно точно таким же образом.. К примеру:
Хочу в документе ЗаказТП организовать Подбор из справочника Номенклатура.
В открываемой из документа ЗаказТП форме списка справочника Номенклатура в процедуре ПриОткрытии я пишу:

Для каждого рСтрока из тзВыбранныеТовары Цикл
      //____ позиционирую список на текущую номенклатуру
      Элементы.Список.ТекущаяСтрока		= рСтрока.Номенклатура;
      //____ и устанавливаю текущее количество
      Элементы.Список.ТекущиеДанные.Количество	= рСтрока.Количество;
  КонецЦикла;


тзВыбранныеТовары - таблица значений с номенклатурой (столбы Номенклатура, Количество), которую я заполняю заранее по табличной части документа ЗаказТП.
Список - имя реквизита формы списка справочника Номенклатура (собственно, ДС). Поле "Количество" - дополнительное поле, специально для обозначения пользователем выбираемого количества, в произвольном запросе Динамического списка оно было обозначено как:
"ВЫБРАТЬ ...ля-ля-ля...,
       0 КАК Количество
   ИЗ ...ля-ля-ля... ", и так далее


Спасибо (9) за идею
nikiforovvn; +1 Ответить
11. inshair 20.02.15 15:20 Сейчас в теме
Andrino, все верно написал. У автора работает пользователь именно с таблицей на форме, и именно с нее нужно считывать строки на клиенте для это есть все! И не нужно воротить непосредственно объект "динамический список".
12. i-Demon-i 30.12.15 03:13 Сейчас в теме
Я вот так делал:
Для ОбходСписка	=	0 По ЭтаФорма.ВладелецФормы.Объект.Запчасти.Количество()-1 Цикл
	ОбластьЗапчасти.Параметры.НомерСтроки = ОбходСписка + 1;
	СтрокаСписка=	ЭтаФорма.ВладелецФормы.Объект.Запчасти.Получить(ОбходСписка);
	ОбластьЗапчасти.Параметры.Запчасть	= СтрокаСписка.Запчасть;
	ОбластьЗапчасти.Параметры.Серия		= СтрокаСписка.Серия;
	ОбластьЗапчасти.Параметры.Цена		= СтрокаСписка.Цена;
	ТабДок.Вывести(ОбластьЗапчасти);
КонецЦикла;
14. martemp 11.05.16 13:08 Сейчас в теме
... решил дополнить ветку готовым кодом (для платформы 8.3.6.1977 и выше).
После перебора предложенных вариантов, продолжил поиски и встретил
зазеркалье 1С
где предложенный код выводит результат в табличный документ, а тут в таблицу/дерево значений:
материал на сайте итс

в итоге такой рабочий код:
&НаСервере
Процедура СписокВТЗнаСервере()

	Схема = Элементы.ТаблицаНаФорме.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.ТаблицаНаФорме.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ТаблицаРезультат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

КонецПроцедуры
Показать


в ТаблицеРезультат будет ровно то, что в таблице на форме с учетом применённых отборов и сортировок.

Если пожелает душа, то можно из таблицы высыпать в массив колонку с ссылкой, отдать клиенту и рисовать процесс обработки в духе:
	сч = 0; СчМах = МассивСсылок.Количество();
	
	Для каждого эл Из МассивСсылок Цикл
		Элементы.ТаблицаНаФорме.ТекущаяСтрока = эл;
		сч=сч+1; Состояние(эл, сч/СчМах*100,"... обработка", БиблиотекаКартинок.Обработка);
		
		ЧегоТоСделатьНаСервере(эл);
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	Элементы.ТаблицаНаФорме.Обновить();
Показать
Aggressorak; AlexandrN; Archer161; Andy1981; indefinitum000; AO_PNT; MaxPowerr; FilatovRA; Wefast; Flyerink; ldpr; Muhin555; SadrA; Ildar13; user1258850; ckamakc; fatman78; user1427893; Vlad87; Jombla; A_Max; Gh0sTsp; olja-ljaaa; cheiser1982; user659168_xec8787; mmv; mikeA; arshanskiyav; Kabal; Jeka44; Gendelf; galuna256; Viking; insurgut; w3bstr; kild; purgin; user745653; NN2P; itc_Geo; Zixxx; user679150_olesja; whiteo; EVKash; hardcodder2020; Dima_; celtic; Zhilyakovdr; bobah_; ImHunter; pol737; gragden; MrFlanker; KillerMann; zavis11; suepifanov; Serg3141; Kasyn; Pitbull-1C; Serge_ASB; 1cProfit; vsnazarov; mojrakety; +63 Ответить
15. vsnazarov 26 29.05.16 18:39 Сейчас в теме
(14) martemp, Супер, то что нужно, СписокВТЗнаСервере() - очень полезная процедура для дин.списка!
17. Stalker27 37 11.09.16 20:29 Сейчас в теме
(14) martemp, Спасибо большое, идеальный вариант! Сэкономил пару часов потраченного времени =)
18. k@tya 12.10.16 10:41 Сейчас в теме
(14) martemp, Спасибо. Прямо спас))
20. MrFlanker 219 07.01.17 06:18 Сейчас в теме
21. waol 313 27.01.17 01:40 Сейчас в теме
(14) Тоже вожусь с этим. Дело в том, что если колонки с ссылкой нет в таблице формы (например, она просто скрыта через Изменить форму...), то этого поля не будет в
ТаблицаРезультат. пока не получилось добиться, чтобы ссылка попадала в результат и тогда, когда она скрыта
25. whiteo 13.09.17 12:07 Сейчас в теме
(14) Спасибо! как раз нужно обойти список значений, а костыль делать не охото
16. 1cProfit 03.06.16 09:05 Сейчас в теме
19. KillerMann 178 29.12.16 21:47 Сейчас в теме
Мар Темп, хорошие решение нашел, за что плюсую. Но для малого количества строк для производительности все же лучше так:

	НомерТекСтроки = 1;
	Пока Элементы.СчетПокупателю.ДанныеСтроки(НомерТекСтроки) <> Неопределено  Цикл
		
		ТекДанныеСтроки = Элементы.СчетПокупателю.ДанныеСтроки(НомерТекСтроки);
		
		СтрокаЗакупок = Объект.Закупки.Добавить();
		СтрокаЗакупок.Номенклатура = ТекДанныеСтроки.Номенклатура;
		
		НомерТекСтроки = НомерТекСтроки + 1;
	КонецЦикла;
Показать
mikeA; igormiro; Viking; +3 Ответить
26. Vlad87 29.01.20 14:44 Сейчас в теме
(19) Так лучше никогда не делать, это Костыль. Неважно, уверен ли в том, что сейчас отображаются все данные, а не порция. Неважно, уверен ли в том, что это не войдет в привычку, что в дальнейшем в выборку не попадет больше элементов и не начнутся порции. Неопытный программист с радостью возьмет такое на вооружение на все случаи - "здорово же, и нет этой всякой мути с компоновками/процессорами". Я и сам со всем "этим" постоянно призалипаю, но посчитал долгом прокомментировать.
22. waol 313 27.01.17 01:51 Сейчас в теме
// добавляем ссылку в макет
	ЯчейкиМакета1=МакетКомпоновки.Макеты.Макет1.Макет.Ячейки;
	ЯчейкаСсылки=ЯчейкиМакета1.добавить();
	ЯчейкаСсылки.Имя="Ссылка";
	ЯчейкаСсылки.Заголовок="Ссылка";
	ЯчейкаСсылки.ТипЗначения=новый описаниетипов("СправочникСсылка.Номенклатура");
	
	ЯчейкиМакета2=МакетКомпоновки.Макеты.Макет2.Макет.Ячейки;
	ЯчейкаСсылки=ЯчейкиМакета2.добавить();
	ЯчейкаСсылки.Значение=новый ПараметрКомпоновкиДанных("П8");
	ЯчейкаСсылки.Колонка="Ссылка";
	
	ПараметрыМакета2=МакетКомпоновки.Макеты.Макет2.Параметры;
	ПараметрыМакета2.Найти("Ссылка")
	НовПараметр=ПараметрыМакета2.Добавить(тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
	НовПараметр.Выражение="НаборДанныхДинамическогоСписка.Ссылка";
	НовПараметр.Имя="П8";
Показать
AnPet; miXna5; Vlad87; SergArmy; +4 Ответить
23. waol 313 27.01.17 01:53 Сейчас в теме
добился таки - так работает, когда ссылка не видна на таблице
27. Vlad87 29.01.20 21:33 Сейчас в теме
24. sokir 2 04.04.17 21:46 Сейчас в теме
А пронумеровать данным механизмом можно?
Написал
сч = 0;
	Для каждого эл Из спСсылок Цикл
	    сч = сч + 1;
	    Элементы.Список.ТекущаяСтрока = эл.Значение;
	    Элементы.Список.ТекущиеДанные.НомСтр = сч;
	КонецЦикла;


Оно только в конце пронумеровало - в остальных строках успело затереться
И очень долго обрабатывается "Элементы.Список.ТекущаяСтрока = эл.Значение".

В основном список выводится с отбором и там совсем не много строк - чаше всего даже без прокрутки все видно.
Есть стабильный и быстрый способ нумерации?
28. Sintson 411 24.12.20 10:31 Сейчас в теме
Делать надо так:

// реквизит1 - динамический список на форме
Схема = Элементы.Реквизит1.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Реквизит1.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

https://1c-bezproblem.ru/zametki-programmista/obojti-dinamicheskij-spisok-dinamicheskij-spisok-v-tablitsu-znachenij
29. Muhin555 24 29.01.21 18:11 Сейчас в теме
(28) Это тоже самое что в (14) привели текст
30. 7500877 15.04.21 08:28 Сейчас в теме
(28) Пост, на который Вы ссылаетесь ссылается на этот пост... и как теперь из цикла выйти?!.
31. ValeroBo 21.09.22 17:38 Сейчас в теме
Выполнить обход динамического списка можно в событии СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки), где Строки можно использовать как итератор цикла при обходе.

Вызвать событие можно так: Элементы.Список.Обновить().

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

Конечно же мы понимаем, что такая обработка приведет только к обходу выбранной порции данных (не всех данных, которые могут быть получены при прямом исполнении запроса динамического списка). Но для ряда ситуаций этого будет достаточно.
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день