Передача параметра в запрос из текущего выбранного документа.
Добрый день. Столкнулся с очередной проблемой. У меня есть внешняя печатная форма, которая может цепляться к любым документам (нестандартная форма МБ-8). Необходимо получить из регистра сведений цену на номенклатуру, которая лежит в документе, на основе которого нужно построить печатную форму. То есть, например, в документе "ВнутреннееПотребление" у нас указано 10 ручек, но цена на ручки лежит в регистре сведений. Чтобы достать цену на эти ручки, я не могу явно указать параметр через док "ВнутреннееПотребление", потому что кроме этого документа, печатную форму формируют ещё, например, 15 документов. Я придерживаюсь следующей логики:
,
Где в - СсылкаНаОбъект - текущий выбранный документ, Товары - его табличная часть.
Такой вариант не работает. Но я не знаю других вариантов передачи параметра в этот запрос. Подскажите, пожалуйста, как можно решить эту задачу.
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| ВидЦены = &ВидЦены
| И Номенклатура.Ссылка = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.Номенклатура);
ПоказатьГде в
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.Номенклатура);
Такой вариант не работает. Но я не знаю других вариантов передачи параметра в этот запрос. Подскажите, пожалуйста, как можно решить эту задачу.
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Может соединением проще будет сделать?
Только документ свой подставь.
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена,
ЦеныНоменклатурыСрезПоследних.ТипЦен
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
ПО РеализацияТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
И ЦеныНоменклатурыСрезПоследних.Период >= РеализацияТоваровУслугТовары.Ссылка.Дата
ПоказатьТолько документ свой подставь.
Попробуйте запросе изменить
А в параметр передать всю номенклатуру из таб. части
| И Номенклатура.Ссылка В (&Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних");
А в параметр передать всю номенклатуру из таб. части
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
(14)При таком варианте запрос, конечно, работает, но при этом запрос вынимает только одно значение цены.
Т.е. цены у этих наименований должны быть разными. Первое фото - моя форма, второе фото - форма накладной.
Т.е. цены у этих наименований должны быть разными. Первое фото - моя форма, второе фото - форма накладной.
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| ВидЦены = &ВидЦены
| И Номенклатура.Ссылка В (&Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("ВидЦены", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
ПоказатьПрикрепленные файлы:
(19) Почему-то не могу в личные сообщения написать. На данный момент по тому запросу, что Вы привели вы получаете просто цену. Т.е. она никак не связана с номенклатурой, сделайте так:
И покажите как Вы потом эту цену используете.
ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
И покажите как Вы потом эту цену используете.
(20) В итоге запрос оставил вот таким, он прекрасно работает:
А далее, я делаю вот так:
т.е. перебираю выборку. Только сейчас проблема заключается в том, что Результат.Цена не хочет преобразовываться в число. :)
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура.Ссылка В (&Номенклатура)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("ВидЦены", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
ПоказатьА далее, я делаю вот так:
Выборка = Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура));
Если Выборка <> Неопределено Тогда
ОбластьСтроки.Параметры.Цена = Результат.Цена;
Сумма = Колво * Результат.Цена;
КонецЕсли;
(22)Число() по результату не работало, потому что у определённых документов возвращался пустой результат запроса (соответственно приведение типов не проходило). Однако обработав запрос на пустоту, можно абсолютно без проблем получить результат. Финальный вид вот таков:
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура.Ссылка В (&Номенклатура)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("ВидЦены", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
//Строки кода
//Ещё больше строк
//И ещё немного
Выборка = Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура));
Если ВыборкаНаПустоту.Пустой() Тогда
ОбластьСтроки.Параметры.Цена = NULL;
ОбластьСтроки.Параметры.Сумма = NULL;
Иначе
Если Выборка <> Неопределено Тогда
ОбластьСтроки.Параметры.Цена = Результат.Цена;
Сумма = Колво * Результат.Цена;
ОбластьСтроки.Параметры.Сумма = Сумма;
СуммаИтог = СуммаИтог + Сумма;
КонецЕсли;
КонецЕсли;
Показать
(24) С удовольствием бы, на самом деле, послушал её, потому что при проверке работоспособности оказалось, что если существует товар, но для него не указана цена, то ему присваивается последняя записанная на форму цена, что неверно, должен быть ноль. Вероятнее всего, ошибка в сравнении имён номенклатур, но я уже просто закипел с этой печатной формой. :)
(26) Из табличной части документа. Сейчас покажу:
Собственно, номенклатура достаётся из табличной части документа (Товары - имя таб. части). ВыборкаНаПустоту - строка для проверки результата запроса, пуст он или нет. Разделяю на две переменные для наглядности, чтобы самому потом не путаться.
СуммаИтог = 0;
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура.Ссылка В (&Номенклатура)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("ВидЦены", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
ВыборкаНаПустоту = Запрос.Выполнить();
Результат = ВыборкаНаПустоту.Выбрать();
ТабличныйДокумент = Новый ТабличныйДокумент;
МакетПечФормы = ПолучитьМакет("ПФ_MXL_МБ8");
//Вот тут вывод шапки и заголовка таблицы
//то есть ничего интересного
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки.Параметры.МатериалНаименование = ТекущаяСтрока.Номенклатура;
ОбластьСтроки.Параметры.НоменклатурныйНомер = ТекущаяСтрока.Номенклатура.Код;
ОбластьСтроки.Параметры.ЕдИзмер = ТекущаяСтрока.Номенклатура.ЕдиницаИзмерения;
ОбластьСтроки.Параметры.КодЕдиницыИзм = ТекущаяСтрока.Номенклатура.ЕдиницаИзмерения.Код;
ОбластьСтроки.Параметры.Количество = ТекущаяСтрока.КоличествоУпаковок;
Колво = Число (ТекущаяСтрока.КоличествоУпаковок);
Выборка = Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура));
Если ВыборкаНаПустоту.Пустой() Тогда
ОбластьСтроки.Параметры.Цена = NULL;
ОбластьСтроки.Параметры.Сумма = NULL;
Иначе
Если Выборка <> Неопределено Тогда
ОбластьСтроки.Параметры.Цена = Результат.Цена;
Сумма = Колво * Результат.Цена;
ОбластьСтроки.Параметры.Сумма = Сумма;
СуммаИтог = СуммаИтог + Сумма;
КонецЕсли;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
ПоказатьСобственно, номенклатура достаётся из табличной части документа (Товары - имя таб. части). ВыборкаНаПустоту - строка для проверки результата запроса, пуст он или нет. Разделяю на две переменные для наглядности, чтобы самому потом не путаться.
(27) Если я все правильно понимаю, "Выборка" не будет равна неопределенно.
Возвращаемое значение:
Тип: Булево.
Истина - запись найдена; Ложь - в противном случае.
Описание:
Осуществляет поиск записи по указанным условиям и установку указателя выборки на нее.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Текущая запись не рассматривается.
Возвращаемое значение:
Тип: Булево.
Истина - запись найдена; Ложь - в противном случае.
Описание:
Осуществляет поиск записи по указанным условиям и установку указателя выборки на нее.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Текущая запись не рассматривается.
(28) Касательно этой строки - здесь все работает так, как должно. Проблема в следующем:
Запрос возвращает, например:
Наименование = ОПГС, Цена = 100
Наименование = ОПГС (продажа), Цена = 0
Однако в форму пишется
Наим Цена
ОПГС 100
ОПГС(продажа) 100
Т.е. при прохождении моих условий, цене присваивается последнее найденное значение.
Запрос возвращает, например:
Наименование = ОПГС, Цена = 100
Наименование = ОПГС (продажа), Цена = 0
Однако в форму пишется
Наим Цена
ОПГС 100
ОПГС(продажа) 100
Т.е. при прохождении моих условий, цене присваивается последнее найденное значение.
(27) Мне стыдно это советовать или говорить, но самое примитивное - попробуйте выгрузить результат запроса в ТЗ, а потом просто ищите там по номенклатуре. Вместо "Выборка = Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура));"
Но в запросе добавьте ЕстьNULL
Но в запросе добавьте ЕстьNULL
(36) Принял, благодарю. Кстати говоря, что-то я не догадался использовать сообщить. А запрос 2 раза возвращает одну и ту же номенклатуру, проблема в этом. Это вообще жесть какая-то.
UPD. Понял, в чём проблема: в регистре нет записи с ценой для ОПГС (продажа), поэтому и получается хрень. Сейчас нужно подумать, как исключить задвоение записи в таком случае.
UPD. Понял, в чём проблема: в регистре нет записи с ценой для ОПГС (продажа), поэтому и получается хрень. Сейчас нужно подумать, как исключить задвоение записи в таком случае.
Прикрепленные файлы:
(39) Аааа, не всё так просто.) В этом регистре ни один из нужных мне документов не двигается, соответственно, ссылок на него там тоже нет.) Связь с ценой можно наладить именно через номенклатуру (либо её код). Сейчас вот проблема заключается в том, что если в документе встречается номенклатура, которой нет в запросе, запрос пугается и задваивает последнюю запись. Отсюда и баг с ценой. Сейчас вот думаю, как исключить это задваивание. Т.е., если в регистре нет записи на номенклатуру, цена = 0.
(40 )
Попробуйте
СуммаИтог = 0;
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЕстьNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура.Ссылка В (&Номенклатура)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних");
Запрос.УстановитьПараметр("ВидЦены", СсылкаНаОбъект.ВидЦены);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
ВыборкаНаПустоту = Запрос.Выполнить();
Результат = ВыборкаНаПустоту.Выгрузить();
ТабличныйДокумент = Новый ТабличныйДокумент;
МакетПечФормы = ПолучитьМакет("ПФ_MXL_МБ8");
//Вот тут вывод шапки и заголовка таблицы
//то есть ничего интересного
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки.Параметры.МатериалНаименование = ТекущаяСтрока.Номенклатура;
ОбластьСтроки.Параметры.НоменклатурныйНомер = ТекущаяСтрока.Номенклатура.Код;
ОбластьСтроки.Параметры.ЕдИзмер = ТекущаяСтрока.Номенклатура.ЕдиницаИзмерения;
ОбластьСтроки.Параметры.КодЕдиницыИзм = ТекущаяСтрока.Номенклатура.ЕдиницаИзмерения.Код;
ОбластьСтроки.Параметры.Количество = ТекущаяСтрока.КоличествоУпаковок;
Колво = Число (ТекущаяСтрока.КоличествоУпаковок);
ЦенаПоНоменклатуре = Результат.Найти(ТекущаяСтрока.Номенклатура, "Номенклатура")
ОбластьСтроки.Параметры.Цена = ЦенаПоНоменклатуре.Цена;
Сумма = Колво * ЦенаПоНоменклатуре.Цена;
ОбластьСтроки.Параметры.Сумма = Сумма;
СуммаИтог = СуммаИтог + Сумма;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
ПоказатьПопробуйте
(43) Исправил, да, после того, как вы обратили моё внимание на это.) Но теперь в строке Сумма = Колво * ЦенаПоНоменклатуре.Цена; компилятор не может преобразовать ЦенаПоНоменклатуре.Цена в Число. Это, вероятнее всего, потому что для одной номенклатуры соответствия не найдено.
(44) Блин, туплю:
ЦенаПоНоменклатуре = Результат.Найти(ТекущаяСтрока.Номенклатура, "Номенклатура")
Если ЦенаПоНоменклатуре<> Неопределено Тогда
ОбластьСтроки.Параметры.Цена = ЦенаПоНоменклатуре.Цена;
Сумма = Колво * ЦенаПоНоменклатуре.Цена;
ОбластьСтроки.Параметры.Сумма = Сумма;
СуммаИтог = СуммаИтог + Сумма;
Иначе
ОбластьСтроки.Параметры.Цена = 0;
ОбластьСтроки.Параметры.Сумма = 0;
КонецЕсли;
Показать
(46) Везде поправил. Сумма = Колво * ЦенаПоНоменклатуре.Цена; - не может преобразоваться к (Число). Условие Если ЦенаПоНоменклатуре<> Неопределено Тогда, как я понимаю, не выполняется, потому что ТЗ возвращает хотя бы одну запись, а значит она определена. Опять же, как я понимаю.
(47) Возвращаемое значение:
Тип: СтрокаТаблицыЗначений, Неопределено.
Строка, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено.
Не должно. Надо через сообщить вычислить что там за номенклатура и какая цена.
Тип: СтрокаТаблицыЗначений, Неопределено.
Строка, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено.
Не должно. Надо через сообщить вычислить что там за номенклатура и какая цена.
(48) Ох, я жёстко ступил, в запросе вместо цены, вытянул ВидЦены, а это действительно ни разу не число.) Как только в запросе сменил на ЕстьNULL(ЦеныНоменклатурыСрезПоследних.ЦЕНА, 0) КАК Цена, сразу всё исправилось. Прошу прощения за последние 10 минут потерянного времени, это исключительно моя невнимательность.)
(46) Для обнуления значений выводимой строки, можно ее получать непосредственно в цикле Чтоб наверняка прошлые значения не попали в новую строку.
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
..............
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
..............
(27) Метод "НайтиСледующий" аналогичен методу "Следующий", за тем исключением, что "НайтиСледующий" выбирает запись из выборки, которая удовлетворяет условию. Можно было написать так
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
...............................
Если Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура)); Тогда
ОбластьСтроки.Параметры.Цена = Результат.Цена;
..........................
КонецЕсли;
Для Каждого ТекущаяСтрока из СсылкаНаОбъект.Товары Цикл
ОбластьСтроки = МакетПечФормы.ПолучитьОбласть("Строка");
...............................
Если Результат.НайтиСледующий(Новый Структура("Номенклатура", ТекущаяСтрока.Номенклатура)); Тогда
ОбластьСтроки.Параметры.Цена = Результат.Цена;
..........................
КонецЕсли;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот