Доброго дня профессионалы! Подскажите как заполнить столбец ТЧ документа из выгрузки запроса. в выгрузке через отладку необходимое поле получаю. Но в ТЧ записать не могу, подскажите как?
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выгрузить();
Для каждого НоваяСтрока Из Объект.Товары Цикл
ОбъектВыборки = Справочники.НомераГТД.НайтиПоКоду(Выборка);
НоваяСтрока.НомерГТД = ОбъектВыборки;
КонецЦикла;
СписокНоменклатуры = Товары.Выгрузить().ВыгрузитьКолонку("Номенклатура");
Запрос = новый Запрос;
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
"ВЫБРАТЬ
| ТоварыОрганизаций.Номенклатура КАК Номенклатура,
| ТоварыОрганизаций.НомерГТД КАК НомерГТД
|ИЗ
| РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
|ГДЕ
| ТоварыОрганизаций.Номенклатура В (&СписокНоменклатуры)
| И ТоварыОрганизаций.НомерГТД.РНПТ = ЛОЖЬ
| И ТоварыОрганизаций.ДокументРеализации.Контрагент = &Контрагент";
Выборка = Запрос.Выполнить.Выбрать();
СоответствиеНоменклатураНомерГТД = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоответствиеНоменклатураНомерГТД.Вставить(Выборка.Номенклатура, Выборка.НомерГТД);
КонецЦикла;
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.НомерГТД = СоответствиеНоменклатураНомерГТД.Получить(СтрокаТЧ.Номенклатура);
КонецЦикла;
Показать
PS. в корректности текста запроса сомневаюсь, но пусть будет так.
(1) 1. Ну код красив: стандарты соблюдены, отступы, имена переменных, результат запросы, выгрузка...
2. А дальше нужно примерно понимать, что же мы хотим сделать.
3. По всему видно, что хочется заполнить поле НомерГТД в табличной части.
4. По всему ясно, что это справочник элемента (ну или элемент справочника).
5. Ну а дальше надо ответить на несколько простых вопросов: что в результате запроса? Почему там нет ГТД? Как туда этот ГТД добавить? Как найти в выборке запроса нужный ГТД? Ну а как это засунуть в табличную часть - тут без претензий.
(10) У каждой задачи есть сотни решений. Но если Вы никогда такие задачи не решали, то у Вас есть способность открыть еще как минимум одно решение. Там в п.5 есть вопросы - ответьте на них себе.
Попробуй подумать в сторону обхода выборки, а не выгрузки в ТаблицуЗначений
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
// обходим результат запроса
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// добавляем строку ТЧ
НоваяСтрока = Объект.Товары.Добавить();
// присваиваем значение, если в выборке поле код называется по другому, замени на другое
НоваяСтрока.НомерГТД = Справочники.НомераГТД.НайтиПоКоду(ВыборкаДетальныеЗаписи.Код);
КонецЦикла;
Результатом Выбрать является Выборка - курсор некий, указывающий на пока еще никакую позицию. Для перехода к следующей позиции (строке) нужно делать Выборка.Следующий(), результатом которого является Да или Нет (ну или истина или ложь). Если результат - истина, то в переменной Выборка будут поля очередной строки запроса. Если ложь - все, строки в запросе закончились. Поэтому обычно сия конструкция используется таким образом: Пока Выборка.Следующий() Цикл ...
Что нетак с запросом? в консоле получаю поле с номером ГТД, в выгрузке тоже, а в выборке неопределено, в каких случаях такое может быть. запрос без связей, простейший из регистра, в регистре все заполнено.
ВЫБРАТЬ
| ТоварыОрганизаций.ДокументРеализации КАК ДокументРеализации,
| ТоварыОрганизаций.Номенклатура КАК Номенклатура,
| ТоварыОрганизаций.НомерГТД КАК НомерГТДБезРНПТ,
| ТоварыОрганизаций.ДокументРеализации.Контрагент КАК ДокументРеализацииКонтрагент,
| ТоварыОрганизаций.Номенклатура.Артикул КАК НоменклатураАртикул,
| ТоварыОрганизаций.НомерГТД.РНПТ КАК НомерГТДРНПТ
|ПОМЕСТИТЬ ВТ_ТоварыОрг
|ИЗ
| РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
|ГДЕ
| ТоварыОрганизаций.Номенклатура = &Номенклатура
| И ТоварыОрганизаций.НомерГТД.РНПТ = ЛОЖЬ
| И ТоварыОрганизаций.ДокументРеализации.Контрагент = &Контрагент
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТоварыОрг.НомерГТДБезРНПТ КАК НомерГТДБезРНПТ
|ИЗ
| ВТ_ТоварыОрг КАК ВТ_ТоварыОрг
в Выборке колонка должна называться так же как в ТЧ. Потом просто В ТЧ "Загрузите" это колонку. Цикл не нужен, посмотрите методы ТЧ (он же таблица значений если не ошибаюсь).
(17) у вас в самом верху "Выгрузка" называется "Выборка" - посмотрите как переменную проименовали.
Брать колонку естественно нужно из выгрузки, которая создается методом "Выгрузить" и ее загружать в табличную часть.
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выгрузить();
Для каждого НоваяСтрока Из Объект.Товары Цикл
ОбъектВыборки = Справочники.НомераГТД.НайтиПоКоду(Выборка);
НоваяСтрока.НомерГТД = ОбъектВыборки;
КонецЦикла;
проблема вставить результаты выгрузки, скриншот прикрепляю, в столбец табличной части
(21) )) в табличной части тип ссылка, потому что вы ее не получили.
я не помню точно как к табличной части обращаться, если вы в модуле формы, то по моему просто по имени можно:
- примарно так ТабличнаяЧасть.Загрузить(ИмяТаблицыЗначений);
Только толи все названия колонок должны совпадать, толи ваша колонка в ТаблицеЗначений должна совпасть хотя-бы с одной из ТЧ. Погуглите
у запроса есть два метода Выгрузить() и Выбрать().
У Выгрузить() - результат помещается в таблицу значений - сразу.
у Выбрать() - происходит обход по строчно методом Следующий() см. (4).
Значение Неопределено не может там быть.
на этапе выбрать там будет пустое значение типа ВыборкаИзРезультатаЗапроса.
после команды Следующий() - будет некая "структура" с расшифровкой вашей строки запроса.
такое ощущение что вы не пытаетесь разобраться, а пытаетесь нас запутать.
также допускаю еще один вараинт проблемы, что у вас НомерГТД ссылочный тип(судя по запросу), а в ТАбличной части некий другой тип и они разные - в следствии чего значения сбрасываются.
Но из ваших описаний не похоже на эту ошибку.
(20)то есть, то что через отладку в выборке значение не определено, на самом деле определено?? я же скинул скриншот, значение только в выгрузке определяется, в выборке же = неопределено.
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.НомерГТД = Справочники.НомераГТД.НайтиПоКоду(Выборка.НомерГТДБезРНПТ);
КонецЦикла;
Неработает...
столбец не заполняется, да еще и подставляется снизу пустая строка в тч
(23) ну вот с 7 утра до 13 часов мы пытались выяснить в чем проблема...
про строчку
НоваяСтрока.НомерГТД = Справочники.НомераГТД.НайтиПоКоду(Выборка.НомерГТДБезРНПТ);
никто ничего не говорил...
у вас команда
Справочники.НомераГТД.НайтиПоКоду(Выборка.НомерГТДБезРНПТ)
работает следующим образом:
1. в Выборка.НомерГТДБезРНПТ - у вас ссылка типа справочникссылка.НомерГТД
2. команда Справочники.НомераГТД.НайтиПоКоду( ... предполагает что вы введете текстовый индтивикатор Код по которому система найдет соответсвие и выдаст вам это значение. когда вы пихаете туда ссылку, она ничего не находит естественно.
СписокНоменклатуры = Товары.Выгрузить().ВыгрузитьКолонку("Номенклатура");
Запрос = новый Запрос;
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
"ВЫБРАТЬ
| ТоварыОрганизаций.Номенклатура КАК Номенклатура,
| ТоварыОрганизаций.НомерГТД КАК НомерГТД
|ИЗ
| РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
|ГДЕ
| ТоварыОрганизаций.Номенклатура В (&СписокНоменклатуры)
| И ТоварыОрганизаций.НомерГТД.РНПТ = ЛОЖЬ
| И ТоварыОрганизаций.ДокументРеализации.Контрагент = &Контрагент";
Выборка = Запрос.Выполнить.Выбрать();
СоответствиеНоменклатураНомерГТД = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоответствиеНоменклатураНомерГТД.Вставить(Выборка.Номенклатура, Выборка.НомерГТД);
КонецЦикла;
Для Каждого СтрокаТЧ Из Товары Цикл
СтрокаТЧ.НомерГТД = СоответствиеНоменклатураНомерГТД.Получить(СтрокаТЧ.Номенклатура);
КонецЦикла;
Показать
PS. в корректности текста запроса сомневаюсь, но пусть будет так.
"ВЫБРАТЬ
| ТоварыОрганизаций.Номенклатура КАК Номенклатура,
| ТоварыОрганизаций.НомерГТД КАК НомерГТД
|ИЗ
| РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
|ГДЕ
| ТоварыОрганизаций.Номенклатура В (&СписокНоменклатуры)
| И ТоварыОрганизаций.НомерГТД.РНПТ = ЛОЖЬ
| И ТоварыОрганизаций.ДокументРеализации.Контрагент = &Контрагент";
Все работает! Спасибо! решение сложнее чем я думал
p.s через выгрузку у меня тоже получилось записать значение в ТЧ, при обращении через индекс Выборка[0].НомерГТДБезРНПТ. Но записывалась только одна строка, если в ТЧ было больше одной строки, то ошибка индекс выходит за пределы массива.