|
Помогите разобраться в чужом коде. | ☑ | ||
---|---|---|---|---|
0
antihacker
27.11.13
✎
08:11
|
Вот функция.
функция ДоступенБюджет() суммаСкидки=0; рез=истина; //определим есть ли акции тбАкц=товары.Выгрузить(); тбАкц.Свернуть("Акция"); если тбАкц.Количество()=0 тогда возврат истина; конецесли; для каждого стрАкц из тбАкц цикл суммаСкидки=0; //для кадой акции проверим бюджет если стрАкц.акция=справочники.Акции.ПустаяСсылка() тогда продолжить; конецесли; для каждого стр из товары цикл если стр.Акция=стракц.акция тогда суммаскидки=суммаскидки+(стр.Цена*стр.Количество)*стр.процентСкидкиНаценки/100; Сообщить(суммаскидки); конецесли; конеццикла; отбор=новый структура; отбор.Вставить("Счет",планысчетов.Типовой.НайтиПоКоду("6030")); отбор.Вставить("Субконто3",стракц.акция); если суммаскидки>0 тогда запросИс=новый запрос; запросИс.Текст="ВЫБРАТЬ | ТиповойОбороты.СуммаОборотДт, | ТиповойОбороты.Субконто3 |ИЗ | РегистрБухгалтерии.Типовой.Обороты(&Дата1, &Дата2, Период, Счет = &ВыбСчет, , Субконто3 = &ВыбАкция, , ) КАК ТиповойОбороты"; гран=новый граница(этотобъект.МоментВремени(),ВидГраницы.Исключая); //гран.ВидГраницы=ВидГраницы.Исключая; //гран.Значение=этотобъект.МоментВремени(); запросИс.УстановитьПараметр("Дата1", началодня(стрАкц.акция.Датаначала)); запросИс.УстановитьПараметр("Дата2", гран); запросис.УстановитьПараметр("ВыбСчет", планысчетов.Типовой.НайтиПоКоду("6030")); запросис.УстановитьПараметр("ВыбАкция", стрАкц.акция); тбИс=запросис.Выполнить().Выгрузить(); //тб=регистрыбухгалтерии.Типовой.Остатки(этотобъект.МоментВремени(),,отбор); //планывидовхарактеристик.ВидыСубконтоТиповые.НайтиПоКоду("000036") если тбис.Количество()>0 тогда если (тбис[0].СуммаОборотДт+суммаскидки)<=стракц.акция.Бюджет тогда рез=Истина; иначе предупреждение("Бюджет акции "+стракц.акция.код+" превышен на " +строка((тбис[0].СуммаОборотДт+суммаскидки)-стрАкц.акция.Бюджет)+" тенге."); возврат ложь; конецесли; иначе рез=Истина; конецесли; иначе рез=Истина; конецесли; конеццикла; возврат рез; конецфункции Она должна выяснить не превышает лимит бюджета акции. Код работает без ошибок , но и результаты не выдает. Тут видно что код пытается выяснить через запрос общую сумму за данный промежуток времени по товару. А ищет он в оборотах. Зачем так усложнять ? Нельзя было просто найти документы по товару и сложить их сумму скидок ? |
|||
1
Jonny_Khomich
27.11.13
✎
08:13
|
(0) сделай свой код с балеринами и пасьянсом
|
|||
2
Рэйв
27.11.13
✎
08:15
|
(0)Судя по запросу, у тебя на каждую акцию свой лимит. Так что перебирать акции все равно придется
|
|||
3
Рэйв
27.11.13
✎
08:15
|
в таб части может быть больше 1 акции
|
|||
4
zakidonoff
27.11.13
✎
08:21
|
Ctrl + A => Delete
??? Profit -) |
|||
5
Apokalipsec
27.11.13
✎
08:23
|
(0) запросы по документам строить некомильфо, при наличии данных в регистре.
Писал видимо какой-то укуренный семерошник.) я только не вкурил для чего там отбор, и вместо запроса в цикле передай в запрос массив ат и акций, свернув свою таблицу по этим колонкам. |
|||
6
Повелитель
27.11.13
✎
08:24
|
(0) Хорошо кто-то нагамнокодил, одно это только чего стоит:
планысчетов.Типовой.НайтиПоКоду("6030") планывидовхарактеристик.ВидыСубконтоТиповые.НайтиПоКоду("000036") |
|||
7
Рэйв
27.11.13
✎
08:26
|
вот это тоже доставило:-)
тбАкц=товары.Выгрузить(); тбАкц.Свернуть("Акция"); если тбАкц.Количество()=0 тогда возврат истина; конецесли; |
|||
8
х86
27.11.13
✎
08:29
|
(0)пройдись пошагово отладчиком
|
|||
9
Галахад
гуру
27.11.13
✎
08:33
|
(6) Чем плохо?
|
|||
10
1Сергей
27.11.13
✎
08:33
|
А чего добился ты? ©
|
|||
11
Повелитель
27.11.13
✎
09:02
|
(9) Код поменяется, программиста вызвать?
|
|||
12
1Сергей
27.11.13
✎
09:03
|
(11) Какова вероятность, что поменяется код счета?
|
|||
13
Necessitudo
27.11.13
✎
09:05
|
(0) А почему ушел старый программист выяснил?
|
|||
14
Necessitudo
27.11.13
✎
09:05
|
(11) Завести все счета предопределенными?
|
|||
15
Cube
27.11.13
✎
09:06
|
(12) Не нулевая.
|
|||
16
Cube
27.11.13
✎
09:07
|
(14) Кошернее юзать ЗначениеИзСтрокиВнутр()
|
|||
17
Dionis Sergeevich
27.11.13
✎
09:07
|
(11) Ну да. Нам во франче так и говорили - пишите так чтобы они вас чаще вызывали ;)
|
|||
18
Necessitudo
27.11.13
✎
09:07
|
(16) Кошернее юзать прямые запросы тогда уж.
|
|||
19
fmrlex
27.11.13
✎
09:08
|
НУжно больше запросов в циклах. Циклы в запросах, запросы в циклах...
|
|||
20
Necessitudo
27.11.13
✎
09:08
|
Всегда когда пишу код стараюсь сделать его как можно более читабельным и смотрибельным. Иногда чуточку жертвую производительностью)
|
|||
21
Dionis Sergeevich
27.11.13
✎
09:10
|
тбАкц это тч я так понял? Я бы одним запросом к РБ с соединением с ТЧ сделал бы
|
|||
22
Cube
27.11.13
✎
09:10
|
(18) Прямые запросы в v8? Это для экстремалов. а вероятность подмены ГУИДА нулевая, поэтому и кошернее ЗначениеИзСтрокиВнутр()
|
|||
23
Dionis Sergeevich
27.11.13
✎
09:12
|
а вообще автору правильно сказали - хочешь разобраться - бери отладчик. Но переписать надо 100%
Мне понравилось - " Код работает без ошибок , но и результаты не выдает" =)) |
|||
24
Повелитель
27.11.13
✎
09:12
|
(12) Вероятность есть.
У нас в Казахстане, за 10 лет моей практики, меняли уже 3 раза. Так как там тенге фигурирует, значит тоже из наших. (14) Ну как минимум к предопределенным, обращаться как предопределенным. Ну и вообще у 1с есть свой стандарт "1с совместимо" называется, советую почитать тем кто пишет так: планысчетов.Типовой.НайтиПоКоду("6030") |
|||
25
1Сергей
27.11.13
✎
09:13
|
(24) Не надо ляля. У нас в Казахстане один раз перешли на мсфо и всё
|
|||
26
laeg
27.11.13
✎
09:14
|
(24) в 1с есть много стандартов, которых они даже в типовых не придерживаются ...
|
|||
27
laeg
27.11.13
✎
09:14
|
+(26) про стандартны вспоминается только во время сдачи на спеца ...
|
|||
28
Повелитель
27.11.13
✎
09:21
|
(25) Ну на ссылку
http://urist.kz/index.php?option=com_content&task=view&id=19.. 3 раза меняли, которые я лично застал программистом |
|||
29
Адинэснег
27.11.13
✎
09:24
|
воистину антихакер
|
|||
30
milan
27.11.13
✎
09:35
|
(24) Если алгоритм работает именно с этим счетом, что в этом плохого?
|
|||
31
antihacker
27.11.13
✎
09:40
|
Обожаю этот форум. Тебя подкалывают, прикалывают , советуют и шутят. Все эмоции :-) Главное кто нить обязательно ответит :-)
Я сам программист, но в 1с начал не давно. И с регистра еще не пробовал брать суммы за определенный промежуток времени. По этому прибегал к документам, так как там более менее понятно. Так как писать запрос, что бы он вытащил суммарную сумму по по указанным товарам в таблице документа ? Причем тут субконто3 ? |
|||
32
antihacker
29.11.13
✎
12:23
|
Разбираясь пришел к тому, что запрос не выполняется должным образом.Ведь все нужные данные в правильном виде функция получает, но тбис.Количество() все равно равно нулю.
Но где именно в запросе не могу разобраться. Может проблема здесь - запросИс.УстановитьПараметр("Дата2", гран); ? По идее значение переменного "гран" должен быть ровно дате, а Сообщить(гран) возвращает текст "Граница". Кто что думает - 1сники ? |
|||
33
antihacker
29.11.13
✎
16:06
|
Нашел ошибку , но не знаю как исправить.
Запрос работает без строки - "запросис.УстановитьПараметр("ВыбАкция", стрАкц.акция);" Что с ним не так ? Это параметр который содержит наименование акции. |
|||
34
1Сергей
29.11.13
✎
16:08
|
(33) тип у него какой?
|
|||
35
antihacker
29.11.13
✎
16:11
|
А вот не знаю. Я с регистром работаю в первые. Он по Сообщить(стрАкц.акция) возвращает название Акции
|
|||
36
1Сергей
29.11.13
✎
16:13
|
(35) бида. и никак не узнать теперь...
|
|||
37
antihacker
29.11.13
✎
16:14
|
Смеяться над чайником - грех )
|
|||
38
1Сергей
29.11.13
✎
16:17
|
(37) слева от строки "запросис.УстановитьПараметр("ВыбАкция", стрАкц.акция);"
кликаешь мышкой и появляется красная точка - точка останова. запускаешь свою поделку и процессор дойдя до этой строки останавливается, потом выделяешь "стрАкц.акция" и жмёшь SHIFT+F9. Смотришь значение, тип и прочую фигню |
|||
39
Pasha
29.11.13
✎
16:25
|
(0) ИМХО, в данном конкретном случае проще заново написать собственный код :)
|
|||
40
antihacker
01.12.13
✎
12:39
|
Много чего показывает, а на что надо обратить внимание ?
Почему в регистре запрос не находит оборот по указанному акцию. И вообще как можно узнать, попадают ли в регистр данные об Акции ? Открывая оборот по я ни нашел ничего напоминающий об Акции ( |
|||
41
Лефмихалыч
01.12.13
✎
12:47
|
код омерзителен и не жизнеспособен. Автор упоротый клюшкодав. Чинить в этом коде нечего
|
|||
42
antihacker
01.12.13
✎
12:54
|
Тем не менее. Что бы написать самому я должен понять почему этот не ищет по акции. Ведь мне все равно придется писать что то, что будет искать по акции в обороте сумму оборота...
|
|||
43
antihacker
01.12.13
✎
17:02
|
Мдяяя все пишут плохой код, плохой код. Но ни кто так не сказал чем он плох. Что с ним не так, что не работает )
|
|||
44
Лефмихалыч
01.12.13
✎
18:39
|
(43) в нем не так - его наличие. Какого-то отдельного куска, который бы можно было починить, там просто нет. И ответ на твой вопрос "почему он плохой" в факте наличия этой ветки - он плохой потому, что не работает.
Начни с перечисоения того, что у тебя есть и что надо получить |
|||
45
antihacker
01.12.13
✎
19:29
|
Надо получить оборот суммы за период. По счету - 6030 и по виду акции. По счету дает, а по счету и акции нет.
И где можно найти в документе реализации момент когда он в Бухгалтерский регистр закидывает данные по какой именно акции реализуется документ ? Примерно где может находится этот момент ? |
|||
46
mikecool
01.12.13
✎
20:03
|
вот и выросло поколение прогов, не могущее разобраться в чужом коде
|
|||
47
Лефмихалыч
01.12.13
✎
20:49
|
(45) в обработке проведения движения делаются. А обороты надо получать запросом. Почитай каких-нить книжек про программирование на 1С. Радченко того же, например. Или на курсы сходи
(46) да это "у моей подруги с ее парнем". Код авторский, потому что проблема в разобраться, а в "я тут наворотил, а оно не работает" |
|||
48
zippygrill
01.12.13
✎
22:23
|
Предупреждение в цикле-круто :)
|
|||
49
GANR
01.12.13
✎
22:36
|
(0) А на кой черт в этом разбираться??? Я бы просто выяснил какую задачу должна решать эта процедура и написал бы полностью свою. В данном случае однозначно могу сказать - "лучше отСЕБЯтина, чем отЕГОтина".
|
|||
50
antihacker
03.12.13
✎
06:44
|
Опять. Ну не такой уж я совсем тупой ) И я пишу свой код. Но мне тоже нужно брать сумму оборота с Бухгалтерского регистра по счету и по акции. Вот как брать ? В документе реализации при выборе товара(табличная часть) еще и указывается приветствующая акция. И все. А как программно в регистр попадает ни как не могу выяснить. Проверял все связи.
|
|||
51
Плот
03.12.13
✎
07:41
|
(48) Нихе себе. Не сразу заметил.
(43) За запросы в цикле нужно по рукам бить. |
|||
52
antihacker
03.12.13
✎
13:03
|
Вообщем код работает. Оказалось просто в время проводки ни каких данных про Акции не попадает в регистр. По крайней мере отчет "Карточка субконто" показывает ноль. ли вообще в проводку не попадает. Как сделать так что бы во время проведения документа реализации Акция попадала в бухгалтерский регистр. Туда попадает только сумму скидки. В табличной части я в каждой строке указываю соответствующую акцию.
|
|||
53
antihacker
04.12.13
✎
06:47
|
Нашел я где он в субконто сажает название акции.
Если ТаблицаПоСкидкам.Количество() <> 0 тогда Для Каждого СтрокаТаблицы из ТаблицаПоСкидкам цикл СуммаПроводки = СтрокаТаблицы.СуммаСкидки; Проводка = ПроводкиБУ.Добавить(); Проводка.Период = ДатаДока; Проводка.Организация = СтруктураШапкиДокумента.Организация; Проводка.Сумма = СуммаПроводки; Проводка.СчетДт = ПланыСчетов.Типовой.СкидкиСЦеныИПродаж; ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетДт,Проводка.СубконтоДт,"Контрагенты", СтрокаТаблицы.Номенклатура.ОсновнойПоставщик); ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетДт,Проводка.СубконтоДт,"Номенклатура", СтрокаТаблицы.Номенклатура); если этотобъект.Дата>Конецдня(дата(2011,09,30)) тогда ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетДт,Проводка.СубконтоДт,3, этотобъект.Акция); иначеесли этотобъект.Дата>конецдня(дата(2012,06,12)) тогда вв=0; ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетДт,Проводка.СубконтоДт,3, СтрокаТаблицы.Акция); конецесли; Проводка.СчетКт = ПланыСчетов.Типовой.ДоходОтРеализацииПродукцииИОказанияУслуг; ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, 1, ТекДоход); ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, 2, СтрокаТаблицы.Номенклатура.НоменклатурнаяГруппа); //ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, 3, СтрокаТаблицы.СубконтоДоходовБУ3); Проводка.Содержание = "Скидка "+СтрокаТаблицы.УсловиеСкидки+" "+СтрокаТаблицы.ЗначениеУсловияСкидки+" от реализации"; КонецЦикла; КонецЕсли; Точнее эта строка ПроцедурыБухгалтерскогоУчета.УстановитьСубконто(Проводка.СчетДт,Проводка.СубконтоДт,3, СтрокаТаблицы.Акция); И он срабатывает без ошибок. Но данные не сажает. Что может быть. |
|||
54
antihacker
05.12.13
✎
08:53
|
Всем спасибо. Тема закрыта. Код не работал из за того, что в свойстве плана счета - 6030 в качестве субконто 3 Акция не была указана.
Пусть бог Вас защитит и сохранит ! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |