Получить Цену номенклатуры

1. fruktik 10.11.12 23:58 Сейчас в теме
Не могу понять как мне в табличную часть обработки при выборе номенклатуры получить Цену?

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

и...
Процедура ПриИзмененииНоменклатурыТоваров(Номенклатура)

	ВыбЦен = ПолучитьЦенуНоменклатуры(Номенклатура);
	Если ВыбЦен.Следующий() Тогда
		ЦенТов = Товары.Добавить();
		ЦенТов.Цена = ВыбЦен.Цена;
	КонецЕсли;
	
КонецПроцедуры
Показать

Ошибка, не задан параметр Номенклатура. Конфигурация БП
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. lisandra 11.11.12 08:38 Сейчас в теме
(1) fruktik, у вас в первом запросе переменная &номенклатура, а параметр вы передаете в переменную товар. поэтому а возникает ошибка, поправьте переменную или в запросе или в УстановитьПараметр.
6. fruktik 11.11.12 08:43 Сейчас в теме
(5) lisandra, а как мне написать в процедуре табличной части, чтобы он по выбранной номенклатуре выводил? не могу понять что написать
9. lisandra 11.11.12 08:55 Сейчас в теме
(6) fruktik, попробуйте как во втором варианте только слегка изменить
    Дата = ТекущаяДата();
    ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");


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


     РезультатЗапроса=Запрос.Выполнить();
     Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() тогда
     Возврат Выборка.Цена;
Иначе
	Возврат 0;
КонецЕсли;
Показать
2. deniseek77 86 11.11.12 00:13 Сейчас в теме
при переходе в ВыбЦен = ПолучитьЦенуНоменклатуры(Номенклатура);, что отладчик показывает в переменной номенклатура?
3. fruktik 11.11.12 00:33 Сейчас в теме
(2) deniseek77, ничего( В отладчике не ругался, а так запустил выплюнул ошибку у даты
Не задано значение параметра "Дата". Я немного изменил запрос на этот
	Дата = ТекущаяДата();
	ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен=&ТипЦен)
	|КАК 
	|	ЦеныНоменклатурыСрезПоследних
	|ГДЕ
	|	ЦеныНоменклатурыСрезПоследних.Номенклатура.Наименование = &Название";
                   
     Запрос.УстановитьПараметр("Название",Номенклатура);
     РезультатЗапроса=Запрос.Выполнить();
     Выборка = РезультатЗапроса.Выбрать();
     Возврат Выборка;
Показать
7. lisandra 11.11.12 08:47 Сейчас в теме
(3) fruktik, А в этом варианте запроса вы передали только один параметр, а в самом запросе их у вас три. И так как дата идет первым вот она на нее и ругается. Передайте в запрос остальные параметры. И проверьте что вы передаете в название, что получает сама функция, если номенклатуру, то года в название вы должны передать Номенклатура.Наименование, хотя может быть вы уже в функцию передали наименование тогда все верно.
4. deniseek77 86 11.11.12 02:11 Сейчас в теме
в новом запросе-Вы ищите по наименованию, что является плохим, очень плохим отбором, не универсальным параметром!Про предыдущий вопрос...Отладчик не может возвращать "ничего" есть: ошибка выполнения, либо возвращение значения, например: неопределено, булево, ссылка, объект, структура или соответствие..
8. fruktik 11.11.12 08:49 Сейчас в теме
Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса=Запрос.Выполнить();
по причине:
{(7, 35)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ЦеныНоменклатуры.Номенклатура <<?>>= &Номенклатура
10. fruktik 11.11.12 09:03 Сейчас в теме
Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ЦеныНоменклатурыСрезПоследних.Номенклатура <<?>>= &Номенклатура

Вот такая штука. А почему он в консоли не ругается?
12. lisandra 11.11.12 09:22 Сейчас в теме
(10) fruktik, сейчас под рукой нет 1с-ки, так что попробуйте проверить типы данных, посмотрите в отладчике. Они должны совпадать, можно попробовать сделать запрос без условий по номенклатуре, зато вы увидите одинаковые ли параметры вы передаете в запрос и что он возвращает. Может попробовать сравнивать ссылки. Но сначала проверьте в каком виде данные о номенклатуре передаются в функцию.
11. fruktik 11.11.12 09:20 Сейчас в теме
На некоторые товары вылетает это ошибка, на некоторые нет
13. fruktik 11.11.12 09:28 Сейчас в теме
14. VicGuru 11.11.12 10:42 Сейчас в теме
А вызов то процедуры как происходит? что в нее передается? и точно ли так надо ?? Дата = ТекущаяДата(); я бы делал по дате документа
15. fruktik 11.11.12 11:30 Сейчас в теме
дата нормально)), я вот тоже не знаю как из процедуры передать значение номенклатуры.
Процедура ТоварыНоменклатураПриИзменении(Элемент)


	ВыбЦен = ПолучитьЦенуНоменклатуры(Номенклатура);
	Если ВыбЦен.Следующий() Тогда
		ЦенТов = Товары.Добавить();
		ЦенТов.Цена = ВыбЦен.Цена;
	КонецЕсли;
	
КонецПроцедуры
Показать
16. m-serg74 46 11.11.12 11:36 Сейчас в теме
(15) fruktik,
ЦеныНоменклатуры.Номенклатура = &Номенклатура

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

и где тут в Запросе параметр "Товар"
17. fruktik 11.11.12 11:40 Сейчас в теме
(16) m-serg74, Товара нет, на номенклатуру переделал
18. m-serg74 46 11.11.12 11:49 Сейчас в теме
как сейчас выглядят процедуры Ваши?
19. fruktik 11.11.12 11:56 Сейчас в теме
Процедура в 15 написана, а функция вот:
Функция ПолучитьЦенуНоменклатуры(Номенклатура) Экспорт      
    Дата = ТекущаяДата();
    ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");


    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	|	 ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен=&ТипЦен)
    |КАК 
    |    ЦеныНоменклатурыСрезПоследних
    |ГДЕ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка = &Номенклатура";
                   
     Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
	 Запрос.УстановитьПараметр("Дата",ТекущаяДата());
	 Запрос.УстановитьПараметр("ТипЦен",ТипЦен);
	 
     РезультатЗапроса = Запрос.Выполнить();
     Выборка = РезультатЗапроса.Выбрать();
		Если Выборка.Следующий() тогда
    		 Возврат Выборка.Цена;
		Иначе
    	Возврат 0;
	КонецЕсли;
КонецФункции
Показать
20. GreenLab 84 11.11.12 16:03 Сейчас в теме
Если это табличная часть то нужно сначала получить номенклатуру в текущей строке.
Как вариант

СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
СтрокаТабличнойЧасти.ВыбЦен = ПолучитьЦенуНоменклатуры(СтрокаТабличнойЧасти.Номенклатура)

Ну как то так вроде
21. fruktik 11.11.12 16:49 Сейчас в теме
(20) GreenLab, хм, как я понял это должно писаться до ВыбЦен =
Но он же не знает еще про нее)
22. GreenLab 84 11.11.12 18:47 Сейчас в теме
(21) fruktik, Если нужно просто получить цену то тогда просто

СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
ВыбЦен = ПолучитьЦенуНоменклатуры(СтрокаТабличнойЧасти.Номенклатура) 


Суть ошибки в том, что обрабатывается событие изменения значения в поле табличной части.
При этом непонятно по какому именно значению номенклатуры должна быть получена цена.
Нужно в функцию передать выбранное в текущей строке значение номенклатуры, к которому можно получить доступ через ЭлементыФормы.Товары.ТекущиеДанные
собственно в коде это реализуется так:

Процедура ТоварыНоменклатураПриИзменении(Элемент)

  СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
  ВыбЦен = ПолучитьЦенуНоменклатуры(СтрокаТабличнойЧасти.Номенклатура) 
 

...
23. fruktik 13.11.12 09:26 Сейчас в теме
(22) GreenLab, Теперь говорит следующее
Значение не является значением объектного типа (Следующий)
Если ВыбЦен.Следующий() Тогда
25. GreenLab 84 13.11.12 11:16 Сейчас в теме
(23) fruktik, Вот рабочий вариант

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



Процедура ТоварыНоменклатураПриИзменении(Элемент)

СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
Цена = ПолучитьЦенуНоменклатуры(СтрокаТабличнойЧасти.Номенклатура)
Показать
26. Sevens 6 13.11.12 11:16 Сейчас в теме
(23) fruktik, по тому что вы получаете всего 1 цену, которая соответствует текущей номенклатуре в строке.
(24) fruktik, без Добавить.\

СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные; 
ВыбЦен = ПолучитьЦенуНоменклатуры(СтрокаТабличнойЧасти.Номенклатура) 
СтрокаТабличнойЧасти.Цена = ВыбЦен;
27. fruktik 13.11.12 11:28 Сейчас в теме
(26) Sevens, ага с этим я уже разобрался) а вот как мне сделать. на форме есть кнопка которая добавляет строку в ТЧ и открывает справочник номенклатуры, выбранное значение вставляет в ТЧ?
28. Sevens 6 13.11.12 11:33 Сейчас в теме
(27) fruktik, Не совсем понял. На форме есть кнопка которая добавляет новую строку и открывает справочник номенклатуры. и? что надо то?)
24. fruktik 13.11.12 10:12 Сейчас в теме
С такой конструкцией он создает новую строку в которую и вставляет цену, а как чтобы в эту же строку вставить?

		ЦенТов = Товары.Добавить();
		ЦенТов.Цена = ВыбЦен;
29. fruktik 13.11.12 11:39 Сейчас в теме
выбрал товар, и он добавился в строку табличной части)
30. Sevens 6 13.11.12 11:46 Сейчас в теме
Если это стандартная кнопка, то она просто добавляет строку, а уже в строке ты добавляешь номенклатуру и прочее.
Если это твоя кнопка, то при нажатии опиши процесс создания строки:
Новаястрока = Товары.Добавить();
После чего вызови форму выбора номенклатуры и заполни значение НоваяСтрока.Номенклатура
31. fruktik 13.11.12 12:19 Сейчас в теме
(30) Sevens, ну вот так написал и ничего
	НоваяСтрока = Товары.Добавить();
	Нов = Справочники.Номенклатура;
	ФормаСписка = Нов.ПолучитьФормуВыбора();
	Если Не ФормаСписка.Открыта() Тогда
		ФормаСписка.Открыть();
	КонецЕсли;
        НоваяСтрока.Номенклатура = Справочники.Номенклатура.Выбрать();	
Показать
32. hrom15 8 08.01.19 21:28 Сейчас в теме
Функция ПолучитьЦенуНоменклатуры(Номенклатура)
 Дата = ТекущаяДата();	
	Запрос = Новый Запрос; 
Запрос.Текст = 
"ВЫБРАТЬ 
|ЦеныНоменклатуры.Цена 
|ИЗ 
|РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,Номенклатура = &Номенклатура ) КАК ЦеныНоменклатуры 
|СГРУППИРОВАТЬ ПО 
|ЦеныНоменклатуры.Цена"; 
//Параметры запроса 
Запрос.УстановитьПараметр("Дата",Дата);// Дата 
Запрос.УстановитьПараметр("Номенклатура",Номенклатура);// Номенклатура 
//Запрос.УстановитьПараметр("ТипЦен",Справочники.ВидыЦен);// Типы цен номенклатуры 
ЦеныНоменклатуры = Запрос.Выполнить().Выгрузить(); 
Если ЦеныНоменклатуры.Количество()<>0 Тогда 
Возврат ЦеныНоменклатуры[0].Цена 
Иначе 
Возврат 0; 
КонецЕсли; 

КонецФункции
Показать

ВОТ РАБОЧИЙ ВАРИАНТ
33. resonance 83 30.03.20 13:48 Сейчас в теме
Спасибо очень помогли
34. vi100k 7 06.08.21 08:13 Сейчас в теме
ВОТ РАБОЧИЙ ВАРИАНТ С ОТБОРОМ ПО КОЛОНКЕ ЦЕНЫ
Функция ПолучитьЦенуНоменклатуры(Номенклатура) Экспорт
	Дата = ТекущаяДата();    
	Запрос = Новый Запрос; 
	Запрос.Текст = 
	"ВЫБРАТЬ 
	|ЦеныНоменклатуры.Цена 
	|ИЗ 
	|РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,Номенклатура = &Номенклатура и ВидЦен = &ТипЦен) КАК ЦеныНоменклатуры 
	|СГРУППИРОВАТЬ ПО 
	|ЦеныНоменклатуры.Цена"; 
	//Параметры запроса 
	Запрос.УстановитьПараметр("Дата",Дата);// Дата 
	Запрос.УстановитьПараметр("Номенклатура",Номенклатура);// Номенклатура 
	Запрос.УстановитьПараметр("ТипЦен", ТипЦены);// Типы цен номенклатуры 
	
	ЦеныНоменклатуры = Запрос.Выполнить().Выгрузить();
	Если ЦеныНоменклатуры.Количество()<>0 Тогда
		Возврат ЦеныНоменклатуры[0].Цена; 
	Иначе 
		Возврат 0; 
	КонецЕсли; 
	
КонецФункции
Показать
Оставьте свое сообщение

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