|
Подставить цену в документ из регистра накоплений | ☑ | ||
---|---|---|---|---|
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
|
ОФФ: А мне понравился заголовок сабжа. Заманивает. Жаль, что внутри совсем другое.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |