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

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

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

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


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

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

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        Возврат ВыборкаДетальныеЗаписи.Цена
      КонецЦикла;
    КонецЕсли;    
КонецФункции
23 dezss
 
12.04.19
17:18
(22) А если ВыборкаДетальныеЗаписи.Количество() = 0, то что какое значение вернет функция?
24 стажер
 
12.04.19
17:25
(23)пустоту наверное
25 dezss
 
12.04.19
17:29
(24) И это некорректное поведение.
К тому же.
Зачем цикл, если у тебя всегда будет возвращаться только первый элемент выборки.
Делай просто

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи.Цена;
Иначе
    Возврат 0;
КонецЕсли;
26 Джинн
 
12.04.19
17:34
Кошернее проверять по Выборка.Количество()
27 Джинн
 
12.04.19
17:35
Ну или РезультатЗапроса.Пустой()
28 Fish
 
12.04.19
17:35
(26) Чем кошернее? Всё равно придётся делать Выборка.Следующий(), если не пустой или кол-во больше нуля.
29 стажер
 
12.04.19
17:46
все, сделал максимально кошерно, а как сделать чтоб цены то подставлялись?))
30 sqr4
 
12.04.19
17:47
(28) в зависимости от количества записей что вернет запрос наверно РезультатЗапроса.Пустой(), я правильно думаю?
31 sqr4
 
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
никто не знает?
36 Garykom
 
гуру
13.04.19
23:34
Вместо
//|    И ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = &Закупочная";
Сделать
|    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";

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

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

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

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