Имя: Пароль:
1C
1C 7.7
v7: Отчет по продажам
,
0 san4ez1008
 
27.01.17
08:28
Добрый день. Ребят,помогите с выводом секции, чет бьюсь уже второй день.. Типовая конфигурация ТиС 9.2. Собственно код:

  Для К = 1 по ТЗВспом.КоличествоСтрок() цикл
     Код        = "( "+ТЗВспом.ПолучитьЗначение(К, "Код")+" )";
     Номенклатура = ТЗВспом.ПолучитьЗначение(К, "Номенклатура");
     Остаток      = ТЗВспом.ПолучитьЗначение(К, "Остаток");
     Сумма      = ТЗВспом.ПолучитьЗначение(К, "Сумма");
    Филиал      = ТЗВспом.ПолучитьЗначение(К, "Филиал");
     Если Номен <> Номенклатура тогда  
       Если Сумма<>0 тогда
         Запас = Окр(Остаток/Сумма,4);
       Иначе
         Запас = 0;
       КонецЕсли;
       Номен = Номенклатура;
       Для с = 1 по ТЗ1.КоличествоСтрок() цикл
         Товар = ТЗ1.получитьЗначение(с, "Номенклатура");
         СумОст= ТЗ1.ПолучитьЗначение(с, "Остаток");
         СумСум= ТЗ1.ПолучитьЗначение(с, "Сумма");
        
         Если СумСум<>0 тогда
           СумЗапас = окр(СумОст/СумСум,2);
         Иначе
           СумЗапас = 0;
         КонецЕсли;
         если К>1 тогда
           если товар=номенклатура тогда
             Таб.ПрисоединитьСекцию("Строка|Прав");
           КонецЕсли;
         конецесли;
       КонецЦикла;
  Таб.ВывестиСекцию("Строка|Лев");
       Если сокр = 0 тогда
         Таб.ПрисоединитьСекцию("Строка|Сред");
       КонецЕсли;
  иначе
      Если Сумма<>0 тогда
         Запас = Окр(Остаток/Сумма,4);
       Иначе
         Запас = 0;
       КонецЕсли;
       Если Сокр = 0 тогда
         Таб.ПрисоединитьСекцию("Строка|Сред");
       КонецЕсли;
     КонецЕсли;
   КонецЦикла;

пробегаясь по ТЗВспом вывожу основные данные. Перед тем,как меняется номенклатура, нужно вывести секцию строка|прав и вывести суммарные данные из ТЗ1. Вроде бы и все в порядке, но первая строка из ТЗ1 не выводится,теряется,и естественно, в конце не хватает данных.. Что добавить надо в код, чтобы вывод строк был корректным?
1 HawkEye
 
27.01.17
09:12
(0) у тебя написано
если товар=номенклатура тогда
     Таб.ПрисоединитьСекцию("Строка|Прав");
КонецЕсли;

но нигде не написано что такое Товар... т.е. либо это не весь код, либо условие никогда не выполняется....
2 san4ez1008
 
27.01.17
09:14
(1)     Товар = ТЗ1.получитьЗначение(с, "Номенклатура");
3 HawkEye
 
27.01.17
09:16
(2) ага нашел... так-то, мне кажется отладчик - даст ответ на твой вопрос...

Если Номен <> Номенклатура тогда   //тут номен не равен Номенклатуре, т.е. у тебя все перешло к следущей, в номен - у тебя предыдущая, в номенклатуре - следующая...
в "Строка|Прав" - ты хочешь вывести инфу о предыдущей... так?
4 san4ez1008
 
27.01.17
09:33
сейчас у меня данные в строка|прав выводятся таким образом, что первая строка из ТЗ1 выводится еще в шапке, потому что я сначала присоединил строка|прав, а затем вывел строка|лев. Мне же нужно, чтобы это было наоборот, но тогда в этом случае будет строка|лев  строка|сред строка|прав  строка|сред  строка|прав....
а надо
строка|лев строка|сред строка|сред строка|сред строка|сред строка|прав строка|прав
5 HawkEye
 
27.01.17
09:44
(4) в Номен у тебя "товар А", в Номенклатуре "ТОвар Б".
условие Если Номен <> Номенклатура тогда   - выполнилось.

  Номен = Номенклатура; - теперь у тебя и в Номен и в Номенклатуре - "Товар Б"
    
  Для с = 1 по ТЗ1.КоличествоСтрок() цикл
         Товар = ТЗ1.получитьЗначение(с, "Номенклатура");
      
         если К>1 тогда
           если товар=номенклатура тогда
//почему ты сравниваешь ТОвар с "Товаром Б", если тебе надо вывести секцию для "Товара А"?
             Таб.ПрисоединитьСекцию("Строка|Прав");
           КонецЕсли;
         конецесли;
       КонецЦикла;
6 Это_mike
 
27.01.17
09:50
за что банят в отладчике?
7 san4ez1008
 
27.01.17
09:50
(5) изначально номен="";
если номен<>номенклатура(товар А) (истина)
  номен=номенклатура (товар А)
  Для с = 1 по ТЗ1.КоличествоСтрок() цикл
      Товар = ТЗ1.получитьЗначение(с, "Номенклатура"); (тоже товар А)
  если товар=номенклатура (истина) тогда
       Таб.ПрисоединитьСекцию("Строка|Прав");
8 san4ez1008
 
27.01.17
10:02
и получается такая штука, что он секцию "Строка|Прав" присоединяет до того, как дойдет до вывода секции "Строка|Лев", то есть присоединяет ее в шапке...
9 ТакВотЖе
 
27.01.17
10:12
обработку кинь на почту, посмотрю
10 san4ez1008
 
27.01.17
10:22
(9) кинул
11 san4ez1008
 
27.01.17
10:28
Ёпрст, есть мысли?
12 Ёпрст
 
27.01.17
10:34
(11) есть. Всё в топку
13 Ёпрст
 
27.01.17
10:34
Особенно радует вложенный бестолковый цикл по ТЗ1
14 ТакВотЖе
 
27.01.17
10:34
(12) 100 баллов )))
15 san4ez1008
 
27.01.17
10:38
(13) я по-другому не умею...
16 Ёпрст
 
27.01.17
10:42
кинь своё изделие на [email protected]
17 san4ez1008
 
27.01.17
10:52
(16) кинул...
18 Ёпрст
 
27.01.17
11:07
(17) ну смотри, начнём с начала:

Запросы в цикле не есть гуд, ну да ладно.

Ты в цикле всё время делаешь ТЗВспом.Выгрузить(ТЗ1);
тем самым, у тебя в ТЗ1 - всегда, только последний выгруженный запрос по циклу таблички периодов. Что не верно.
Нужно для первой итерации выгружать, для следующих - Заполнить().
19 ТакВотЖе
 
27.01.17
11:08
строка 200 нужно
если товар=номен тогда
20 ТакВотЖе
 
27.01.17
11:09
код просто жесть)
21 Ёпрст
 
27.01.17
11:10
вот эти строки         ТЗВспом.Выгрузить(ТЗ1);
вынеси ЗА цикл.
Потом, заполнение ТЗ на форме - это тормоз.
Если так хочешь ЭТО показывать, то заполняй в коде другую табличку, потом уже целиком делай Выгрузить в тз на форме
22 san4ez1008
 
27.01.17
11:12
(19) да,вывел с первой позиции в ТЗ1, теперь в конце по последней строке в ТЗВспом не хватает данных...
(21)заполнения ТЗ на форме не будет, это я пока что для себя сделал, чтобы видеть,правильно ли все выводится
23 Ёпрст
 
27.01.17
11:32
(22) ты не выводишь последнюю номенклатуру
24 Ёпрст
 
27.01.17
11:37
т.е вот эта вот вся хрень
Если Номен <> Номенклатура тогда
            если К=1 тогда
            иначе
                Для с = 1 по ТЗ1.КоличествоСтрок() цикл
                    Товар = ТЗ1.получитьЗначение(с, "Номенклатура");
                    СумОст= ТЗ1.ПолучитьЗ

у тебя должна стоять еще за циклом
25 Это_mike
 
27.01.17
11:41
(24) репетитор по информатике? :-)
26 san4ez1008
 
27.01.17
11:42
(24) и это вывело только для одного периода...
27 san4ez1008
 
