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,
если нужно работать с выделенными строками, то это не динамический список. Смотри таблицу формы (она отображает и динамический список), у нее есть свойство-массив ВыделенныеСтроки.
fierylions; +1 Ответить
7. ilya.ilya 01.11.12 11:46 Сейчас в теме
(0) Вопрос: как реализовали интерактивный выбор в динамическом списке? А то была давно такая задача - не вышло.. (данные ведь только для чтения)
9. zba 48 13.01.13 19:41 Сейчас в теме
Я вот так сделал через опу конечно но работает, если большой конечно не большой список список, иначе тупить будет
	  
   ОбщийОбемВДинСписке=0;
   Элементы.СписокВыбора.ТекущаяСтрока=1;
   пока элементы.СписокВыбора.ТекущаяСтрока<>неопределено  цикл
	  ОбщийОбемВДинСписке= ОбщийОбемВДинСписке+  элементы.СписокВыбора.ТекущиеДанные.Объем;
	  новстр=объект.Номенклатра.Добавить();
	  новстр.номенклатура=элементы.СписокВыбора.ТекущиеДанные.номенклатура;
	  новстр.объем=элементы.СписокВыбора.ТекущиеДанные.объем; 
	  новстр.количество=элементы.СписокВыбора.ТекущиеДанные.количество;
	  
	  Элементы.СписокВыбора.ТекущаяСтрока=Элементы.СписокВыбора.ТекущаяСтрока+1;

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

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


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


Спасибо (9) за идею
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,"... обработка", БиблиотекаКартинок.Обработка);
		
		ЧегоТоСделатьНаСервере(эл);
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	Элементы.ТаблицаНаФорме.Обновить();
Показать
mmv; mikeA; arshanskiyav; Kabal; Jeka44; Gendelf; galuna256; Viking; insurgut; w3bstr; kadild; purgin; user745653; NN2P; itc_Geo; Zixxx; user679150_olesja; whiteo; EVKash; user737101; Dima_; celtic; Zhilyakovdr; bobah_; ImHunter; pol737; gragden; MrFlanker; KillerMann; zavis11; Gizmo_esu; Serg3141; Kasyn; Pitbull-1C; Serge_ASB; 1cProfit; vsnazarov; mojrakety; +38 Ответить
15. vsnazarov 29.05.16 18:39 Сейчас в теме
(14) martemp, Супер, то что нужно, СписокВТЗнаСервере() - очень полезная процедура для дин.списка!
17. Stalker27 28 11.09.16 20:29 Сейчас в теме
(14) martemp, Спасибо большое, идеальный вариант! Сэкономил пару часов потраченного времени =)
18. k@tya 12.10.16 10:41 Сейчас в теме
(14) martemp, Спасибо. Прямо спас))
20. MrFlanker 158 07.01.17 06:18 Сейчас в теме
21. waol 182 27.01.17 01:40 Сейчас в теме
(14) Тоже вожусь с этим. Дело в том, что если колонки с ссылкой нет в таблице формы (например, она просто скрыта через Изменить форму...), то этого поля не будет в
ТаблицаРезультат. пока не получилось добиться, чтобы ссылка попадала в результат и тогда, когда она скрыта
25. whiteo 13.09.17 12:07 Сейчас в теме
(14) Спасибо! как раз нужно обойти список значений, а костыль делать не охото
16. 1cProfit 03.06.16 09:05 Сейчас в теме
19. KillerMann 166 29.12.16 21:47 Сейчас в теме
Мар Темп, хорошие решение нашел, за что плюсую. Но для малого количества строк для производительности все же лучше так:

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


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

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

Вакансии

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

Ведущий программист 1С
Нижний Новгород
зарплата от 100 000 руб.
Полный день

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

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству