|
Прошу помощи найти ошибки в коде. | ☑ | ||
---|---|---|---|---|
0
Вопросуменя
10.08.22
✎
12:19
|
Прошу прощения Администраторов. В неправильном оформлении темы. Суть такова: В коде ошибки и нерациональное описание кода. По возможности описать логичный код. P/S Глаз за мылился,2 сутки без сна.
&НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Если Контрагент <> Справочники.Контрагенты.ПустаяСсылка() Тогда ЦенаСУчетомСкидки=0; Если ОбъемЗакупки.Количество() > 0 Тогда СуммаЗакупки = ОбъемЗакупки[0].Сумма; Если СуммаЗакупки >= 20000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(2, 20000); ИначеЕсли СуммаЗакупки >= 10000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(1, 10000); ИначеЕсли СуммаЗакупки >= 5000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(2, 5000); ИначеЕсли СуммаЗакупки >= 3000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(3, 3000); ИначеЕсли СуммаЗакупки >= 1000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(1, 1000); Иначе РазмерСкидки = ПолучитьРазмерСкидкиПоРС(Контрагент); ЦенаСУчетомСкидки = РазмерСкидки*СуммаЗакупки; КонецЕсли; КонецЕсли; Если ЦенаСУчетомСкидки > 0 Тогда НачислитьСкидку(ЦенаСУчетомСкидки); Сообщить("У клиента с учетом скидки цена " + ЦенаСУчетомСкидки + " руб."); КонецЕсли; Иначе Сообщить("Перед записью выберите контрагента."); КонецЕсли; КонецПроцедуры &НаСервере Процедура НачислитьСкидку(РазмерСкидки) Для Каждого СтрокаТЧ Из Товары СтрокаДок.Цена = РазмерСкидки; КонецЦикла; КонецПроцедуры &НаСервере Функция ПолучитьРазмерСкидкиПоРС(Контрагент) Если НЕ ТекущийЗаказ.Пустая() Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | КоэффициентыКлиентовСрезПоследних.Коэффициент |ИЗ | РегистрСведений.КоэффициентыКлиентов.СрезПоследних(&ДатаКон, Контрагент = &Контрагент) КАК КоэффициентыКлиентовСрезПоследних |ГДЕ | НЕ КоэффициентыКлиентовСрезПоследних.ВидРасчета ЕСТЬ NULL "; Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("ДатаКон", НачалоМесяца(ТекущаяДата())); Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Возврат Выборка.Коэффициент; КонецЕсли; КонецЕсли; Возврат 0; КонецФункции &НаСервереБезКонтекста Функция ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки) Если Вариант=1 Тогда Коэффициент = 1; ИначеЕсли Вариант=2 Тогда Коэффициент = 0.9; КонецЕсли; Возврат Коэффициент*СуммаЗакупки; КонецФункции |
|||
1
PR
10.08.22
✎
12:22
|
А, ну вот, сразу стало понятнее
|
|||
2
lubitelxml
10.08.22
✎
12:23
|
(0) вот это можно и на клиенте сделать:
&НаСервере Процедура НачислитьСкидку(РазмерСкидки) Для Каждого СтрокаТЧ Из Товары СтрокаДок.Цена = РазмерСкидки; КонецЦикла; КонецПроцедуры |
|||
3
lubitelxml
10.08.22
✎
12:24
|
+(2) вот это тоже
&НаСервереБезКонтекста Функция ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки) Если Вариант=1 Тогда Коэффициент = 1; ИначеЕсли Вариант=2 Тогда Коэффициент = 0.9; КонецЕсли; Возврат Коэффициент*СуммаЗакупки; КонецФункции |
|||
4
Beduin
10.08.22
✎
12:24
|
А в чем прикол если сумма закупки меньше 1000 брать с какого-то регистра?
|
|||
5
Kobol
10.08.22
✎
12:25
|
ПолучитьРазмерСкидкиПоКоэффициенту(3, 3000) - Где 3 вариант?
|
|||
6
Skom2
10.08.22
✎
12:25
|
(0)
ПолучитьРазмерСкидкиПоКоэффициенту(3, 3000); У вас в функции ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки) не описан вариант = 3 |
|||
7
Кир Пластелинин
10.08.22
✎
12:26
|
"ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки)" и Возврат Коэффициент*СуммаЗакупки; - это не сумма скидки, это сумма с учетом скидки. иль там какая то особенная суммаЗакупки передается? ну и в конструкции "Если ИначеЕсли" должно быть еще "Иначе". а то вдруг прилетит вариант не равный ни 1, ни 2
|
|||
8
Вопросуменя
10.08.22
✎
12:27
|
Вставил код как есть, возможно что-то упущено в коде. Поэтому прошу Вас описать полный код. Чтобы лечь спать на 5 минут раньше) Ну и к карме + 100500
|
|||
9
Skom2
10.08.22
✎
12:28
|
(7) так он уже прилетает.
ИначеЕсли СуммаЗакупки >= 3000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(3, 3000); |
|||
10
Beduin
10.08.22
✎
12:28
|
(8) А, это не ты еще писал. Ну ловкач.
|
|||
11
Kassern
10.08.22
✎
12:28
|
(8) "Поэтому прошу Вас описать полный код" - а вот это уже наглость, вряд ли кто-то за вас тут весь код перепишет лаконично, максимум дадут советы, как это сделать.
|
|||
12
Garykom
гуру
10.08.22
✎
12:28
|
>Запрос.УстановитьПараметр("ДатаКон", НачалоМесяца(ТекущаяДата()));
Периодичность РС какая? |
|||
13
Вопросуменя
10.08.22
✎
12:29
|
В нашей работе сиди и разбирайся в чужом коде. ТЫЖ программист, ну почини чайник.
|
|||
14
Кир Пластелинин
10.08.22
✎
12:30
|
(9) а. точно) ну тогда лол
|
|||
15
Вопросуменя
10.08.22
✎
12:30
|
Прошу рассматривать это не как наглость, а как просьба о помощи. Если ваше время стоит денег могу оплатить (сил моих нету уже)
|
|||
16
Kassern
10.08.22
✎
12:31
|
(13) ПолучитьРазмерСкидкиПоРС(Контрагент); переписать , на ПолучитьРазмерСкидки(Контрагент,СуммаЗакупки)
Вот это сжечь: |
|||
17
Kassern
10.08.22
✎
12:31
|
Если СуммаЗакупки >= 20000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(2, 20000);
ИначеЕсли СуммаЗакупки >= 10000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(1, 10000); ИначеЕсли СуммаЗакупки >= 5000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(2, 5000); ИначеЕсли СуммаЗакупки >= 3000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(3, 3000); ИначеЕсли СуммаЗакупки >= 1000 Тогда ЦенаСУчетомСкидки = ПолучитьРазмерСкидкиПоКоэффициенту(1, 1000); |
|||
18
Kassern
10.08.22
✎
12:31
|
вместо этого завести таблицу соответствия скидок, может какой-нить регистр для этого и уже на него ссылаться
|
|||
19
Skom2
10.08.22
✎
12:33
|
(18) там сроки горят
|
|||
20
Kassern
10.08.22
✎
12:33
|
в этой же таблице попробовать учесть коэффициент
|
|||
21
Kassern
10.08.22
✎
12:34
|
(19) это не займет много времени, пока ТС писал дважды эту ветку, уже бы создал регистр и переписал этот блок. Значит не так сроки горят.
|
|||
22
Skom2
10.08.22
✎
12:34
|
(21) ты думаешь с такой квалификацией это не займет много времени?
|
|||
23
Skom2
10.08.22
✎
12:34
|
+(22) не в обиду (0)
|
|||
24
Kassern
10.08.22
✎
12:35
|
Вангую ТСу дали тестовое задание, вот и пыхтит теперь на собеседовании)
|
|||
25
Skom2
10.08.22
✎
12:36
|
(24) ))))
как посадить самолет, срочно! |
|||
26
Kassern
10.08.22
✎
12:36
|
(22) если займет, то ничего страшного, лучше сделать чуть дольше и правильно, чем потом по каждому чиху демонически обновлять конфу меняя коэффициенты и прочие условия скидок)
|
|||
27
Вопросуменя
10.08.22
✎
12:38
|
Вы ошибаетесь, параллельно сижу над интеграцией 1С и сайта на Tilda(интеграция через XML), чтобы чеки фискальные обратно приходили.
|
|||
28
Garykom
гуру
10.08.22
✎
12:40
|
(27) Лучше скажи как ты туда сумел устроиться?
|
|||
29
Krendel
10.08.22
✎
12:41
|
(28) Скорее работает бесплатно
|
|||
30
Вопросуменя
10.08.22
✎
12:41
|
Открою другую ветку и напишу об этом книгу в 2-х томах)
|
|||
31
Beduin
10.08.22
✎
12:42
|
(28) Скиллбокс сейчас пачками выпускает. Но есть нюанс.
|
|||
32
Skom2
10.08.22
✎
12:42
|
(30) а потом сиквел, приквел...
|
|||
33
Вопросуменя
10.08.22
✎
12:42
|
Так у меня еще есть задачи. У кого руки свободные, поделюсь )) Работаю за еду )))
|
|||
34
Вопросуменя
10.08.22
✎
12:44
|
Ребят, честно. Прошу помочь с кодом. Мне приятно с вами пообщаться, но цитата: Сон для слабаков не для меня. ))
|
|||
35
Bigbro
10.08.22
✎
13:02
|
(34) хоть бы анекдот рассказал смешной или еще какую байку.
а то на эту хрень что ты придумал... ну не ведется народ, все уже все это видели . |
|||
36
Вопросуменя
10.08.22
✎
13:04
|
Вам неугодить товарисчи. На пивко готов закинуть на счёт
|
|||
37
timurhv
10.08.22
✎
13:05
|
(2) Добавьте 99тыс строк и проверьте как быстро на клиенте отработает
|
|||
38
Bigbro
10.08.22
✎
13:07
|
(36) тут все за ЗОЖ, кому оно надо ваше пиво...
|
|||
39
Kassern
10.08.22
✎
13:08
|
(34) Так уж и быть...
&НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Если НеобходимоРассчитатьСкидки тогда СтукрутаПараметров = ПолучитьСтуктуруПараметровУстановкиСкидок(ЗаказКлиента) УстановитьСкидки(СтукрутаПараметров) КонецЕсли КонецПроцедуры |
|||
40
Kassern
10.08.22
✎
13:09
|
примерно так должен выглядеть ваш код)
|
|||
41
Greeen
10.08.22
✎
13:09
|
(34) Сударь, приветствую! Ну пару советов вам уже дали выше, ИМХО - что не работает то?
1) Вот тут, как написали выше, должен быть прописан для Вариант = 3 Коэффициент, какой должен быть коэффициент - без вашего ответа только к телепату ходить Функция ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки) Если Вариант=1 Тогда Коэффициент = 1; ИначеЕсли Вариант=2 Тогда Коэффициент = 0.9; КонецЕсли; Возврат Коэффициент*СуммаЗакупки; КонецФункции 2)Потом пишете следующую ошибку и на ней смотрим. Про нерациональный код потом уже, как поспите, поговорим.. |
|||
42
lubitelxml
10.08.22
✎
13:13
|
(37) все что можно сделать на клиенте - нужно делать на клиенте. 99тыс строк - неверно спроектированое хранение данных.
|
|||
43
Skom2
10.08.22
✎
13:14
|
(42) Расчет себестоимости в ЕРП тоже можно на клиенте сделать. А надо ли?
|
|||
44
lubitelxml
10.08.22
✎
13:16
|
(43) тут явно табличная часть документа, про много строк нигде не написано.
|
|||
45
Вопросуменя
10.08.22
✎
13:32
|
Kassern - тебе переводить ? )
|
|||
46
Kassern
10.08.22
✎
14:07
|
(45) мне не надо, купите лучше турку и сварите себе забористого кофейка. Вам это сейчас нужнее.
|
|||
47
timurhv
11.08.22
✎
13:40
|
(42) И безусловных вызовов сервера не будет? Что за бред пишете.
|
|||
48
lubitelxml
11.08.22
✎
13:48
|
(47) о чем вы? про какие конкретно безусловные вызовы вы пишите? Я пишу что в обычных ситуациях с точки зрения производительности чем меньше дергаешь сервер, тем лучше, особенно если высоконагруженная система. Если у вас 99тыс. строк - понятно что тут вопрос как лучше делать, но это лишь частный случай
|
|||
49
Fynjy
11.08.22
✎
14:10
|
Главная ошибка она сидите между стулом и клавиатурой. Иди в управдомы, тут уже ничего не исправить.
|
|||
50
rudnitskij
11.08.22
✎
16:53
|
(0) все это хрень, скидки обычно рассчитываются при вводе данных в форму (судя по "НаКлиенте" мы имеем дело с формой). В форме сделать реквизит для хранения коэф скидки для выбранного контрагента, при вводе данных в табчасть все пересчитывать с учетом ЗАРАНЕЕ полученного после выбора контрагента коэф скидок
А считать это перед записью - только серверные вызовы плодить. Один вызов - это вы получаете коэф скидок, второй - пишете цены со скидкой в ТЧ, третий - данные из формы для записи отправляются на сервер и все это внутри транзакции записи документа. Такие вещи могут работать без тормозов только если в базе работают не более 1-5 юзеров |
|||
51
ColonelAp4u
11.08.22
✎
17:29
|
(0) "ВЫБРАТЬ ПЕРВЫЕ 1
| КоэффициентыКлиентовСрезПоследних в срезе нет смысла выбирать первые 1 |
|||
52
rudnitskij
11.08.22
✎
17:34
|
(51) есть, если срез запросом - возвращает все записи с периодом меньше указанного в параметре. А если срез вызван в коде РегистрыСведений.МойРегистр.СрезПоследних(ПараметрыОтбора) - тут да, одна запись
|
|||
53
ColonelAp4u
11.08.22
✎
17:39
|
(52) ну если тут 1 измерение контрагент, то смысла в первые 1 нет, так как установлен отбор по измерению, и там будет 1 запись. если измерений много, то результат запроса будет в принципе не верный, так как нет сортировки хотя бы по периоду записи чтобы выбрать эту первую запись
|
|||
54
lodger
11.08.22
✎
17:39
|
(0) всё удалить и писать заново. получится красиво и лаконично.
|
|||
55
ColonelAp4u
11.08.22
✎
17:45
|
(0) так же для варианта 3 нет коэф следовательно функция вернет ошибку так как коэф не известная переменная
&НаСервереБезКонтекста Функция ПолучитьРазмерСкидкиПоКоэффициенту(Вариант,СуммаЗакупки) Если Вариант=1 Тогда Коэффициент = 1; ИначеЕсли Вариант=2 Тогда Коэффициент = 0.9; КонецЕсли; Возврат Коэффициент*СуммаЗакупки; КонецФункции |
|||
56
ColonelAp4u
11.08.22
✎
17:49
|
(0) ну и самая главная ошибка конечно тут, для расчета цены с учетом скидки ты берешь только сумму из первой строки, получаешь цену с учетом скидки именно для этой первой строки, а потом в процедуре применить скидки, устанавливаешь цену со скидкой для каждой строки из тч документа.
СуммаЗакупки = ОбъемЗакупки[0].Сумма; |
|||
57
ColonelAp4u
11.08.22
✎
17:51
|
(0) тут тоже СтрокаДок будет ошибка так как не известная переменная
&НаСервере Процедура НачислитьСкидку(РазмерСкидки) Для Каждого СтрокаТЧ Из Товары СтрокаДок.Цена = РазмерСкидки; КонецЦикла; КонецПроцедуры |
|||
58
ColonelAp4u
11.08.22
✎
17:52
|
В общем задание на внимательность
|
|||
59
rudnitskij
11.08.22
✎
17:56
|
(53) если явно не указывать порядок в запросе - оно как-то все равно отсортирует
"так как установлен отбор по измерению, и там будет 1 запись" - если по измерению с разными периодами несколько записей позже даты, указанной в параметре - их все и вернет |
|||
60
ColonelAp4u
11.08.22
✎
18:08
|
(59) "если по измерению с разными периодами несколько записей позже даты, указанной в параметре - их все и вернет" срез последних возвращает все на указанную дату, все что после тебе никогда не верне.
https://imgur.com/a/CPNjwM3 вот пример, напиши сам запрос такой в цены номенклатуры например, если отбор только по 1 измерению выведет срез всех записей на дату с отбором по этому 1 измерению, если добавить в отбор второе измерение тип цен то запись будет 1. |
|||
61
ColonelAp4u
11.08.22
✎
18:11
|
(60) а если сюда добавить выбрать первые 1 то выберет только 1 запись от 17.02.2015
|
|||
62
ColonelAp4u
11.08.22
✎
18:16
|
(59) вот ваше " оно как-то все равно отсортирует" и выберет нафиг не нужные данные
|
|||
63
Конструктор1С
11.08.22
✎
18:47
|
(2) можно, но не нужно. Обход ТЧ на клиенте означает, что вся ТЧ будет вытянута на клиент. Штатно отображается только порция данных ТЧ
|
|||
64
Конструктор1С
11.08.22
✎
18:50
|
А вообще, за такой код нужно по рукам хлестать. Бизнес-логика документа оказалась запрятана в форме документа. Понадобится программно работать с документом, и настанет упс! Полетят копипасты кода...
|
|||
65
rudnitskij
12.08.22
✎
10:28
|
(60) в самописной базе одного из клиентов измерение НОМЕНКЛАТУРА единственное, левое соединение списка номенклатур со срезом последних из списка цен возвращает вообще все записи позже даты параметра. Отбор по второму измерению некуда добавить, измерение одно
|
|||
66
ColonelAp4u
12.08.22
✎
10:53
|
(65) ну так правильно, если ты к таблице номенклатуры присоединил слева срез у тебя будет вся таблица номенклатуры и срез, и там где будет связь будет номенклатура из твоего РС, все остальные будут null.
сделай срез с отбором и к нему присоедини номенклатуру получишь 1 запись. Зачем спорить, я тебе на примере среза цен номенклатуры показал. Возможно в твоем случае у клиента стояла задача чтобы посмотреть какие записи есть в рс а каких нет, тогда это правильно слева присоединять твой рс к табл номенклатуры. |
|||
67
rudnitskij
12.08.22
✎
13:35
|
(66) попробуй как-нибудь в динамическом запросе для формы списка товаров вывести полученные из среза последних левым соединением цены - даже с указанием всех нужных отборов. Надеюсь ошибка, связанная с тем, что выводит две строки с одной номенклатурой тебя удивит
|
|||
68
lodger
12.08.22
✎
15:41
|
(59) неправда.
|
|||
69
Kassern
12.08.22
✎
15:43
|
(67) не понял в чем вопрос. Если сделать срез последних по регистру, где несколько измерений, но отбор сделать не по всем измерениям, то вполне может быть несколько строк в выборке. Если же делать отбор по всем измерениям, то срез всегда вернет максимум 1 запись.
|
|||
70
alarm2020
12.08.22
✎
15:43
|
(66) 1С-овский срез последних - не совсем срез последних. Или срез не совсем последних ))) Там у него внутри дефект
|
|||
71
Kassern
12.08.22
✎
15:45
|
(70) нет там никакого дефекта, все логично отрабатывает.
|
|||
72
Kassern
12.08.22
✎
15:48
|
простой пример
дата номенклатура ВидЦены Цена 2020 морковь закупочная 200р 2020 морковь продажная 250р 2021 морковь закупочная 220р Срез последних с отбором по номенклатуре вернет 2 записи и не важно какие поля в ВЫБРАТЬ указаны. 2020 морковь продажная 250р 2021 морковь закупочная 220р |
|||
73
alarm2020
12.08.22
✎
15:52
|
(72) А должен вернуть одну, ПОСЛЕДНЮЮ
2021 морковь закупочная 220р И делается это элементарно. Путем правильного формирования GROUP BY |
|||
74
lodger
12.08.22
✎
15:57
|
(73) ничего он вам не должен. в документации написано - по набору измерений и точка.
|
|||
75
Kassern
12.08.22
✎
15:57
|
(73) Вас случаем геня не кусал? Он вроде тему по этому поводу создавал
|
|||
76
alarm2020
12.08.22
✎
15:58
|
(74) Еще как должен. В документации написано так, что можно понимать как угодно. И многие понимают, исходя из разумного представления о значении слова "ПОСЛЕДНИЙ"
|
|||
77
Kassern
12.08.22
✎
15:59
|
(76) там даже написано срез ПОСЛЕДНИХ, а не последний)) Что как бы намекает о срезе по набору измерений, а не тупо последняя строчка
|
|||
78
СеменовСемен
12.08.22
✎
16:00
|
(76) смысл об этом опять спорить? как сделано так и сделано. менять это не будут.
Соответственно баг превращается в фичу |
|||
79
alarm2020
12.08.22
✎
16:02
|
(77) Но каждый из этих последних должен быть ПОСЛЕДНИМ, а не абы каким
|
|||
80
lodger
12.08.22
✎
16:03
|
(76) (77) (78) вы почто фантазируете?
там черным по белому: Срез последних записей регистра возвращает по одной, наиболее поздней по времени, для каждого значения измерения (или комбинации значений измерений) записи регистра сведений. Срез первых, наоборот, возвращает наиболее ранние записи регистра для каждого значения измерения. https://its.1c.ru/db/pubqlang/content/84/hdoc |
|||
81
lodger
12.08.22
✎
16:03
|
(79) вот он и есть последний. для своей комбинации измерений.
|
|||
82
Kassern
12.08.22
✎
16:03
|
(79) так и есть, каждая запись является последними данными для набора измерений. А обе записи являются срезом ПОСЛЕДНИХ для регистра по данной номенклатуре.
|
|||
83
Kassern
12.08.22
✎
16:05
|
(80) Проще же побухтеть на форуме доказывая как должно быть, а не читать доку
|
|||
84
lodger
12.08.22
✎
17:02
|
(83) достаточно одной цитаты с доки, чтобы прервать тролле-срач длиною в сутки.
|
|||
85
alarm2020
12.08.22
✎
17:58
|
(80) Что такое комбинация по-вашему?
|
|||
86
СеменовСемен
12.08.22
✎
18:07
|
(80) там пропущено слово всех
Для каждой комбинации ВСЕХ измерений |
|||
87
alarm2020
12.08.22
✎
18:14
|
(86) Слово ВСЕХ все равно не поправило бы до конца.
Вот есть множество. В нашем случае "Номенклатура, Вид цены". Полный список всех КОМБИНАЦИЙ этого множества: Номенклатура, Вид цены Номенклатура Вид цены Всякий нормальный человек именно так это и понимает, прочитав слово КОМБИНАЦИЯ |
|||
88
alarm2020
12.08.22
✎
18:16
|
А самое главное - не было никакого смысла реализовывать так, как оно сейчас реализовано
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |