1с Розница 2.2 8.3.10

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

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

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

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

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

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

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

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

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

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

З.Ы. будьте снисходительны, ведь я только учусь!
---
Прошу прощения за Г*внокод

все получилось, когда в мозгу сложилась вся картинка по оперированию данными

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

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

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

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

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

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

    КонецЦикла;

    КонецПроцедуры
```
---
Из выборки сделай массив.

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

Строки[ВыборкаНоменклатура.Номенклатура]; - в массив "строки" вместо индекса посылаешь какое-то значение.
---
Вот так можно:

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

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

    УПОРЯДОЧИТЬ ПО
    Значение
    ИТОГИ ПО
    Номенклатура
```
---
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) - это твоя процедура?
---
сие творение было взято из примера по работе с ДС, источник уже и не вспомню.
название процедуры так же перекачевало оттуда. А так процедура именно та которая вызывается при получении данных на сервере.
---
Сообщение было скрыто модератором.
---
На мой взгляд вот это странное творение:
Для Каждого Элемент Из Строки.ПолучитьКлючи() Цикл
        МассивН.Добавить(Строки[Элемент].Данные["Номенклатура"]);
    КонецЦикла;

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

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

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

Осталось теперь понять, как передать "нужный ключ" СтрокаСписка=Строки[Нужный ключ];
---
(6) - поторопился, значение забыл...
(7) - должно работать.
---
Очень прошу прощения, проблема оказалась в совсем другом.

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

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

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

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

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

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

    СтрокаСписка=Строки[ВыборкаНоменклатура.Номенклатура];
    СтрокаСписка.Данные.Остаток=Остатки;
    КонецЦикла;

    КонецПроцедуры
```

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

все верно в плане возникновения ошибки, так как в массиве строк ключи принадлежат записям из РегистрСведенийНоменклатураПоставщиков, а моя попытка выбрать нужную строку по ключу от Номенклатуры.
---
Хороший пример здесь https://xn----1-bedvffifm4g.xn--p1ai/news/2017-12-26-many-values-in-one-cell/?article=azeubmaprmepfpig
---
Прошу прощения за Г*внокод

все получилось, когда в мозгу сложилась вся картинка по оперированию данными

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

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

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

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

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

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

    КонецЦикла;

    КонецПроцедуры
```