27.01.17
13:03
как доделать то? у меня уже мозг вскипает((
28 Ёпрст
 
27.01.17
13:06
(27) всё переписать :)
29 san4ez1008
 
27.01.17
13:10
(28) не..надо добить...подскажи,как(( (24) не помогло(
30 Это_mike
 
27.01.17
13:12
+(28) сделать с нуля, и сделать сразу правильно.
31 san4ez1008
 
27.01.17
13:16
(30) делаю как могу..
что надо после цикла добавить, чтобы вывести последние значения?
32 san4ez1008
 
27.01.17
13:31
как обычно,самые умные поржали и ушли..
33 zgarick
 
27.01.17
13:34
кинь на мыло [email protected]
34 Ёпрст
 
27.01.17
13:36
(31) ну смотри, ты в цикле сравниваешь с переменной, что если она не равна текущей номенклатуре, то выводим из тз1 всяку каку и присоединяем секции.
Цикл закончился, следовательно, нужно вывести последнюю номенклатуру, ибо переменная же не изменилась. Фирштейн ?
35 Ёпрст
 
27.01.17
13:37
А вообще, открой для себя индексированную ТЗ, там и группировки есть и вывод проще.
36 san4ez1008
 
27.01.17
13:52
(34) фирштейн,все сделал,спасибо
37 san4ez1008
 
27.01.17
13:53
а,и еще вопрос сразу... наверху у меня выводятся названия филиалов, как сделать так, чтобы они объединилсь?
38 san4ez1008
 
27.01.17
13:58
то есть не так,как сейчас,а вот так
            филиал1          филиал2         филиал3
       с....по  с....по с....по  с....по с....по  с....по
39 Это_mike
 
27.01.17
14:05
(38) (37) видимо, объединять после вывода...
40 Ёпрст
 
27.01.17
14:06
(38) через Объединить()
41 Ёпрст
 
27.01.17
14:07
Ибо через "По выделенным колонкам" не подойдёт, так тебе вообще один общий заголовок слепит
42 Ёпрст
 
27.01.17
14:24
На вот, играйся

    Если Сокр = 0 тогда
        Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("Таблица");
        //Таб.ВывестиСекцию("Заголовок");
        Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
        Таб.ВывестиСекцию("Шапка1|Лев");
        //Таб.ВывестиСекцию("Шапка2|Лев");
        Таб.ВывестиСекцию("Шапка|Лев");
        Если (ВыбРубли=1) и (ВыбШТ=0) ТОгда      
                  зн = "руб.";
           ИначеЕсли (ВыбРубли=0) и (ВыбШТ=1) тогда    
                  зн = "шт.";
           КонецЕсли;
           //  
        стр="";
        Высота = Таб.ВысотаТаблицы()-3;
        ТекСтрокаВТаблице = ТаблицаМФ.ТекущаяСтрока(2);
        Для н=1 по СписокЭлементовМФ.РазмерСписка() цикл
            ТТ = СписокЭлементовМФ.ПолучитьЗначение(н,стр);
            Начало = Таб.ШиринаТаблицы()+1;
            //Таб.ПрисоединитьСекцию("Шапка2|Сред");
               Для к=1 По КолПериодов Цикл
                НачДата = ТЗПериод.ПолучитьЗначение(к,"Период_С");
                   КонДата  =  ТЗПериод.ПолучитьЗначение(к,"Период_По");
                   Периодтек = "С "+НачДата+" по "+КонДата;
                   Таб.ПрисоединитьСекцию("Шапка|Сред");
            КонецЦикла;
            Таб.Область(Высота,Начало,Высота,Таб.ШиринаТаблицы()).Объединить();
        КонецЦикла;
        Для к=1 По КолПериодов Цикл
            НачДата = ТЗПериод.ПолучитьЗначение(к,"Период_С");
               КонДата  =  ТЗПериод.ПолучитьЗначение(к,"Период_По");
               Периодтек = "С "+НачДата+" по "+КонДата;
               Таб.ПрисоединитьСекцию("Шапка|Прав");
        КонецЦикла;
    иначе
        Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("Таблица");
        //Таб.ВывестиСекцию("Заголовок");
        Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
        Таб.ВывестиСекцию("Шапка1");
        //Таб.ВывестиСекцию("Шапка2|Лев");
        Таб.ВывестиСекцию("Шапка|Лев");
        
        Если (ВыбРубли=1) и (ВыбШТ=0) ТОгда      
                  зн = "руб.";
           ИначеЕсли (ВыбРубли=0) и (ВыбШТ=1) тогда    
                  зн = "шт.";
           КонецЕсли;
        
        Для к=1 По КолПериодов Цикл
            НачДата = ТЗПериод.ПолучитьЗначение(к,"Период_С");
               КонДата  =  ТЗПериод.ПолучитьЗначение(к,"Период_По");
               Периодтек = "С "+НачДата+" по "+КонДата;
               Таб.ПрисоединитьСекцию("Шапка|Прав");
        КонецЦикла;
    КонецЕсли;
43 san4ez1008
 
07.02.17
04:36
(42) чет мучался,мучался-нифига не получилось..
это,тут другой вопрос, при выборе периода,например, с 15.01 по 15.02 начинаются какие-то глюки с выводом данных, подозреваю, что остатки считаются на конец месяца 31.01 и на 15.02.. Подскажите, каким методом воспользоваться, чтобы остатки выводились именно на последнюю дату,а не за 2 разные ?
44 san4ez1008
 
07.02.17
05:44
А,текст запроса...
        Если (ВыбРубли=0) и (ВыбШТ=1) ТОгда
            зн = "шт.";
            //Перем Запрос, ТекстЗапроса, Таб;
            //Создание объекта типа Запрос  
            Запрос = СоздатьОбъект("Запрос");
            ТекстЗапроса =
            "//{{ЗАПРОС(Сформировать)
            |Период с НачДата по КонДата;
            |Обрабатывать НеПомеченныеНаУдаление;
            |Без итогов;
            |ТекущийДокумент             = Документ.ОтчетККМ.ТекущийДокумент;
            |Филиал                       = Документ.ОтчетККМ.Склад,         Регистр.ОстаткиТМЦ.Склад;
            |Номенклатура                  = Документ.ОтчетККМ.Номенклатура,Регистр.ОстаткиТМЦ.Номенклатура;
            |Остаток                      = Регистр.ОстаткиТМЦ.Количество;
            |Сумма                          = Документ.ОтчетККМ.Количество;
            |Скидка                        = Документ.ОтчетККМ.Скидка;
            |Функция КоличествоКонОст   = КонОст(Остаток);
            |Функция КоличествоСумма    = Сумма(Сумма);  
            |Группировка Номенклатура без групп все;
            |Группировка Филиал все ;
            |Группировка Месяц;
            |"//}}ЗАПРОС
            ;
            Загол="";
            глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были
            глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура",ВыбТМЦ,"ВыбТМЦ",ТекстЗапроса,Загол,"СвойстваНоменклатуры");
            глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Филиал",ВыбСклад,"ВыбСклад",ТекстЗапроса,Загол,"СвойстваСкладов");
            // Если ошибка в запросе, то выход из процедуры
            Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
                Возврат;
            КонецЕсли;
45 Это_mike
 
07.02.17
07:23
(44) у тебя группировка - месяц.
46 san4ez1008
 
07.02.17
08:32
(45) ёп..
47 Это_mike
 
07.02.17
08:36
48 san4ez1008
 
07.02.17
08:43
(47) ты не зае..мучался рисовать?...
49 Это_mike
 
07.02.17
08:44
(48) оно само строит в любом нужном разрезе...
50 san4ez1008
 
07.02.17
08:50
и еще вопрос, в коде есть вывод шапки (где я пытался объединить ячейки), если во вкладке МФ не поставлю курсор на строку "По складам", в шапке будет выводиться номенклатура, в коде явно указываю
ТаблицаМФ.ПолучитьСтрокуПоНомеру(2)
но ему как-то по-барабану...
ТаблицаМФ.ПолучитьСтрокуПоНомеру(2);
     Для н=1 по СписокЭлементовМФ.РазмерСписка() цикл
            ТТ = СписокЭлементовМФ.ПолучитьЗначение(н,стр);
            Начало = Таб.ШиринаТаблицы()+1;
            //Таб.ПрисоединитьСекцию("Шапка2|Сред");

               Для к=1 По КолПериодов Цикл
                НачДата = ТЗПериод.ПолучитьЗначение(к,"Период_С");
                   КонДата  =  ТЗПериод.ПолучитьЗначение(к,"Период_По");
                   Периодтек = "С "+НачДата+" по "+КонДата;
                   Таб.ПрисоединитьСекцию("Шапка|Сред");
            КонецЦикла;
51 san4ez1008
 
08.02.17
02:12
ап
52 Злопчинский
 
08.02.17
02:19
(21) > Потом, заполнение ТЗ на форме - это тормоз.
для существенного ускорения - на порядок как минимум

Форма.ТЗ.Видимость(0);
//код по заполнению ТЗ
Форма.ТЗ.Видимость(1);
53 san4ez1008
 
08.02.17
02:22
(52) я на форму не вывожу ТЗ,это я для проверки выводил
сейчас разбираюсь с (50)
54 Злопчинский
 
08.02.17
02:23
(51) во всю тему не вткал. но для начала сдела йпросто.
заполни ПЛОСКУЮ ТЗ нужными тебе данными. дальше ТЗ подсунь в НотаБене http://catalog.mista.ru/public/14794/ - она тебе и группировки выведет всякие и шахматку хоть по периодам хоть по чему построит, например http://catalog.mista.ru/public/14381/
55 Злопчинский
 
08.02.17
02:23
(53) пофиг, совет - пригодится.
56 Злопчинский
 
08.02.17
02:24
(53) покажи прототип готовой таблицы (хоть в экселе нарисованный) который ты желаешь увидеть
57 Злопчинский
 
08.02.17
02:24
только быстро, быстро!
58 Злопчинский
 
08.02.17
02:28
"..зачем изобретать вечный двигатель, достаточно устранить вечный тормоз!..."

ушел спать
59 san4ez1008
 
08.02.17
02:30
http://radikal.ru][img]http://s019.radikal.ru/i638/1702/9b/05a23d03b252.jpg
вот так хочу,но не могу объединить ячейки,где ТТ1 и ТТ2
и еще не получается (50)
60 san4ez1008
 
08.02.17
02:34
если во МФ не поставлю курсор на строку "По складам", тогда в шапке будет выводиться номенклатура вместо названия ТТ. Указываю ему перед циклом заполнения шапки ТаблицаМФ.ПолучитьСтрокуПоНомеру(2);
и ему как-то все равно...
ПолучитьСтрокуПоНомеру(<?>);
Синтаксис:
ПолучитьСтрокуПоНомеру(<НомерСтроки>)
Назначение:
Получить строку таблицы значений по номеру. Указанная строка становится текущей.
61 Злопчинский
 
08.02.17
02:37
не, такого нотабеней не получиттся.
с точки зреняи вывести порстыню - можно такой отчет нарисовать.
для удобного практического применения - не пригоден.
двоные группировки по вертикали - жпс.
периоды проще сравнивать когда они один под другим.
поэтому периоды вынести в строки, ТТ вынести в столбцы - отчет будет подлинее - но легко читабельный и сравниваемый по точкам и периодам. да и реализуется ноотабеней без программинга
62 Злопчинский
 
08.02.17
02:38
вдобавок такой отчет на раз сворачивается ЙОКСЕЛЕМ - тоже без программирования (кнопкой на панели) в экселеподобнгый вид с плсюсиками разворота по строкам.
63 Злопчинский
 
08.02.17
02:39
вдобавок та же самя нотабеня автоматом поддерживает расшифровку какой-нить общей суммы (когда схлопнуто измерение вывода)
64 san4ez1008
 
08.02.17
02:39
(62) так не я ж придумал такой отчет,девки попросили именно в таком виде..)
65 Злопчинский
 
08.02.17
02:40
так что сдела йпростую плоскую таблицу
товар, описательпериода, описательскладаточки, числовойпокатаель1, числовойпоказатель2... и подсунь в нотабеню.
66 Злопчинский
 
08.02.17
02:42
(64) девки в большинстве своем тупые. в части того, что пока не увидят как правильно - сами не смогут представить - ибо мяслят шаблонами. программеру шаблоны в части мышления вредны. поэтому ПЕРВЫМ шагом - сделай как сказал. дай им поиграться. пока будут играться - не спеша нпишешь мегакарсивый вывод ненужнйо никому простыни.

хотя фигли я учу.
если кодер - то рисуй по шаблонам что девки дали.
вывести такую прсотыню - больше времени займет программирование вывода, чем какая-то полезная работа.
67 san4ez1008
 
08.02.17
02:44
(66) да понимаю, реально больше мучался с выводом данных, только я с 1С знаком всего полгода, а понимание языка дается туго( вот и учусь на таких простынях...попробую поиграться с нотабеней,посмотрим,что получится,спасибо за помощь
а по поводу (60) не подскажете?
68 Злопчинский
 
08.02.17
02:45
подсказка:
выводи тупо построчно-постолбиково.
потом, после вывода таблицы - зная что выведено и сколько выведено - можно объединить нуные столбцы-ячейки итп.

поэтому когда выведешь ЭН периодов по столбикам - станут ищзвестны диапазоны ячеек для объединения заголовка таблицы по токчам
69 Злопчинский
 
08.02.17
02:46
(67) по (60)_ - не, не подскажу. сложного там ничего нет, но влазить в 60 постов чтобы разобраться что к чему - мну влом.
70 san4ez1008
 
08.02.17
02:50
(69) ок...спасибо большое за помощь
71 Злопчинский
 
08.02.17
02:51
если делать тупо и быстро
группировка товар-точка-период

группировка товар
  вывел строка-столбец товар.
  обнулил накопитель
  группировка точка
    группировка период
       вывел период
       просуммировал текущий период в накопитель      
    конец группировка период
  конецгруппировка точка
  цикл по периодам (размерност накопителя)
    присоединил итог по периоду
  конеццикла;
конецгруппировка товар
72 Злопчинский
 
08.02.17
12:04
ну, заборол?
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший