Имя: Пароль:
1C
1C 7.7
v7: Запрос и вывод остатков на период времени с разбиением по дням
0 san4ez1008
 
22.08.16
06:41
Здравствуйте,форумчане! Написал обработку для вывода остатков из регистра с группировкой по наименованию и дням. Теперь нужно дни разместить в разных столбцах и вывести остатки соответственно в каждый столбик. Помогите,пожалуйста, что я тут не так делаю(( Уже всю голову сломал с методами ПрисоединитьСекцию и ВывестиСекцию(

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Фирмы = Справочник.Фирмы.ТекущийЭлемент;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
    |Группировка День;
    |Условие(Номенклатура в ВыбНоменклатура);
    |Условие(Склад в ВыбСклад);
    |Условие(Фирмы в ВыбФирмы);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Номенклатура
        Таб.ВывестиСекцию("Номенклатура");
        Пока Запрос.Группировка(2) = 1 Цикл
            // Заполнение полей День
            Таб.ВывестиСекцию("День");
        КонецЦикла;
    КонецЦикла;
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
1 kosts
 
22.08.16
07:08
(0) Для группировки по дате , насколько помню, надо использовать ключевое слово ВСЕ. Что бы запрос вернул равное количество дат для разной номенклатуры и можно было простым образом вывести горизонтально.
Лучше поищи готовые примеры, по теме Кросс таблицы
2 Злопчинский
 
22.08.16
10:23
сформируй по запросу плоскую ТЗ и подсунь сюда - само выведеткак надо
http://catalog.mista.ru/public/14794/
3 san4ez1008
 
23.08.16
02:02
Мне вообще сказали, что одним запросом тут не обойтись, нужно два одинаковых, но группировку сначала по наименованию, а затем по дням, и проще это вывести в таблицу значений.. Как это реализовать?
4 Это_mike
 
23.08.16
07:40
(3) тебя обманули
5 san4ez1008
 
23.08.16
09:55
(4) а если так?

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Фирмы = Справочник.Фирмы.ТекущийЭлемент;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
    |Группировка День;
    |Условие(Номенклатура в ВыбНоменклатура);
    |Условие(Склад в ВыбСклад);
    |Условие(Фирмы в ВыбФирмы);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Запрос.Выгрузить(ТЗ);          

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица1");
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    //ТЗ.ВыбратьСтроку();    
    Ном="";          
    Для N = 1 По ТЗ.КоличествоСтрок() Цикл
        //Ном = ТЗ.ПолучитьСтрокуПоНомеру(N);
        Номенклатура = ТЗ.ПолучитьЗначение(N,"Номенклатура");
        Остаток =      ТЗ.ПолучитьЗначение(N,"КоличествоКонОст");
        
        //Если Ном <> Таб.ПолучитьСекцию("Номенклатура") тогда
        Если Ном <> Номенклатура тогда
            Таб.ВывестиСекцию("Номенклатура|Лев");
            Таб.ПрисоединитьСекцию("Номенклатура|День");
            Ном = Номенклатура;
        
    иначе
        Таб.ПрисоединитьСекцию("Номенклатура|День");
    КонецЕсли;
    КонецЦикла;
    Таб.Показать();
КонецПроцедуры
6 Это_mike
 
23.08.16
10:05
(5) даже смотреть лень. Предлагаю три варианта на выбор:
1.написать как надо
2.выгрузить в ТЗ, и (2)
3.позвать программиста.
выбирай...
7 san4ez1008
 
23.08.16
10:19
(6) В тз я уже выгрузил, даже выгрузил из ТЗ в ТД..и наконец получилось разбить даты по колонкам!
8 san4ez1008
 
23.08.16
10:28
как в шапке вывести даты? я не понимаю(
9 Это_mike
 
23.08.16
10:32
(8) присоединять секции.
10 san4ez1008
 
23.08.16
10:40
(9) секции я УЖЕ присоединил, если в коде не видно. А если лень смотреть-так уж лучше молчите.
11 Это_mike
 
23.08.16
10:42
(10) в коде присоединения секций в шапке - нет.
позовите программиста
12 san4ez1008
 
23.08.16
10:59
(11) где это прописать?
13 Ёпрст
 
гуру
23.08.16
11:02
(12) в коде, вестимо
14 Ёпрст
 
гуру
23.08.16
11:03
Если че, выгрузка в ТЗ там не нужна, она только вредит
15 Злопчинский
 
23.08.16
11:04
(8) автор дятел? - возьми из (2) - и все выведет само.
если надо -стучись в скайп Zlopun (я сейчас сисадмином ничего не делаю - помогу по факту, покажу, расскажу, объясню). Предложение действительно 20 минут
16 san4ez1008
 
23.08.16
11:04
(13) оно и понятно, что в коде... все такие умные, а исправленный кусочек кода с указанием ошибки никто не может, помочь начинающему не хотят..
17 Ёпрст
 
гуру
23.08.16
11:06
(16) Дык учись, кто мешает ?
Всего то надо обойти первую группировку,вывести шапку,  потом сбросить её, и начинать обходить по-новой для вывода всего остального
18 Ёпрст
 
гуру
23.08.16
11:06
Ну и см. в сторону (1)
19 san4ez1008
 
23.08.16
11:19
В общем, все ясно, всем спасибо.
20 Злопчинский
 
23.08.16
11:20
(17) это не укладывается в идеологию коротких твитов...
21 san4ez1008
 
23.08.16
11:46
Просто. Исправьте. Код. Для вывода гребаной шапки. ПОЖАЛУЙСТА.
22 Злопчинский
 
23.08.16
11:49
Да. Мы здесь. Наблюдаем. Переживаем.
23 Злопчинский
 
23.08.16
11:50
Подсунь свою ТЗ в (2) - выведет все само.
из программирования для подсовывания - написать четыре строки. примеры - по ссылке.
24 Maniac
 
23.08.16
11:56
Для семерки на отчет
http://subsystems.ru/catalog/program=139/

сделаешь сам что хочешь.
там с группировками
25 Злопчинский
 
23.08.16
11:58
(24) не за чет! в(2) - даже переделывать ничего ненадо.. ;-)
26 san4ez1008
 
23.08.16
12:04
(24) (25) Да НЕ НАДО готовых отчетов, мне нужно доработать СВОЙ! Просто не понимаю, как мне зациклить перебор ТЗ, чтобы вывести в шапку даты из периода, выбранного в запросе.
27 Ёпрст
 
гуру
23.08.16
12:08
(26) выкинуть ТЗ, добавить ключевое слово Все в группировку по дням, наслаждаться
28 Злопчинский
 
23.08.16
12:09
(26)
а) если надо сделать быстро чтобы работало - то 2, далее пункт б)
б) если надо доработать свой несрочно - трудись! в ветке все разжевали
29 Maniac
 
23.08.16
12:11
Тогда выкинуть семерку нафиг и перейти на восьмерку
30 Это_mike
 
23.08.16
12:12
(29) будет тупить в снеговике. какая разница?
31 san4ez1008
 
23.08.16
12:19
Данный код выводит мне таблицу с общими остатками и еще остатки по дням.
//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
    |Склад = Регистр.ОстаткиТМЦ.Склад;
    |ЦенаПрод = Регистр.ОстаткиТМЦ.ЦенаПрод;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Фирмы = Справочник.Фирмы.ТекущийЭлемент;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
    |Группировка День;
    |Условие(Номенклатура в ВыбНоменклатура);
    |Условие(Склад в ВыбСклад);
    |Условие(Фирмы в ВыбФирмы);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Запрос.Выгрузить(ТЗ);          

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица1");
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Ном="";


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

Теперь в шапке над столбцами с остатками по дням надо вывести сами даты. Что исправить в коде?
32 Ёпрст
 
гуру
23.08.16
14:16
(31) https://cloud.mail.ru/public/9GKj/NnhtD77Wd

на вот, развлекайся
33 Злопчинский
 
23.08.16
15:42
(32) штрейкбрехер! ;-)
34 san4ez1008
 
24.08.16
02:11
Закрывайте тему,вчера сам все сделал
35 Ёпрст
 
гуру
24.08.16
09:59
(34) показывай, как решил.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.