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

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,
если нужно работать с выделенными строками, то это не динамический список. Смотри таблицу формы (она отображает и динамический список), у нее есть свойство-массив ВыделенныеСтроки.
NicolasCage; Egovigor; FIERYLIONS; +3
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 222 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 Сейчас в теме
Работает
enoty200shtyk; +1
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 Сейчас в теме
добился таки - так работает, когда ссылка не видна на таблице
Vlad87; +1
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 Сейчас в теме
Выполнить обход динамического списка можно в событии СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки), где Строки можно использовать как итератор цикла при обходе.

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

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

Конечно же мы понимаем, что такая обработка приведет только к обходу выбранной порции данных (не всех данных, которые могут быть получены при прямом исполнении запроса динамического списка). Но для ряда ситуаций этого будет достаточно.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот