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

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

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

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

Просьба подсказать как можно обойти его в цикле - сложность в том, что надо учесть выбор пользователем дополнительно добавленного флажка ?
Ответы
2. Денис Новиков (deniseek77) 87 31.10.12 21:37 Сейчас в теме
Для й=0 по элементы.список.количесто()-1 цикл
Индекс=Элементы.Список.Индекс(й);
Если Индекс.Пометка тогда
Сообщить("В элементе с номером "+й+1+"пометка");
иначе
Сообщить("В элементе с номером "+й+1+"нет пометки");
КонецЕсли;
Конеццикла;
...Показать Скрыть



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

	
   конеццикла
...Показать Скрыть
houpl; Alex_E; Михаська; Klyacksa; dDeneb; Dr.ZIG; HenrySLAV; Knopodav; arccos6pi; sergathome; fierylions; +11 Ответить 2
10. F L (fierylions) 196 13.01.13 19:58 Сейчас в теме
(9) zba, классно главное решение нашел а то я столько голову напрягал )))
11. Ilya Khabarov (inshair) 20.02.15 15:20 Сейчас в теме
Andrino, все верно написал. У автора работает пользователь именно с таблицей на форме, и именно с нее нужно считывать строки на клиенте для это есть все! И не нужно воротить непосредственно объект "динамический список".
12. i-Demon-i (i-Demon-i) 30.12.15 03:13 Сейчас в теме
Я вот так делал:
Для ОбходСписка	=	0 По ЭтаФорма.ВладелецФормы.Объект.Запчасти.Количество()-1 Цикл
	ОбластьЗапчасти.Параметры.НомерСтроки = ОбходСписка + 1;
	СтрокаСписка=	ЭтаФорма.ВладелецФормы.Объект.Запчасти.Получить(ОбходСписка);
	ОбластьЗапчасти.Параметры.Запчасть	= СтрокаСписка.Запчасть;
	ОбластьЗапчасти.Параметры.Серия		= СтрокаСписка.Серия;
	ОбластьЗапчасти.Параметры.Цена		= СтрокаСписка.Цена;
	ТабДок.Вывести(ОбластьЗапчасти);
КонецЦикла;
...Показать Скрыть
13. dDeneb Schmeiser (dDeneb) 16.03.16 21:50 Сейчас в теме
Люди, пока курил Вашу тему, ОБНАРУЖИЛ (!! благодаря (9)):
динамический список МОЖНО "спозиционировать" с помощью Ссылки на объект данных, указанный в Основной таблице запроса ДС. Т.е., и перебрать ДС можно точно таким же образом.. К примеру:
Хочу в документе ЗаказТП организовать Подбор из справочника Номенклатура.
В открываемой из документа ЗаказТП форме списка справочника Номенклатура в процедуре ПриОткрытии я пишу:

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


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


Спасибо (9) за идею
14. Мар Темп (martemp) 11.05.16 13:08 Сейчас в теме
... решил дополнить ветку готовым кодом (для платформы 8.3.6.1977 и выше).
После перебора предложенных вариантов, продолжил поиски и встретил
зазеркалье 1С
где предложенный код выводит результат в табличный документ, а тут в таблицу/дерево значений:
материал на сайте итс

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

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

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


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

Если пожелает душа, то можно из таблицы высыпать в массив колонку с ссылкой, отдать клиенту и рисовать процесс обработки в духе:
	сч = 0; СчМах = МассивСсылок.Количество();
	
	Для каждого эл Из МассивСсылок Цикл
		Элементы.ТаблицаНаФорме.ТекущаяСтрока = эл;
		сч=сч+1; Состояние(эл, сч/СчМах*100,"... обработка", БиблиотекаКартинок.Обработка);
		
		ЧегоТоСделатьНаСервере(эл);
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	Элементы.ТаблицаНаФорме.Обновить();
...Показать Скрыть
EVKash; user737101; Dima_; celtic; Zhilyakovdr; bobah_; ImHunter; pol737; gragden; MrFlanker; KillerMann; zavis11; Gizmo_esu; Serg3141; Kasyn; Pitbull-1C; Serge_ASB; 1cProfit; vsnazarov; mojrakety; +20 Ответить 5
15. Виктор Назаров (vsnazarov) 29.05.16 18:39 Сейчас в теме
(14) martemp, Супер, то что нужно, СписокВТЗнаСервере() - очень полезная процедура для дин.списка!
16. Маркусов Сергей (1cProfit) 03.06.16 09:05 Сейчас в теме
17. Дмитрий Моргунов (Stalker27) 27 11.09.16 20:29 Сейчас в теме
(14) martemp, Спасибо большое, идеальный вариант! Сэкономил пару часов потраченного времени =)
18. Екатерина Грузенкина (k@tya) 12.10.16 10:41 Сейчас в теме
(14) martemp, Спасибо. Прямо спас))
19. Александр Лучший (KillerMann) 143 29.12.16 21:47 Сейчас в теме
Мар Темп, хорошие решение нашел, за что плюсую. Но для малого количества строк для производительности все же лучше так:

	НомерТекСтроки = 1;
	Пока Элементы.СчетПокупателю.ДанныеСтроки(НомерТекСтроки) <> Неопределено  Цикл
		
		ТекДанныеСтроки = Элементы.СчетПокупателю.ДанныеСтроки(НомерТекСтроки);
		
		СтрокаЗакупок = Объект.Закупки.Добавить();
		СтрокаЗакупок.Номенклатура = ТекДанныеСтроки.Номенклатура;
		
		НомерТекСтроки = НомерТекСтроки + 1;
	КонецЦикла;
...Показать Скрыть
20. Ivan Veres (MrFlanker) 106 07.01.17 06:18 Сейчас в теме
21. Олег Валуйский (waol) 226 27.01.17 01:40 Сейчас в теме
(14) Тоже вожусь с этим. Дело в том, что если колонки с ссылкой нет в таблице формы (например, она просто скрыта через Изменить форму...), то этого поля не будет в
ТаблицаРезультат. пока не получилось добиться, чтобы ссылка попадала в результат и тогда, когда она скрыта
22. Олег Валуйский (waol) 226 27.01.17 01:51 Сейчас в теме
// добавляем ссылку в макет
	ЯчейкиМакета1=МакетКомпоновки.Макеты.Макет1.Макет.Ячейки;
	ЯчейкаСсылки=ЯчейкиМакета1.добавить();
	ЯчейкаСсылки.Имя="Ссылка";
	ЯчейкаСсылки.Заголовок="Ссылка";
	ЯчейкаСсылки.ТипЗначения=новый описаниетипов("СправочникСсылка.Номенклатура");
	
	ЯчейкиМакета2=МакетКомпоновки.Макеты.Макет2.Макет.Ячейки;
	ЯчейкаСсылки=ЯчейкиМакета2.добавить();
	ЯчейкаСсылки.Значение=новый ПараметрКомпоновкиДанных("П8");
	ЯчейкаСсылки.Колонка="Ссылка";
	
	ПараметрыМакета2=МакетКомпоновки.Макеты.Макет2.Параметры;
	ПараметрыМакета2.Найти("Ссылка")
	НовПараметр=ПараметрыМакета2.Добавить(тип("ПараметрОбластиВыражениеКомпоновкиДанных"));
	НовПараметр.Выражение="НаборДанныхДинамическогоСписка.Ссылка";
	НовПараметр.Имя="П8";
...Показать Скрыть
23. Олег Валуйский (waol) 226 27.01.17 01:53 Сейчас в теме
добился таки - так работает, когда ссылка не видна на таблице
24. Dima (sokir) 04.04.17 21:46 Сейчас в теме
А пронумеровать данным механизмом можно?
Написал
сч = 0;
	Для каждого эл Из спСсылок Цикл
	    сч = сч + 1;
	    Элементы.Список.ТекущаяСтрока = эл.Значение;
	    Элементы.Список.ТекущиеДанные.НомСтр = сч;
	КонецЦикла;
...Показать Скрыть


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

В основном список выводится с отбором и там совсем не много строк - чаше всего даже без прокрутки все видно.
Есть стабильный и быстрый способ нумерации?
Оставьте свое сообщение