Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Подставить цену в документ из регистра накоплений

Подставить цену в документ из регистра накоплений
Я
   стажер
 
12.04.19 - 15:10
Добрый день. Подскажите где ошибка в коде. Пытаюсь из регистра сведений взять цены и вставить в документ инвентаризация при его изменении.

&НаКлиенте
Процедура ТабличнаяЧасть1НоменклатураПриИзменении(Элемент)
   ТекСтрока = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
   ТекСтрока.Цена = ПолучитьЦенуНаСервере(ТекСтрока.Номенклатура);
   //ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

&НаСервере
Функция ПолучитьЦенуНаСервере(Номенклатура)
    ЦенаОтбор = Новый Структура;
    ЦенаОтбор.Вставить("Номенклатура", Номенклатура);
    Данные = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее( , ЦенаОтбор);
    Возврат Данные.Цена;
КонецФункции
 
 
   стажер
 
1 - 12.04.19 - 15:13
{Документ.Инвентаризация.Форма.ФормаДокумента.Форма(42)}: Значение не является значением объектного типа (Цена)
    Возврат Данные.Цена;
   Джинн
 
2 - 12.04.19 - 15:15
А с чего Вы решили, что в Данные что-то есть?
   piter3
 
3 - 12.04.19 - 15:16
Регистр пуст или по твоей ном-ре нет данных
   стажер
 
4 - 12.04.19 - 15:20
(3)регистр проверил, с записями
   sqr4
 
5 - 12.04.19 - 15:24
(4) типы проверяй. В любом случае получить последнее как я понимаю возвращает пустую структуру и это нужно проверять
   стажер
 
6 - 12.04.19 - 15:24
(2)а как правильно?


&НаКлиенте
Процедура ТабличнаяЧасть1НоменклатураПриИзменении(Элемент)
ТекДанные = ЭтаФорма. Элементы. ТабличнаяЧасть1. ТекущиеДанные;
ТекДанные.Цена = ПолучитьЦенуНоменклатуры (ТекДанные. Номенклатура); 
КонецПроцедуры

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

Запрос. УстановитьПараметр ("Дата", ?(ЗначениеЗаполнено (Объект. Дата), Объект. Дата, ТекущаяДата ()));
Запрос. УстановитьПараметр ("Номенклатура", НоменклатураСсылка);

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

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

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

Возврат 0;
КонецФункции

так тоже не работает((
   стажер
 
7 - 12.04.19 - 15:25
такая ошибка:
{Документ.Инвентаризация.Форма.ФормаДокумента.Форма(64)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос. Выполнить ();
по причине:
{(2, 32)}: Ожидается выражение "("
ЦеныНоменклатурыСрезПоследних. <<?>>Цена
   Mankubus
 
8 - 12.04.19 - 15:26
(7) правильно запросом сделать
   sqr4
 
9 - 12.04.19 - 15:27
(6) ЦеныНоменклатурыСрезПоследних. Цена а нахер тут пробел после точки?
   Mankubus
 
10 - 12.04.19 - 15:27
+ конструктором запроса а не вручную
   dezss
 
11 - 12.04.19 - 15:28
(7) а пробел нафига?
   dezss
 
12 - 12.04.19 - 15:29
Вообще нафига ты в коде и запросе после точек пробелы рисуешь?
   dezss
 
13 - 12.04.19 - 15:30
(12) + И перед скобками...вообще мрак.
   стажер
 
14 - 12.04.19 - 15:49
А так тоже не работает((

&НаКлиенте
Процедура ТабличнаяЧасть1НоменклатураПриИзменении(Элемент)
ТекДанные = ЭтаФорма. Элементы. ТабличнаяЧасть1. ТекущиеДанные;
ТекДанные.Цена = ПолучитьЦенуНоменклатуры (ТекДанные. Номенклатура); 
КонецПроцедуры


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

    КонецЦикла;

КонецФункции
   piter3
 
15 - 12.04.19 - 15:51
Отбор в запросе где?
   Джинн
 
16 - 12.04.19 - 15:51
(14) Функция, ничего не возвращающая? :)
   стажер
 
17 - 12.04.19 - 15:56
Точно!) Спасибо!

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

    КонецЦикла;
    Возврат ВыборкаДетальныеЗаписи.Цена
КонецФункции
   piter3
 
18 - 12.04.19 - 15:58
ОТБОР.ОТБОР.ОТБОР.
   hhhh
 
19 - 12.04.19 - 15:59
(17) весь справочник Номенклатура возвращаешь? А если там 1000000 номенклатур?
   Джинн
 
20 - 12.04.19 - 16:01
(17) К отбору еще и проверять нужно выборку данных, иначе в ВыборкаДетальныеЗаписи. Может она пустая.
   dezss
 
21 - 12.04.19 - 17:14
(17) А тебя вот это не наводит на мысли?
// Вставить обработку выборки ВыборкаДетальныеЗаписи
   стажер
 
22 - 12.04.19 - 17:15
(21) заметил :-))

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи

        Возврат ВыборкаДетальныеЗаписи.Цена
      КонецЦикла;
    КонецЕсли;    
КонецФункции
   dezss
 
23 - 12.04.19 - 17:18
(22) А если ВыборкаДетальныеЗаписи.Количество() = 0, то что какое значение вернет функция?
   стажер
 
24 - 12.04.19 - 17:25
(23)пустоту наверное
   dezss
 
25 - 12.04.19 - 17:29
(24) И это некорректное поведение.
К тому же.
Зачем цикл, если у тебя всегда будет возвращаться только первый элемент выборки.
Делай просто
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи.Цена;
Иначе
    Возврат 0;
КонецЕсли;
   Джинн
 
26 - 12.04.19 - 17:34
Кошернее проверять по Выборка.Количество()
   Джинн
 
27 - 12.04.19 - 17:35
Ну или РезультатЗапроса.Пустой()
   Fish
 
28 - 12.04.19 - 17:35
(26) Чем кошернее? Всё равно придётся делать Выборка.Следующий(), если не пустой или кол-во больше нуля.
   стажер
 
29 - 12.04.19 - 17:46
все, сделал максимально кошерно, а как сделать чтоб цены то подставлялись?))
   sqr4
 
30 - 12.04.19 - 17:47
(28) в зависимости от количества записей что вернет запрос наверно РезультатЗапроса.Пустой(), я правильно думаю?
 
 
   sqr4
 
31 - 12.04.19 - 17:47
Хотя в данном случает, пофик, тут одна или ноль
   Джинн
 
32 - 12.04.19 - 17:54
(28) А чтобы не лезть в выборку, которая и так пустая. Для красоты.
   стажер
 
33 - 13.04.19 - 22:03
Помогите сделать отбор по типу цен (нужна закупочная цена). ТипЦен справочник, а не перечисление
   стажер
 
34 - 13.04.19 - 22:03
&НаСервере
Функция ПолучитьЦенуНоменклатуры (НоменклатураСсылка)
    
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    // Данный фрагмент построен конструктором.

    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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


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

    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
         Возврат ВыборкаДетальныеЗаписи.Цена;
    Иначе
         Возврат 0;
    КонецЕсли;
      
КонецФункции
   стажер
 
35 - 13.04.19 - 23:27
никто не знает?
   Garykom
 
36 - 13.04.19 - 23:34
Вместо
//|    И ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = &Закупочная";

Сделать
|    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";

Уже пробовал?
   Garykom
 
37 - 13.04.19 - 23:36
А вот тут перед
//Запрос.УстановитьПараметр("ТипЦен", ТипЦен.Закупочная);

Уже ищи по наименованию например так
ТипЦенЗакупочная = Справочники.ТипЦен.НайтиПоНаименованию("Закупочная");
И
Запрос.УстановитьПараметр("ТипЦен", ТипЦенЗакупочная);
   стажер
 
38 - 13.04.19 - 23:51
Да,  пробовал, выходит такое:
{Документ.Инвентаризация.Форма.ФормаДокумента.Форма(61)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос.Выполнить();
по причине:
{(9, 43)}: Не задано значение параметра "ТипЦен"
И ЦеныНоменклатурыСрезПоследних.ТипЦен = <<?>>&ТипЦен
   стажер
 
39 - 13.04.19 - 23:52
И так пробовал:

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

//Запрос.УстановитьПараметр(Справочники.ТипЦен.найтипонаименованию("закупочная"));
//Запрос.УстановитьПараметр("ТипЦен", ТипЦен.Наименование = ""Закупочная"");
   Garykom
 
40 - 13.04.19 - 23:54
(39) Ты издеваешься?

Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипЦен.найтипонаименованию("закупочная"));

Но сначала лучше получить в переменную и ТипЦенЗакупочная и проверить что ссылка не пустая, что нашло то что надо.
Если не нашло то пишем ошибку "Не нашли ТипЦен по наименованию Закупочная!" и прерываем
   стажер
 
41 - 13.04.19 - 23:59
(40) конечно нет, 
я просто не понимаю, почему не работает
   Garykom
 
42 - 14.04.19 - 00:03
(41) Потому что книжки читать надо. И не просто читать а понимать что там написано и зачем.
   стажер
 
43 - 14.04.19 - 00:04
Ты прав! работает.
   Garykom
 
44 - 14.04.19 - 00:05
Если бы стать программистом было легко и просто после небольшого обучения в пару месяцев - давно уже все таксисты в 1Сники бы подались.
   МимохожийОднако
 
45 - 14.04.19 - 09:33
ОФФ: А мне понравился заголовок сабжа. Заманивает. Жаль, что внутри совсем другое.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.