Имя: Пароль:
1C
1С v8
Помогите разобраться в чужом коде.
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 Акция не была указана.

Пусть бог Вас защитит и сохранит !
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан