Имя: Пароль:
1C
1С v8
v8: как получить цену номенклатуры.
,
0 ivansmirnov
 
22.12.13
12:03
Есть печатная форма. Заказа покупателя. Нужно получить тип цен "Розница" у выбранной номенклатуры.
Делаю так
1 ivansmirnov
 
22.12.13
12:03
ТипЦен  = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розница");
        РозницаЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Товар,ТипЦен,ТекущаяДата(), , , , ,);
        ОбластьМакета.Параметры.ПечРозницаЦена =РозницаЦена;
2 ivansmirnov
 
22.12.13
12:04
Но выводит сообщение при выводе печатной формы.


Не удалось сформировать внешнюю печатную форму!
Значение не является значением объектного типа (Рассчитывается)


Подскажите. Я не совсем еще разбираюсь в тонкостях 1с.
3 MKZM
 
22.12.13
12:05
Запросом
4 Wobland
 
22.12.13
12:13
(3) будет то же самое
(2) убедись, что тип нашёлся. и потом запросом, да
5 MKZM
 
22.12.13
12:18
(4) Так по запросу станет ясно, нашел или нет. Без ошибки.
6 Wobland
 
22.12.13
12:19
(5) убедил ;)
7 ДенисЧ
 
22.12.13
12:20
приведенный код и сообщение об ошибке не кореллируют.
8 MKZM
 
22.12.13
12:21
(7) Я тоже так подумал.
9 ivansmirnov
 
22.12.13
12:24
Вы можете по подробнее мне сказать что посмотреть. То есть где именно я не правильно пишу. Печатная форма же стандартная, я только добавил в макет параметр и пытаюсь вывести туда розничную цену номенклатуры.
10 Wobland
 
22.12.13
12:25
(9) посмотри, что возвращает НайтиПоНаименованию
11 Wobland
 
22.12.13
12:26
(7) (8) всё там коррелирует. человек пустую ссылку отдаёт
12 ivansmirnov
 
22.12.13
12:31
(11) Скажи, что мне сделать? Как это исправить?
13 Wobland
 
22.12.13
12:32
(12) посмотри, что возвращает НайтиПоНаименованию и подумай
14 ivansmirnov
 
22.12.13
12:33
Я ставлю точку останова, на строке ТипЦен  = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розница");

Но отладчик не останавливается. Выводит сообщение в низу и все.
15 zmaximka
 
22.12.13
12:35
сделай у обработки форму. добавь реквизит СсылкаНаОбъект нужного типа. В форме вызывай процедуру печать() и отлаживай
16 Wobland
 
22.12.13
12:37
бывает, что попытка деления на ноль и остановка об ошибке помогают обойтись без (15)
17 zmaximka
 
22.12.13
12:40
ну да. велосипед и костылей тоже иногда ездит
18 Tateossian
 
22.12.13
12:41
У тебя нет объекта Рассчитывается - тип цены тут не причем.
19 zmaximka
 
22.12.13
12:43
подозреваю что "Расчитывается" это реквизит справочника ТипЦен и ошибка возникает в Ценообразование.ПолучитьЦенуНоменклатуры
т.к. цена по наименованию не найдена
20 ivansmirnov
 
22.12.13
13:58
(19) Начал отлаживать. Тип цен находит, и значение = Роздничные. Программа находит по наименованию тип цены.
21 ivansmirnov
 
22.12.13
14:02
{ОбщийМодуль.Ценообразование.Модуль(667)}: Значение не является значением объектного типа (Рассчитывается)
        Если ТипЦен.Рассчитывается Тогда // надо достать цену базового типа и рассчитать по наценке
22 ivansmirnov
 
22.12.13
14:03
вот какая возникла ошибка.
23 ivansmirnov
 
22.12.13
14:04
У меня тип цен не расчетный. Это как-то можно обойти?
24 Wobland
 
22.12.13
14:19
(21) а вот бы была такая штука, которая позволила бы узнать значение и тип переменной в момент исполнения. было бы здорово, правда?
25 ivansmirnov
 
22.12.13
14:26
Я нашел в чем проблема.

ОбластьМакета.Параметры.ПечРозницаЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Товар,ВыборкаТоваров.ХарактеристикаНоменклатуры,ТипЦен,ТекущаяДата(), ВыборкаТоваров.ЕдиницаИзмерения,
                                        Константы.ВалютаРегламентированногоУчета.Получить(), 1, 1, , , );
26 ivansmirnov
 
22.12.13
14:26
ВыборкаТоваров.ХарактеристикаНоменклатуры = неопределено.

Но без этого параметра мне кажется ПолучитьЦенуНоменклатуры не работает
27 Wobland
 
22.12.13
14:29
(26) держусь другого мнения, но тебе там виднее
28 Wobland
 
22.12.13
14:29
а теперь посмотри, как взрослые товарищи передают тип цен туда, и сравни со своим способом
29 ivansmirnov
 
22.12.13
14:31
(28) Где именно посмотреть? Не воспринимайте мои слова как шутка, я просто неделю как начал изучать 1с
30 Wobland
 
22.12.13
14:33
раз:
Ценообразование.ПолучитьЦенуНоменклатуры(Товар,ТипЦен,ТекущаяДата(), , , , ,);
два:
Ценообразование.ПолучитьЦенуНоменклатуры(Товар,ВыборкаТоваров.ХарактеристикаНоменклатуры,ТипЦен,ТекущаяДата(), ВыборкаТоваров.ЕдиницаИзмерения,
                                        Константы.ВалютаРегламентированногоУчета.Получить(), 1, 1, , , );

найди различия
31 ivansmirnov
 
22.12.13
14:37
И тот и тот мой куски кода, пробовал в слепую. В интернете смотрю как советуют..
32 ivansmirnov
 
22.12.13
14:38
Мне бы как правильно узнать.
33 Sorm
 
22.12.13
14:49
(0) Запросом к регистру.
34 ivansmirnov
 
22.12.13
14:55
Я не понимаю...Как вообще работает эта функция...Одни пишут

Ценообразование.ПолучитьЦенуНоменклатуры(ТекНоменклатура,,ТипЦенЗакупочная);

другие

Ценообразование.ПолучитьЦенуНоменклатуры(Товар,, ТипЦены, ДатаФормирЦен, ЕдиницаЦены, ВалютаЦены);
35 ivansmirnov
 
22.12.13
14:56
Ни тоне другое не работает..
У меня передаются все параметры..
Но в итоге ни чего не возвращает кроме 0
36 Wobland
 
22.12.13
15:02
а сходить в функцию и посмотреть, как там внутре?
37 ivansmirnov
 
22.12.13
15:04
Хреново там:) для меня не понятно
38 Wobland
 
22.12.13
15:07
ну тогда ищи разницу
39 ivansmirnov
 
22.12.13
15:07
Мне не понятно почему  Ценообразование.ПолучитьЦенуНоменклатуры(Товар,,ТипЦен)

Значение выражения  = 0
40 Wobland
 
22.12.13
15:08
(39) такова природа этой функции, её работа. иногда она говорит 0
41 ivansmirnov
 
22.12.13
15:08
(40) получается что всегда
42 Sorm
 
22.12.13
15:09
(40) "Такова природа зла..."(с)
43 Wobland
 
22.12.13
15:09
(41) не всегда, а при том состоянии БД и комплекта передаваемых параметов, которые ты пробовал
44 ivansmirnov
 
22.12.13
15:11
(43) Подскажи, что мне сделать? Как мне все таки получить цену номенклатуры?
45 Sorm
 
22.12.13
15:11
(41) Сходи "Операции-РегистрСведений-ЦеныНоменклатуры". Посмотри, если ли там такая цена.
46 ivansmirnov
 
22.12.13
15:12
Да, есть.
47 ivansmirnov
 
22.12.13
15:13
ОбластьМакета.Параметры.ПечДилерскаяЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Товар,,ТипЦен,ТекущаяДата(),ВыборкаТоваров.ЕдиницаИзмерения,Константы.ВалютаРегламентированногоУчета.Получить());
48 Wobland
 
22.12.13
15:14
(44) много думать
(47) поздравлять?
49 ivansmirnov
 
22.12.13
15:15
Все параметры мне правильно выдает:

Товар = Товар
ТипЦен = Розничная
ТекущаяДата() = 22.12.2013
ВыборкаТоваров.ЕдиницаИзмерения    = шт    
Константы.ВалютаРегламентированногоУчета.Получить() =    руб
50 ivansmirnov
 
22.12.13
15:16
А в итоге 0
51 Wobland
 
22.12.13
15:17
что, шайтан-вьюер будем подключать или до сотни постов одно и то же перетирать?
52 ivansmirnov
 
22.12.13
15:18
Я могу обработку скинуть.
53 ivansmirnov
 
22.12.13
15:19
Но мне главное самому разобраться.
54 Мимохожий Однако
 
22.12.13
15:21
Поставь остановку внутри функции ПолучитьЦенуНоменклатуры() и посмотри как там и что.
55 Wobland
 
22.12.13
15:22
у меня даж платформа не стоит. не говоря уж о том, что нет конфигурации с такой функцией
(54) там скрежет зубовный и тьма кромешная
56 Мимохожий Однако
 
22.12.13
15:23
(55)это не имеет значения. Иногда достаточно увидеть параметры на входе.
57 ivansmirnov
 
22.12.13
15:32
(56) Могу и я скинуть печатную форму, потом у что я вообще не понимаю, где мне искать причину по которой не выводится цена.
58 Мимохожий Однако
 
22.12.13
15:36
Хочешь научиться сам - научись включать отладчик.
Для старта, чтобы убедиться, что выводится в нужном месте пропиши
//ТипЦен  = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розница");
        //РозницаЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Товар,ТипЦен,ТекущаяДата(), , , , ,);
ОбластьМакета.Параметры.ПечРозницаЦена = 10500!;// РозницаЦена;
а при успехе вернись к своему коду и найди функцию ПолучитьЦенуНоменклатуры()
остальное я уже сказал
59 ivansmirnov
 
22.12.13
15:48
1) ВЫводится 1050 - значит при выводе все нормально!!!!! Ура!
2) Может нужно  использовать ЦеныНоменклатурыСрезПоследних ?
60 ivansmirnov
 
22.12.13
15:50
2) не это какой-то бред
61 Wobland
 
22.12.13
15:52
(59) 1050? должно быть 10500! что-то здесь странное
62 ivansmirnov
 
22.12.13
15:52
не дописал просто 10500, все верно вывелось
63 Wobland
 
22.12.13
15:55
можно ещё понедельника подождать. набегут те, у кого такая функция есть или те, у кого телепатические способности повышены
64 ivansmirnov
 
22.12.13
15:58
Ну что мне сделать? Уже крик души.

У меня есть тип цен..У меня все параметры прописаны, кроме характеристики, и ни чего не получается вывести.

Подскажите, как вообще тогда в 1с можно по названию номенклатуры находить его базовую ценую
65 Мимохожий Однако
 
22.12.13
15:58
функцию нашел? Отладчиков в начало функции встал? Отладчик запустил?
66 ivansmirnov
 
22.12.13
16:00
Запускаю
67 Sorm
 
22.12.13
16:01
(64) Ещё раз говорю, зайди в регистр цен номенклатуры и глазами посмотреть - есть цена с таким типом цен на дату или нет.
68 ivansmirnov
 
22.12.13
16:01
Поставил останово на Функция ПолучитьЦенуНоменклатуры

но после запуска отладчика точка перескочила ниже на

Если ЕдиницаИзмерения = Неопределено Тогда
        ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.ПустаяСсылка(); // для услуг
    КонецЕсли;


Это нормально?
69 hhhh
 
22.12.13
16:03
бывает. еще раз поставь точку останова
70 Мимохожий Однако
 
22.12.13
16:03
Нормально.Встала на ближайшую. Теперь смотри каждый параметр через F9
71 ivansmirnov
 
22.12.13
16:08
Номенклатура    "Товар"    Строка
ХарактеристикаНоменклатуры        Неопределено
ТипЦен    Розничная    СправочникСсылка.ТипыЦенНоменклатуры
ДатаПараметр    22.12.2013 16:04:39    Дата
ЕдиницаИзмерения    шт    СправочникСсылка.ЕдиницыИзмерения
Валюта    руб.    СправочникСсылка.Валюты
Курс    0    Число
Кратность    1    Число
ПроцентСкидкиНаценки    0    Число
ДоговорКонтрагента        Неопределено
УсловиеПродаж        Неопределено


Это все параметры..А выглядит функция вот так вот:

Функция ПолучитьЦенуНоменклатуры(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Знач ТипЦен, ДатаПараметр = Неопределено, ЕдиницаИзмерения = Неопределено,
                                 Валюта = Неопределено, Курс = 0, Кратность = 1, ПроцентСкидкиНаценки = 0, ДоговорКонтрагента = Неопределено,
                                 УсловиеПродаж = Неопределено) Экспорт
72 ivansmirnov
 
22.12.13
16:10
(67) я сделала заказ выбрал номенклатуру цены поставились. значит они есть в регистре.
73 Wobland
 
22.12.13
16:10
Номенклатура    "Товар"    Строка
74 Мимохожий Однако
 
22.12.13
16:10
Расшифруй:
Номенклатура    "Товар"    Строка
в параметр Номенклатура должна попадать ссылка на справочник Номенклатура
75 ivansmirnov
 
22.12.13
16:12
(74) выводит название номенклатуры = Товар
76 Wobland
 
22.12.13
16:12
а прикольно, если автор написал Товар="вот этот";
77 Wobland
 
22.12.13
16:13
(75) а сам товар куда дел?
78 Мимохожий Однако
 
22.12.13
16:13
Вместо Товар ищи переменную, в которой есть тип СправочникСсылка.Номенклатура
79 ivansmirnov
 
22.12.13
16:13
не понял..Выводится что-то не то?
80 Wobland
 
22.12.13
16:14
(79) да!
81 Мимохожий Однако
 
22.12.13
16:14
Повторяю:Ошибка в 1 параметре функции
82 Sorm
 
22.12.13
16:15
(80) Может уже ammyy admin?... Так, в порядке бреда...
83 ivansmirnov
 
22.12.13
16:16
Вместо Товар ищи переменную, в которой есть тип СправочникСсылка.Номенклатура


Смотрю в отладчике...вообще я не уверен что найду, но попробую
84 Wobland
 
22.12.13
16:16
(82) я ему уже предложил
85 Sorm
 
22.12.13
16:17
(84) Я не понял, честно сказать - он это или она..
86 Мимохожий Однако
 
22.12.13
16:17
Искать надо до входа в функцию внутри внешней печатной формы
87 Wobland
 
22.12.13
16:18
(85) ну опечатался человек. всего лишь один разок ;)
88 Sorm
 
22.12.13
16:19
(83) Коллеги и я тебе предлагают - запусти ammyy admin, если уж "крик души" и не трать зря наши и свои силы...
89 ivansmirnov
 
22.12.13
16:25
да бред полный..Я раньше на С программировал. Закончил вуз, город не большой, предложили устроиться программистом 1с, сказали что объектно ориентированный язык, все просто. Но вижу столько же здесь тонкостей.

http://files.mail.ru/69BE8C3420244AF2A04FE5B7BADC99AD

Я выложил файл..Буду признателен если поможете.

Еще что почитать или где набраться опыта в решении таких задач?
90 Wobland
 
22.12.13
16:29
Радченко - традиционный букварь
91 ivansmirnov
 
22.12.13
16:31
1С:Предприятие 8.2. Практическое пособие разработчика? Хорошо, я посмотрю.
92 Wobland
 
22.12.13
16:32
оно, да. давайте уже сотню сделаем, да я пойду
93 MKZM
 
22.12.13
16:36
100
94 Wobland
 
22.12.13
16:37
101
95 Sorm
 
22.12.13
16:39
"Ну что мне сделать? Уже крик души."  и  "Практическое пособие разработчика? Хорошо, я посмотрю." : видать - отлегло.
96 ivansmirnov
 
22.12.13
16:41
(96) нет, сижу разбираюсь.
97 ivansmirnov
 
22.12.13
16:47
я просто не думал, что так сложно вывести в печатную форму по умолчанию определенную цену номенклатуры.
98 Wobland
 
22.12.13
16:48
4.5 часа. что ж я такого делал за 4.5 часа? вспомнил! 4 экзаменационных билета (как раз на полчаса раньше ушёл). но за качество такой работы мне было бы стыдно, если б не ограничения
99 hhhh
 
22.12.13
16:54
(97) получайте цены запросом. У вас же есть запрос там. В него вставить строчки про цены.

А так как вы: для каждой строчки вызываете эту дебильную функцию - это вас сразу надо расстрелять. А то вдруг действительно пролезете в 1с-ники.
100 Wobland
 
22.12.13
16:54
СТО
101 Sorm
 
22.12.13
16:55
(100) Иди домой!(с)
102 Мимохожий Однако
 
22.12.13
17:46
Ого, за соточку прыгнули...))

Если не бороться за качество Тогда
.
(89)РозницаЦена = Ценообразование.ПолучитьЦенуНоменклатуры(ВыборкаТоваров.ЕдиницаИзмерения.Владелец,ТипЦен,ТекущаяДата(), , , , ,);
..........
Но правильнее конечно во втором запросе к таблице товаров добавить левое соединение из регистра сведений ЦеныНоменклатуры..
Но это в следующем уроке.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший