Получить массив ссылок колонки Номенклатура из Регистры сведений.Поставщики номенклатуры

1. Illiida 13.08.18 13:03 Сейчас в теме
1с Розница 2.2 8.3.10

Не могу понять как в запрос выбора остатков при получении данных на сервере передать массив ссылок номенклатуры из запроса ДС Регистры сведений.Поставщики номенклатуры

При запуске отладки 1с и вызове Закупки-Поставляемая номенклатура получаю ошибку

{РегистрСведений.НоменклатураПоставщиков.Форма.ФормаСписка.Форма(590)}: Значение, соответствующее ключу, не задано
		СтрокаСписка=Строки[ВыборкаНоменклатура.Номенклатура];


Есть Динамический список из Регистры сведений.Поставщики номенклатуры
Исполняется произвольный запрос

ВЫБРАТЬ
	РегистрСведенийНоменклатураПоставщиков.Поставщик,
	РегистрСведенийНоменклатураПоставщиков.Магазин,
	РегистрСведенийНоменклатураПоставщиков.Номенклатура,
	РегистрСведенийНоменклатураПоставщиков.Характеристика,
	РегистрСведенийНоменклатураПоставщиков.Цена,
	РегистрСведенийНоменклатураПоставщиков.ДатаПоследнегоПоступления,
	ВЫРАЗИТЬ("" КАК СТРОКА(100)) КАК Остаток
ИЗ
	РегистрСведений.НоменклатураПоставщиков КАК РегистрСведенийНоменклатураПоставщиков
Показать


Процедура отвечающая за получение и вывод остатков по всем складам

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

МассивН = Новый Массив;
Для Каждого Элемент Из Строки.ПолучитьКлючи() Цикл
		МассивН.Добавить(Строки[Элемент].Данные["Номенклатура"]);
    КонецЦикла;


Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|	ТоварыНаСкладахОстатки.Склад КАК Склад,
		|	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
		|	ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование,
		|	СкладыДополнительныеРеквизиты.Значение КАК Значение
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(
		|			,Номенклатура В (&мТовары)) КАК ТоварыНаСкладахОстатки
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
		|		ПО (ТоварыНаСкладахОстатки.Склад.Ссылка = СкладыДополнительныеРеквизиты.Ссылка)
		|
		|УПОРЯДОЧИТЬ ПО
		|	Значение
		|ИТОГИ ПО
		|	Номенклатура";
	

	Запрос.УстановитьПараметр("мТовары", МассивН);
Показать



З.Ы. будьте снисходительны, ведь я только учусь!
Вознаграждение за ответ
Показать полностью
Найденные решения
12. Illiida 14.08.18 20:24 Сейчас в теме +2 $m
Прошу прощения за Г*внокод

все получилось, когда в мозгу сложилась вся картинка по оперированию данными
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

Массив = Новый Массив;
Для Каждого Элемент Из Строки Цикл 
	Массив.Добавить(Элемент.Ключ.Номенклатура);
    КонецЦикла;

	
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|	ТоварыНаСкладахОстатки.Склад КАК Склад,
		|	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
		|	ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование,
		|	СкладыДополнительныеРеквизиты.Значение КАК Значение
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(
		|			,Номенклатура В (&мТовары)) КАК ТоварыНаСкладахОстатки
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
		|		ПО (ТоварыНаСкладахОстатки.Склад.Ссылка = СкладыДополнительныеРеквизиты.Ссылка)
		|
		|УПОРЯДОЧИТЬ ПО
		|	Значение
		|ИТОГИ ПО
		|	Номенклатура";
	

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

		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Остатки=Остатки+?(Остатки="", "", ", ")+ВыборкаДетальныеЗаписи.Значение+": "+ВыборкаДетальныеЗаписи.КоличествоОстаток;
		КонецЦикла;
		Массив2 = Новый Массив;
Для Каждого Элемент2 Из Строки Цикл 
	ЕСЛИ Элемент2.Ключ.Номенклатура=ВыборкаНоменклатура.Номенклатура тогда
	 Строки[Элемент2.Ключ].Данные["Остаток"]=Остатки;
	конецесли;
    КонецЦикла;


			КонецЦикла;
	
КонецПроцедуры
Показать
pusal; A4ymet; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AnnaPetishkina 14.08.18 15:19 Сейчас в теме
Из выборки сделай массив.

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


Строки[ВыборкаНоменклатура.Номенклатура]; - в массив "строки" вместо индекса посылаешь какое-то значение.
3. Xershi 1484 14.08.18 15:37 Сейчас в теме
Вот так можно:
ВЫБРАТЬ
    РегистрСведенийНоменклатураПоставщиков.Поставщик,
    РегистрСведенийНоменклатураПоставщиков.Магазин,
    РегистрСведенийНоменклатураПоставщиков.Номенклатура,
    РегистрСведенийНоменклатураПоставщиков.Характеристика,
    РегистрСведенийНоменклатураПоставщиков.Цена,
    РегистрСведенийНоменклатураПоставщиков.ДатаПоследнегоПоступления,
    ВЫРАЗИТЬ("" КАК СТРОКА(100)) КАК Остаток
ПОМЕСТИТЬ втНоменклатураПоставщика
ИЗ
    РегистрСведений.НоменклатураПоставщиков КАК РегистрСведенийНоменклатураПоставщиков;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
	ТоварыНаСкладахОстатки.Склад КАК Склад,
	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
	ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование,
	СкладыДополнительныеРеквизиты.Значение КАК Значение
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура В (ВЫБРАТЬ
				втНоменклатураПоставщика.Номенклатура
			ИЗ
				втНоменклатураПоставщика)) КАК ТоварыНаСкладахОстатки
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
		ПО ТоварыНаСкладахОстатки.Склад.Ссылка = СкладыДополнительныеРеквизиты.Ссылка
		ПОЛНОЕ СОЕДИНЕНИЕ втНоменклатураПоставщика КАК втНоменклатураПоставщика
		ПО ТоварыНаСкладахОстатки.Номенклатура = втНоменклатураПоставщика.Номенклатура

УПОРЯДОЧИТЬ ПО
	Значение
ИТОГИ ПО
	Номенклатура
Показать
4. registration123 2 14.08.18 17:27 Сейчас в теме
(0)
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
- это твоя процедура?
5. Illiida 14.08.18 17:41 Сейчас в теме
(4) сие творение было взято из примера по работе с ДС, источник уже и не вспомню.
название процедуры так же перекачевало оттуда. А так процедура именно та которая вызывается при получении данных на сервере.
6. пользователь 14.08.18 18:15
Сообщение было скрыто модератором.
...
7. registration123 2 14.08.18 18:42 Сейчас в теме
На мой взгляд вот это странное творение:
Для Каждого Элемент Из Строки.ПолучитьКлючи() Цикл
МассивН.Добавить(Строки[Элемент].Данные["Номенклатура"]);
КонецЦикла;

Надо преобразовать

Для каждого Элемент Из Строки Цикл
МассивН.Добавить(Элемент.Значение.Данные["Номенклатура"]); // ну или Элемент.Значение.Данные.Номенклатура; //работать будет и так и эдак
КонецЦикла;
10. Illiida 14.08.18 19:44 Сейчас в теме
(7) из-за невнимательности и отсутствия опыта получилось, что мной в недостаточной мере была проанализирована ошибка, отсюда и следует, что вопрос был некорректным по отношению к ошибке.

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

Осталось теперь понять, как передать "нужный ключ" СтрокаСписка=Строки[Нужный ключ];
8. registration123 2 14.08.18 18:44 Сейчас в теме
(0) (6) - поторопился, значение забыл...
(7) - должно работать.
9. Illiida 14.08.18 19:36 Сейчас в теме
Очень прошу прощения, проблема оказалась в совсем другом.

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

Массив = Новый Массив;
Для Каждого Элемент Из Строки Цикл 
	Массив.Добавить(Элемент.Ключ.Номенклатура);
    КонецЦикла;

	
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|	ТоварыНаСкладахОстатки.Склад КАК Склад,
		|	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
		|	ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование,
		|	СкладыДополнительныеРеквизиты.Значение КАК Значение
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(
		|			,Номенклатура В (&мТовары)) КАК ТоварыНаСкладахОстатки
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
		|		ПО (ТоварыНаСкладахОстатки.Склад.Ссылка = СкладыДополнительныеРеквизиты.Ссылка)
		|
		|УПОРЯДОЧИТЬ ПО
		|	Значение
		|ИТОГИ ПО
		|	Номенклатура";
	

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

		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Остатки=Остатки+?(Остатки="", "", ", ")+ВыборкаДетальныеЗаписи.Значение+": "+ВыборкаДетальныеЗаписи.КоличествоОстаток;
		КонецЦикла;
		
		СтрокаСписка=Строки[ВыборкаНоменклатура.Номенклатура];
		СтрокаСписка.Данные.Остаток=Остатки;
	КонецЦикла;
	
КонецПроцедуры
Показать


1с-ка вылетает с ошибкой, что "значение соответствующее ключу не найдено" на строке
СтрокаСписка=Строки[ВыборкаНоменклатура.Номенклатура];


все верно в плане возникновения ошибки, так как в массиве строк ключи принадлежат записям из РегистрСведенийНоменклатураПоставщиков, а моя попытка выбрать нужную строку по ключу от Номенклатуры.
12. Illiida 14.08.18 20:24 Сейчас в теме +2 $m
Прошу прощения за Г*внокод

все получилось, когда в мозгу сложилась вся картинка по оперированию данными
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)

Массив = Новый Массив;
Для Каждого Элемент Из Строки Цикл 
	Массив.Добавить(Элемент.Ключ.Номенклатура);
    КонецЦикла;

	
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|	ТоварыНаСкладахОстатки.Склад КАК Склад,
		|	ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
		|	ТоварыНаСкладахОстатки.Склад.Наименование КАК СкладНаименование,
		|	СкладыДополнительныеРеквизиты.Значение КАК Значение
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.Остатки(
		|			,Номенклатура В (&мТовары)) КАК ТоварыНаСкладахОстатки
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
		|		ПО (ТоварыНаСкладахОстатки.Склад.Ссылка = СкладыДополнительныеРеквизиты.Ссылка)
		|
		|УПОРЯДОЧИТЬ ПО
		|	Значение
		|ИТОГИ ПО
		|	Номенклатура";
	

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

		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Остатки=Остатки+?(Остатки="", "", ", ")+ВыборкаДетальныеЗаписи.Значение+": "+ВыборкаДетальныеЗаписи.КоличествоОстаток;
		КонецЦикла;
		Массив2 = Новый Массив;
Для Каждого Элемент2 Из Строки Цикл 
	ЕСЛИ Элемент2.Ключ.Номенклатура=ВыборкаНоменклатура.Номенклатура тогда
	 Строки[Элемент2.Ключ].Данные["Остаток"]=Остатки;
	конецесли;
    КонецЦикла;


			КонецЦикла;
	
КонецПроцедуры
Показать
pusal; A4ymet; +2 Ответить
Оставьте свое сообщение

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