Разработка и оптимизация запросов в 1С:Предприятие 8.3. Модуль 5. Работа с запросами при помощи встроенного языка

На данной странице задавайте вопросы по материалам пятого модуля курса «Разработка и оптимизация запросов в 1С:Предприятие 8.3».

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (380):

  1. Алекс Панскихъ

    Добрый день!
    Зачем в рекурсивной процедуре (на скриншоте) при вызове выборки рекурсивно мы указываем группировку, причем группировку родительской выборки? Что бы изменилось, если бы это не было сделано? И как в результате выборки появились строки по конкретным товарам, это же не группы справочника, а выборка-то по иерархии?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  2. Александр Шокотько

    Добрый день! Вопрос по модулю 5_13 построение “КроссТаблицы”, когда мы заполняем суммы на пересечение ячеек Товар/Покупатель, используем вложенный цикл:

    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
    ВыборкаПокупатель = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент", "ВСЕ");

    не могу понять почему именно в таком порядке , а наоборот не работает

    ВыборкаПокупатель = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
    ВыборкаНоменклатура = ВыборкаПокупатель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура", "ВСЕ");

    это связано с тем, что при заполнении будет использоваться метод “Вывести” вместо “Присоединить”, или логика в другом?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  3. Vladimir552

    Здравствуйте, подскажите пожалуйста, у меня при построении “КроссТаблицы” в область строка почему-то первым значением выводится поле с типом значения NULL и общим итогом по всем продажам, т.е. при формировании кросс таблицы после шапки выводится пустая строка, а потом уже таблица с результатом запроса, подскажите пожалуйста в чем может быть причина? И как это исправить?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  4. Doremi_2020

    В pdf-файле сказано: «В одном прикладном решении может быть создано произвольное количество экземпляров менеджера временных таблиц, каждый из которых хранит свой набор временных таблиц». Если в одном запросе будут созданы временные таблицы ВТ1, ВТ2, ВТ3 и три менеджера временных таблиц МВТ1, МВТ2, МВТ3. Не понятно как распределить временные таблицы по менеджерам временных таблиц. Или по-другому, как формируется набор временных таблиц для каждого менеджера?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        Правильно поняла, что все временные запросы из одного запроса будут помещены в менеджер временных таблиц этого запроса. А если мы хотим сформировать другой менеджер временных таблиц с другим набором ВТ, то это делается и другим запросом?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  5. Doremi_2020

    Доброго времени суток! В занятии 6-01 было сказано, что менеджер временных таблиц, сформированный в запросе можно использовать в следующем запросе. Пыталась решить задачу: в запросе сформировать перечень контрагентов и положить их во ВТ, а распечатать этот список в Запросе1. Результат плачевный.
    Исправьте, пожалуйста, мои ошибки.

    &НаСервере
    Процедура ВТНаСервере()
    МВТ = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Контрагенты.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты";

    РезультатЗапроса = Запрос.Выполнить();

    Запрос1 = Новый Запрос;
    Запрос1.МенеджерВременныхТаблиц = МВТ;
    //РезультатЗапроса = Запрос1.Выполнить();

    Таб = РезультатЗапроса.Выбрать().Выгрузить();
    ТЗ.Загрузить(Таб);
    КонецПроцедуры

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        Пыталась так сделать, но конструктор запроса не видит в Запросе1 ВТ.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  6. Doremi_2020

    Хотела в кросс-таблице расположить товары и покупателей по алфавиту, указала на закладке Порядок Покупатель и Товар по возрастанию, ничего не получилось. Как расположить по алфавиту?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        Указание на закладке “Порядок” Покупатель и Товар по возрастанию не является явной сортировкой?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

  7. Doremi_2020

    Добрый день! При формировании кросс-таблицы конструктор создал такую запись: ТабДок.Вывести(ОбластьПокупатель, ВыборкаПокупатель.Уровень());
    По описанию в справке не поняла, что такое ВыборкаПокупатель.Уровень() и как используется этот параметр. Почему она появилась, у преподавателя в примере не было этого параметра.
    2-я непонятная запись, которую создал конструктор – это
    ВыборкаПокупатель = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Почему в функции Выбрать нет наименования группировки? Как понять какая группировка будет применена программой на данном шаге, у нас могут быть итоги и по покупателю, и товару.
    3. При расчёте общего итога в подвале РезультатыЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).
    Зачем надо указывать ОбходРезультатаЗапроса.ПоГруппировкам, если использовать РезультатыЗапроса.Выбрать(), разве мы итог не получим?
    4. При повторном обращении к ВыборкаКлиент преподаватель применяет параметр Сбросить().
    А можно было вместо Сбросить() повторно обратиться к РезультатамЗапроса по группировке “Покупатель”?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        Не поняла что именно указала в запросе, в результате чего появилась запись ВыборкаПокупатель.Уровень()? Следовала алгоритму преподавателя, но на видео об уровнях ничего, а у меня они откуда взялись?

        И если можно, ответьте, пожалуйста на 3 и 4 вопрос.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  8. Doremi_2020

    Добрый день! Не понятна рекурсивная процедура.
    1. Правильно понимаю, что по сути любая процедура может быть рекурсивной, если в ней есть обращение к самой себе?
    2. Почему не возникает зацикливания? Если бы была проверка на то, что возвращает выборка, поняла бы. Но что заставляет процедуру нормально закончить цикл не понятно.
    3. У проц ОбойтиРекурсивно(Выборка) указан 1 параметр – Выборка, а когда идёт обращение к процедуре из тела процедуры, указывается 2 параметра – ОбойтиРекурсивно(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, Выборка.Группировка())). Почему указывается 2-й параметр, вроде, понятно – требования ОбходРезультатаЗапроса.ПоГруппировкамСИерархией. Не понятно как процедура видит 2-й параметр?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        1. Правильно ли поняла, что 2-й параметр – Выборка.Группировка() позиционирует выборку на определённой группировке и передаём уже спозиционированную выборку?
        2. А если в самой проц указать оба параметра – ОбойтиРекурсивно(Выборка,Группировка), что произойдёт?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • Doremi_2020

            Добрый день!
            Если функция Группировка не позиционирует выборку, то тогда получается, что процедура видит сколько угодно переданных в неё параметров, которые описываются при обращении к ней, а возвращает только тот, который описан в ней самой?

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • Doremi_2020

                Кажется поняла свою ошибку. Выборка.Группировка() – это 2-й параметр функции Выбрать(), а не ОбойтиРекурсивно()!

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

  9. Doremi_2020

    Напомните, пожалуйста, как преподаватель получил перечень возможных функций при замене Следующий() на СледующийПоЗначениюПоля?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  10. Doremi_2020

    Добрый день! «Текст запроса для конфигуратора» позволяет преобразовать текст в формат конфигуратора. Вопрос: а как текст из конфигуратора вставить в конструктор, т.е. без вертикальных черт?
    Зачем вообще используется вертикальная черта. Текст запроса же заключается в кавычки?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        Удалить вертикальную черту можно, если текст запроса из нескольких строк, а если захочу разобрать запрос из стандартной 1С, ведь там в тексте запроса может быть и несколько сот строк.
        Перефразирую вопрос: как запрос из стандартной 1С посмотреть в конструкторе?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • Doremi_2020

            То, что Вы поясняете, поняла. Но в Вашем примере текст запроса берётся из конструктора запроса, а вопрос наоборот: хочу увидеть в конструкторе запроса большой по объёму запрос, прописанный в купленной конфигурации УТП, УТ или любой другой.

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • Doremi_2020

                Поняла, всё время пыталась обратиться к Конструктору запроса с обработкой результата, а программа сообщала, что запрос не найден и предлагала создать новый запрос.

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

  11. Жибек Абдылдаева

    Здравствуйте , при создании кросс таблицы, когда мы создаем макет, при установке параметров , мы должны брать именно как контрагентпредставление , номенклатурапредставление и тд , просто если взять как контрагент и тд нельзя?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  12. Жибек Абдылдаева

    Попробывала вывести кросс таблицу, но система выдает ошибку : Область Шапка не найдена

     Запрос = Новый Запрос;
        Запрос.Текст =  "ВЫБРАТЬ
                        |   ПродажиОбороты.Контрагент КАК Контрагент,
                        |   ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
                        |   ПродажиОбороты.Номенклатура КАК Номенклатура,
                        |   ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
                        |   ПродажиОбороты.СуммаОборот КАК Сумма
                        |ИЗ
                        |   РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
                        |ИТОГИ
                        |   СУММА(Сумма)
                        |ПО
                        |   ОБЩИЕ,
                        |   Контрагент,
                        |   Номенклатура" ;
           
        Макет =  РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
        ОбластьШапкаТовар =  Макет.ПолучитьОбласть("Шапка |Номенклатура");
        ОбластьШапкаКонтрагент = Макет.ПолучитьОбласть("Шапка|Контрагент");
        ОбластьШапкаИтог = Макет.ПолучитьОбласть("Шапка|Итог");
        ОбластьСтрокаТовар = Макет.ПолучитьОбласть("Строка|Номенклатура");
        ОбластьСтрокаКонтрагент = Макет.ПолучитьОбласть("Строка|Контрагент");
        ОбластьСтрокаИтог = Макет.ПолучитьОбласть("Строка|Итог");
        ОбластьПодвалТовар = Макет.ПолучитьОбласть("Подвал|Номенклатура");
        ОбластьПодвалКонтрагент = Макет.ПолучитьОбласть("Подвал|Контрагент");
        ОбластьПодвалИтог = Макет.ПолучитьОбласть("Подвал|Итог");
       
       
        РезультатЗапроса = Запрос.Выполнить();
         
        ВыборкаКлиент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам("Контрагент" , "Все" ));
         
        ТабДок.Вывести(ОбластьШапкаТовар);
         
        Пока ВыборкаКлиент.Следующий() Цикл
         
                ОбластьШапкаКонтрагент.Параметры.Заполнить(ВыборкаКлиент);
                ТабДок.Присоединить(ОбластьШапкаКонтрагент);
         
         КонецЦикла;
     
       ТабДок.Присоединить(ОбластьШапкаИтог);
       
        ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам("Номенклатура"));
         
        ТабДок.Вывести(ОбластьШапкаТовар);
         
        Пока ВыборкаТовар.Следующий() Цикл
         
                ОбластьСтрокаТовар.Параметры.Заполнить(ВыборкаТовар);
                ТабДок.Присоединить(ОбластьСтрокаТовар);
         
         КонецЦикла;

       ТабДок.Вывести(ОбластьПодвалТовар);
       ВыборкаКлиент.Сбросить();
         
        Пока ВыборкаКлиент.Следующий() Цикл
         
                ОбластьПодвалКонтрагент.Параметры.Заполнить(ВыборкаКлиент);
                ТабДок.Присоединить(ОбластьПодвалКонтрагент);
         
           КонецЦикла;

        ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

        Если ВыборкаОбщийИтог.Следующий() Тогда
         
                 ОбластьПодвалИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
                 ТабДок.Присоединить(ОбластьПодвалИтог);
         
         
        КонецЕсли;

    Макет получился у меня такой : в файле скрин

    • Жибек Абдылдаева

      С таблицой значений тоже не могу понять ошибку , в пользовательском режиме сумма заполняется, но вот контрагентов не видно, хотя вроде ссылочный тип данных

      Запрос = Новый Запрос;
          Запрос.Текст =
              "ВЫБРАТЬ
              |   ПродажиОбороты.Контрагент КАК Контрагент,
              |   ПродажиОбороты.СуммаОборот КАК Сумма
              |ИЗ
              |   РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты";
         
          РезультатЗапроса = Запрос.Выполнить();
         
          ТЗ = РезультатЗапроса.Выгрузить();
          ТаблицаПродаж.Загрузить(ТЗ);
      • Василий Ханевич


        (текст комментария доступен только участникам Мастер-группы)

        • Жибек Абдылдаева

          я там проверила, все типы вроде верно указаны

          • Василий Ханевич


            (текст комментария доступен только участникам Мастер-группы)

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Жибек Абдылдаева

        Хорошо Спасибо, сравню, если явных ошибок не смогу увидеть, тогда скину архив

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  13. Жибек Абдылдаева

    Подправьте меня, если я неверно поняла. Когда мы используем метод СледующийПоЗначениюПоля в первом цикле, а во внутреннем цикле метод Следующий, то результат будет таким же как и в том случае, если бы мы использовали изначально метод Следующий. В видео №4, в конце мы видим, что ни товар ни номенклатуру одинаковую он не перепрыгнул

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Жибек Абдылдаева

        Спасибо, вроде как все ясно, в уроке 7 пишится такой год

        Выборка = Запрос.Выполнить().Выбрать();

        значит лучше так всегда оптимизировать наши те 2 строки РезультатЗапроса = Запрос.Выполнить();
        ВыборкаРезультата = РезультатЗапроса.Выбрать();

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • Жибек Абдылдаева

                Спасибо, еще такой вопрос, в видео №13, не рассматривается подробно получение макета кросс таблицы, потому что такого рода отчеты делаются с помощью СКД?

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

  14. Жибек Абдылдаева

    Урок 5, вложенные выборки , мы же вроде в быстром старте выводили без этих вложенных выборок, или я ошибаюсь, не могу найти просто то видео, где мы вроде по кассе выводили иерархию и детальные записи , файл случайно прикрепила , к делу не относится , не смогла удалить))))

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  15. Жибек Абдылдаева

    Здравствуйте, повторяю все за лектором, но заметила ошибку, что у меня количество везде выдает сумму 26, хотя в консоли совсем другие цифры, с чем это связано никак не могу понять

        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   РеализацияТоваров.Контрагент.Наименование КАК КонтрагентНаименование,
            |   РеализацияТоваровТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
            |   РеализацияТоваровТовары.Количество КАК Количество
            |ИЗ
            |   Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
            |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
            |       ПО РеализацияТоваровТовары.Ссылка = РеализацияТоваров.Ссылка
            |
            |УПОРЯДОЧИТЬ ПО
            |   КонтрагентНаименование,
            |   НоменклатураНаименование
            |АВТОУПОРЯДОЧИВАНИЕ";
       
        РезультатЗапроса = Запрос.Выполнить();
       
       
        Если РезультатЗапроса.Пустой() Тогда
       
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Запрос пустой";
            Сообщение.Сообщить();
           
            Возврат;
       
        КонецЕсли;
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
       
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           
               
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Покупатель " + ВыборкаДетальныеЗаписи.КонтрагентНаименование + "  Товар   " + ВыборкаДетальныеЗаписи.НоменклатураНаименование + "  Количество " + ВыборкаДетальныеЗаписи.Количество();
            Сообщение.Сообщить();
    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Жибек Абдылдаева

        Здравствуйте, спасибо не заметила оказ-ся

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  16. alexnrn

    Еще вопрос:
    В программных модулях 1с, при использовании сложных условий с И – например в конструкции ЕСЛИ … КОНЕЦЕСЛИ – если первый операнд условия – ЛОЖЬ, второй уже не будет проверяться.

    В условиях запросов – это работает или нет? То есть есть ли разница как располагать операнды в сложных условиях в конструкции ГДЕ

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  17. alexnrn

    Добрый день.
    Вопрос по 3 параметру метода Выбрать: ГруппировкиДляЗначенийГруппировок.

    Использование значения “ВСЕ” для этого параметра понятно, пустое значение тоже.

    А “Список группировок, разделенных запятыми, из которых будут выбираться значения группировок для обхода” (из описания в синтакс-помощнике) для чего может использоваться? Или это рассматривается далее в курсе?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

        • Алексей Катеринич


          (текст комментария доступен только участникам Мастер-группы)

  18. AlexeyBlinov

    Добрый день!
    При попытке запустить анимацию диаграммы по видеоуроку “Query-5-Config-11.avi” – получаю плоскую (без объема) гистограмму без какой-либо анимации.
    До перевода режима совместимости в “Не использовать”, была объемная гистограмма. Компьютер – не самый слабый.
    Искусственное присвоение:

    Диаграмма.Анимация = АнимацияДиаграммы.Использовать;

    , задает значение “Использовать”, но диаграмма не меняется.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • AlexeyBlinov

        Спасибо!
        С заданием определенного типа: “ГистограммаОбъемная”, анимация появилась: столбики вырастают снизу.
        Но изменений анимации при каждом запуске команды, как у Вас в видео – нет.
        У меня стоит учебная версия: “1С:Предприятие 8.3, учебная версия (8.3.18.1128)”.
        Возможно в ней имеются какие-то ограничения.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • AlexeyBlinov

            Да, видимо какая-то оптимизация.
            Вторая диаграмма анимируется аналогично. Изменения только при изменениях данных в БД. Вид анимации не меняется.

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

  19. Рустам

    Добрый день!
    В Ваших примерах идёт работа с Документом РасходТовара, однако в последней обновлённой базе для практических заданий такого документа нет, есть Документ РеализацияТоваров. А все обработки написаны для Документа РасходТовара, можно конечно переделать, но не хочется терять время – недоработка с Вашей стороны, или я что-то не досмотрел?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  20. Eichen

    Здравствуйте, вопрос не по теме курса, но, возможно, вы знаете как с этим быть.

    Какой шрифт по умолчанию используется в синтакс-помощнике и каким образом его можно изменить на другой?

    На моей платформе, 8.3.16.1063, в синтакс-помощнике применяется шрифт, отличающийся от более ранних версий платформы, хотел бы сделать шрифт как на платформе, например, 8.3.10.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  21. Eichen

    Здравствуйте, вопрос по Query-5-Config-13.

    В данном уроке применяются макеты для выходной таблицы.
    Подскажите, пожалуйста, а где можно поподробнее узнать про то, как работать макетами?
    Может что-то есть в каких-то других курсах или имеется отдельный курс?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Eichen

        Спасибо.

        Мне казалось, что в курсах по СКД и по управляемым формам может что-нибудь быть по макетам.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • Eichen

            Василий, спасибо за развернутый ответ.
            Насколько я понял, макеты широко использовались в разработке до появления СКД.

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

  22. maxim.saharov

    Query-5-Config-6 – с 4:15 минуты – что не не могу понять что происходит от представления – закипает могз ) можно как то на простой схеме нарисовать пример ?

    и если сделать просто такой код

    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        Пока Выборка.Следующий() Цикл
           
            Сообщить("товар: " + Выборка.Товар + " - " + Выборка.Количество +
            ", тип записи - " + Выборка.ТипЗаписи() + ", уровень - " + Выборка.Уровень() +
            ", группировка - " + Выборка.Группировка());
           
        КонецЦикла;

    то выводит такой же результат ) – вопрос зачем тогда усложнять и делать Рекурсивную процедуру ? )

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • maxim.saharov

        “ОбойтиРекурсивно(Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, Выборка.Группировка()” – а зачем указывать Выборка.Группировка() ? Это для того что бы показывало и итог то группировке ?

        и если сделать просто такой код

        Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           
            Пока Выборка.Следующий() Цикл
               
                Сообщить(“товар: ” + Выборка.Товар + ” – ” + Выборка.Количество +
                “, тип записи – ” + Выборка.ТипЗаписи() + “, уровень – ” + Выборка.Уровень() +
                “, группировка – ” + Выборка.Группировка());
               
            КонецЦикла;

        то выводит такой же результат ) – вопрос зачем тогда усложнять и делать Рекурсивную процедуру ? )

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  23. maxim.saharov

    Query-5-Config-5 – я как вариант просто попробовал сделать обход через .Выбрать() – без указания ОбходРезультатаЗапроса.ПоГруппировкам и без вложенного цикла – и результат тот же самый – только уровни группировок по другому немного отображает (скрин прикрепил) – в чем тогда разница и зачем тогда делать цикл в цикле ?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  24. maxim.saharov

    Query-5-Config-4 – 8:25 – не совсем понятна логика как все таки оно работает – если первый цикл СледующийПоЗначениюПоля(“Товар”) а вложенный цикл идет по Следующий() – тоесть сначало у нас в столбике Товар – например есть название товара Стол и 10 раз повторятся и в Покупатель Иванов 10 раз указанно рядом – то как обходит платформа эти строки ? Если она после того как дошла до первой строки Стол и потом начинает в столбике Покупатель перебирать уже методом Следующий() – но она и до конца выборки перебирает методом Следующий() и метод СледующийПоЗначениюПоля() уже не включается ?
    или какая здесь логика цикла в цикле ?

    – почитал комментарии от 17.05.2020 и другие нашел поиском по слову “СледующийПоЗначениюПоля” – и понял что оно берет повторение по первому столбику и потом перебирает по этому значению повторения по второму столбику. Верно ли я понял что если первый цикл будет СледующийПоЗначениюПоля(“Товар”) и вложенный цикл Следующий() то тогда если в первом столбике Товар 10 раз написано Стол и рядом в столбике Покупатель 10 раз написано Иванов – то оно и выведет 10 строк ?
    – если да то чего зачем вообще такая комбинация, как пример, если она ничем не отличатся от просто с одним циклом метода Следующий()

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • maxim.saharov

        Спасибо большое! Все разжевали как нужно). Думаю теперь любой поймет. Хотелось что бы все такое было по умолчанию в курсе, что бы студенты не рыскали в комментариях.
        Из пожеланий, как я уже раньше писал, если есть такие или другие не понятные вопросы у студентов, то что бы как дополнение в курсе делать или ссылки на эти комментарии в курсе вставляйте или как вам нравится информируйте) главное что бы проходил курс и все было понятно. Потому что такие выяснения сути очень много времени занимают.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  25. maxim.saharov

    Query-1Сv8-theory – Страница 126 –
    у вас в описании указанно
    ВыборкаИзРезультатаЗапроса а в примере ВыборкаДетальныеЗаписи

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  26. Sergun29

    Добрый день, пытаюсь сформировать кросс таблицу как в видео уроке, не выходит, заполняется только шкаф, что я делаю не так?

    &НаСервере
    Процедура СформироватьНаСервере(ТабДок)
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    ПродажиОбороты.Номенклатура КАК Товар,
                       |    ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК ТоварПредставление,
                       |    ПродажиОбороты.Контрагент КАК Поставщик,
                       |    ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
                       |    ПродажиОбороты.СуммаОборот КАК Сумма
                       |ИЗ
                       |    РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты
                       |ИТОГИ ПО
                       |    ОБЩИЕ,
                       |    Товар,
                       |    Поставщик";
       
        Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
        ОбластьШапкаТовар = Макет.ПолучитьОбласть("Шапка|Товар");
        ОбластьШапкаПокупатель = Макет.ПолучитьОбласть("Шапка|Поставщик");
        ОбластьШапкаИтог = Макет.ПолучитьОбласть ("Шапка|Итог");
        ОбластьСтрокаТовар = Макет.ПолучитьОбласть ("Строка|Товар");
        ОбластьСтрокаПокупатель = Макет.ПолучитьОбласть ("Строка|Поставщик");
        ОбластьСтрокаИтог = Макет.ПолучитьОбласть ("Строка|Итог");
        ОбластьПодвалТовар = Макет.ПолучитьОбласть ("Подвал|Товар");
        ОбластьПодвалПокупатель = Макет.ПолучитьОбласть ("Подвал|Поставщик");
        ОбластьПодвалИтоги = Макет.ПолучитьОбласть ("Подвал|Итог");
       
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаКлиент = РезультатЗапроса.Выбрать (ОбходРезультатаЗапроса.ПоГруппировкам, "Поставщик");
        ТабДок.Вывести(ОбластьШапкаТовар);
        Пока ВыборкаКлиент.Следующий() Цикл
        ОбластьШапкаПокупатель.Параметры. Заполнить(ВыборкаКлиент);
        ТабДок.Присоединить(ОбластьШапкаПокупатель);
        КонецЦикла;
        ТабДок.Присоединить (ОбластьШапкаИтог);

        ВыборкаТовар = РезультатЗапроса.Выбрать (ОбходРезультатаЗапроса.ПоГруппировкам, "Товар");
        Пока ВыборкаТовар.Следующий() Цикл
        ОбластьСтрокаТовар.Параметры. Заполнить(ВыборкаТовар);
        ТабДок.Вывести(ОбластьСтрокаТовар);
    КонецЦикла;


        ВыборкаПокупатель = ВыборкаТовар.Выбрать (ОбходРезультатаЗапроса.ПоГруппировкам, "Поставщик", "Все");
        Пока ВыборкаПокупатель.Следующий() Цикл
        ОбластьСтрокаПокупатель.Параметры.Заполнить(ВыборкаПокупатель);
        ТабДок.Присоединить(ОбластьСтрокаПокупатель);
        КонецЦикла;
        ОбластьСтрокаИтог.Параметры.Заполнить (ВыборкаТовар);
        ТабДок.Присоединить(ОбластьСтрокаИтог);
    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  27. cojko

    в видеоуроке 5-13 вы вывели табличную часть, заполненную товарами и покупателями вот таким кодом (1 фото) – окей, вроде ясно, потом резко переключились в конфигуратор (2 фото)и цикл стал вложенным ( мало того еще и поменялся местами с товаром, который в запросе идет ниже покупателя в иерархии)? – зачем? ( у меня складывается впечатление, что есть еще как-то курс, который надо пройти после быстрого старта, чтобы хотя бы что-то понять из 5ого модуля этого курса. скажите, что посмотреть еще?)

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  28. cojko

    Здравствуйте. я не понимаю что происходит в уроке 4 пятого модуля.
    скрины приложены. 1 – это код, второе- его исполнение. 3- е что было без дополнительных методов следующий по значению и тп. По логике вещей выполняя код на первом скрине. мы должны получить все строки без дублей по покупателям ( товары не учитываются, так как мы все записи перебираем в цикле по покупателю, на втором круге метод следующий уже наткнется на ЛОЖЬ- вы же сами об этом все видео говорили до этого. толи в коде у вас ошибка толи что, но по логике такой отработки быть не может, либо что-то упущено в повествовании.

    У вас же почему-то отрабатывает все без дублей по товарам… это раз и вообще не понятно, зачем делать было вложенный цикл- этого я совсем не понимаю. нужно по товарам- сделайте один цикл по полю товары, нужен по покупателю сделайте по покупателю. вот этот вложенный цикл вообще зачем? что я должен понять из урока? (моя логика такая. вот вы во вложенном цикле прощелкиваете все строчки до конца. возвращаетесь к товарам и они должны быть прощелкнуты уже до конца и вернуть ложь, так как запрос один и тот же. вот как я это понимаю. только что заканчивал быстрый старт- там такого не было ).

    тоже самое с 5-5 со следующим уроком. что вообще делается можно понятное внятное объяснение пошаговое дать? я не вижу логики в коде от слова совсем (как работают эти вложенные циклы и почему не задваивают вывод вам? хотя по логике вещей они должны ломать весь вывод напрочь, так как выборка. следующий это метод который позиционирует нас на строчку и все, не понимаю, как его можно использовать во вложенном цикле..

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • cojko

        так. я не понял, что значит мы перебрали всех покупателей для этого товара? у нас одна строчка в ней один товар, один покупатель и количество. что перебирать? можно схематично по таблице нарисовать как работает отдельно каждый цикл? вы описали подробно в начале очень мне ( достаточно и трех шагов, уже на них не видно логики, надо как-то подробнее это расписать), уверен непонятно не одному мне, просто остальным пофигуЮ так как если я правильно понимаю никто таким выводом и не пользуется, но тем не менее раз речь зашла надо понять логику, а не просто “потому что так”. так же я считаю в последующих уроках про рекурсию надо тоже подробнее рассказывать, например. это не 2+2 все-таки.
        и так, я все-таки считаю, надо расписать подробно, как соверщается обход в ваших циклах, не словами а схематично, потому что понять я не могу.

        по какой- причине не могу понять не знаю. что -то мне подсказывает, задача чама бесмысленна, по-этому тяжело понять. но тем не менее, вот вы пишите
        “1.1. Вызвали метод Выборка.СледующийПоЗначениюПоля(“Покупатель”) – спозиционировались на первом покупателе для текущего (первого) товара.
        1.2. Вызвали еще раз метод Выборка.СледующийПоЗначениюПоля(“Покупатель”) – спозиционировались на следующем покупателе для текущего (первого) товара.
        1.3. И так, пока не перебрали всех покупателей первого товара.”

        1.3 – а каким таким образом выборка будет перебирать покупателей текущего товара, вы хотите сказать, что в метод следующий по значению по полю принимает какой-то параметр от предидущего цикла? – если да, то странно что вы об этом не говорили- это же самое главное

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • cojko

            а почему вывелась 4 запись? у нас же там поле товар совпадает с 3м. цикл должен был пропустить все до Veko (6) . что там в это время делает второй цик- вообще не понимаю, да и не суть. с первым бы разобраться

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • cojko

                окей, стало лучше ясно. правда остается вопрос- зачем такой “душный” бесмысленный пример? когда не видно четкой цели задачи- понимать ее еще сложнее, учитывая что тут цикл на цикле и циклом погоняет

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

  29. Turkish

    Добрый день.
    Немного не понимаю. Поля запроса
    ТаблицаТовары.Товар,
    ПРЕДСТАВЛЕНИЕ(ТаблицаТовары.Товар),
    ТаблицаТовары.Ссылка.Клиент,
    ПРЕДСТАВЛЕНИЕ(ТаблицаТовары.Ссылка.Клиент),

    …..
    ИТОГИ
    СУММА(Сумма)
    ПО
    Товар,
    Клиент

    Поля с функцией ПРЕДСТАВЛЕНИЕ не участвуют в итогах, но присутствуют в итоговый записях причем соответственно своей ссылке.
    Это система их так раскидывает или я что-то не понимаю в логике?
    И работает ли это для группировок?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  30. alex_m

    Добрый день!
    Просьба пояснить (“Пример построения кросс-таблицы”, Query-5-Config-13.avi) – как и где считаются итоги по строкам и колонкам, ведь выходное поле запроса “Сумма” в выборках не используется.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • alex_m

        Т.е. сопоставление выводимых данных в макете с данными из выборки происходит по именам? Например в макете определен параметр “Номенклатура”, значит в выборке тоже надо определить выходное поле “Номенклатура”?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  31. alex_m

    Добрый день!
    При выполнении урока “Вывод результата запроса в диаграмму” (Query-5-Config-10.avi) после вывода диаграммы при наведении указателя мыши на столбик (серию) диаграммы всплывающая подсказка не появляется. Как можно ее получить ?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • alex_m

        Добры день!
        В присланной обработке всплывающая подсказка появляется только при наведении на точки, при наведении на серии подсказки нет. Не могу понять где и как установить свойство “Подсказка”.
        Версия платформы – 8.3.14.1779

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • alex_m

            Не выводится подсказка, фрагмент кода ниже:

                ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               
                Пока ВыборкаТовар.Следующий() Цикл
                    Серия = Диаграмма.УстановитьСерию(ВыборкаТовар.Товар);
                    Серия.Текст = ВыборкаТовар.ТоварПредставление;
                    Серия.Расшифровка = ВыборкаТовар.Товар;
               
                    ВыборкаПокупатель = ВыборкаТовар.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               
                    Пока ВыборкаПокупатель.Следующий() Цикл
                        Точка = Диаграмма.УстановитьТочку(ВыборкаПокупатель.Покупатель);
                        Точка.Текст = ВыборкаПокупатель.ПокупательПредставление;
                        Точка.Расшифровка = ВыборкаПокупатель.Покупатель;
                        Диаграмма.УстановитьЗначение(Точка, Серия, ВыборкаПокупатель.Сумма,,Строка(Точка)+Строка(Серия)+ Строка(ВыборкаПокупатель.Сумма));
                       
                    КонецЦикла;
                КонецЦикла;
                Диаграмма.АвтоТранспонирование = Истина;
                Диаграмма.Обновление = Истина;

            Не могу понять где ошибся.

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • alex_m

                Понял в чем проблема – демонстрационная конфигурация версии 8.2 , я это запускаю на 8.3, скорее всего проблема в совместимости. Сделал подобную обработку на вашей базе – “Профессиональная разработка запросов в 1С:Предприятие 8 (1.1)” подсказка выводится сразу, ничего не надо дописывать. Выгрузку прилагаю.

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

                  • alex_m

                    На свежей демобазе выводится нормально, значит дело в режиме совместимости. Архив базы больше 10 Мб, поэтому не прикрепился.

                    • Василий Ханевич


                      (текст комментария доступен только участникам Мастер-группы)

  32. Андрей

    День добрый!
    А почему же нет практических заданий по 5-ому модулю? (((

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

    • Юлия Толстых


      (текст комментария доступен только участникам Мастер-группы)

        • Алексей Катеринич


          (текст комментария доступен только участникам Мастер-группы)

  33. Igor55

    Здравствуйте!
    Поясните, пожалуйста, чем тип записи “Итог по группировке” отличается от типа записи “Итог по иерархии”. Поясню вопрос: например, при следующей структуре справочника «Товары»: Группа «Электротовары»/Группа «Чайники»/ товар VekoNT02 при линейном обходе результата запроса (с отбором по товару VekoNT02)

    "ВЫБРАТЬ
                       |    РасходТовараТовары.Товар КАК Товар,
                       |    РасходТовараТовары.Количество КАК Количество
                       |ИЗ
                       |    Документ.РасходТовара.Товары КАК РасходТовараТовары
                       |ГДЕ
                       |    РасходТовараТовары.Товар В ИЕРАРХИИ(&ГруппаТоваров)
                       |
                       |УПОРЯДОЧИТЬ ПО
                       |    Товар ИЕРАРХИЯ
                       |ИТОГИ
                       |    СУММА(Количество)
                       |ПО
                       |    Товар";

    строка “Товар: Чайники, Количество: 5, Тип записи: Итог по иерархии, Уровень: 1, Группировка: Товар” является итогом по иерархии;
    а при типе итогов “только иерархия” строка “Товар: Чайники, Количество: 5, Тип записи: Итог по группировке, Уровень: 1, Группировка: Товар” является уже итогом по группировке?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Igor55

        Василий, добрый день!
        Спасибо за такой подробный и развернутый ответ!

        • Алексей Катеринич


          (текст комментария доступен только участникам Мастер-группы)

  34. ThurisazGudleifr
    ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Товар");
           
        Пока ВыборкаТовар.Следующий() Цикл
            ОбластьСтрокаТовар.Параметры.Заполнить(ВыборкаТовар);
            ТабДок.Вывести(ОбластьСтрокаТовар);
           
            ВыборкаПокупательПоТовару = ВыборкаТовар.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Покупатель", "ВСЕ");
           
            Пока ВыборкаПокупательПоТовару.Следующий() Цикл
                ОбластьСтрокаПокупатель.Параметры.Заполнить(ВыборкаПокупательПоТовару);
                ТабДок.Присоединить(ОбластьСтрокаПокупатель);
            КонецЦикла;

    Вопрос, касаемый метода Выбрать() у Выборки.
    В коде, указанном выше, выбираются из результата запроса все Товары и их Итоги

     ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Товар");

    .
    После чего для текущего Товара из выборки (ВыборкаТовар.Следующий()) получаем всех Покупателей, даже тех, которые данный товар не приобретали (ключевое слово “ВСЕ”)

    ВыборкаПокупательПоТовару = ВыборкаТовар.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Покупатель", "ВСЕ");

    Здесь именно такая логика?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  35. ThurisazGudleifr

    Доброго времени суток.
    Конструктор запроса создал код:
    Макет = ВнешниеОбработки.ЗапросВыводВТабДок.ПолучитьМакет(“Макет”);
    Но он не работает, вылезает ошибка: Поле объекта не обнаружено (ЗапросВыводВТабДок)
    С чем это связано? Код выполняется на сервере.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • ThurisazGudleifr

        я так и сделал в итоге, просто интересно, почему конструктор сформировал код, который не работает.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  36. StanislavCh

    Добрый день!
    Столкнулся с непонятным поведением системы. Рекурсивный перебор из примера в модуле 5 работает нормально до тех пор, пока я не пытаюсь в отладчике проследить шаги рекурсии. Если ставлю точку останова внутри процедуры ОбойтиРекурсивно(Выборка) , программный код перестает отрабатывать. И по сообщениям видно, что выборка перебрала не весь товар (иногда вообще выводится одно сообщение про один конкретный товар, никаких иерархий и группировок), и в отладчике видно, что перебирает неправильно. Убираю точку останова – все в порядке. Что бы это могло означать?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • StanislavCh

        пробовал 8.3.12.1714, 8.3.13.1513 – одинаково…
        Однако, почистил кэш – заработало так, как ожидалось.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • cojko

            я вообще с 5 модуля перестал что-либо понимать. хоят быстрый старт весь закончил и запросы это единственное что я понял хорошо. есть какие- то еще курсы по запросам? с выборками в выборке я вообще ничего не понял, как оно работает. на видео это необъясняется

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • cojko

                вот как-раз -таки это я более менее понял, кроме, наверное того момента, когда уровней много, а так спасибо, хотя бы чуточку по яснее стало.

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

  37. Tanja

    Добрый день! Модуль 5, Видеоурок. Вывод результата запроса в табличный документ, файл Query-5-Config-9, у меня не получается вывести табличный документ, в строках:
    Макет = ВнешниеОбработки.Запросы.ПолучитьМакет(“Макет”);
    //Макет = РеквизитФормыВЗначение(Объект).ПолучитьМакет(“Макет”);
    выдает ошибку, ошибки прикрепила, у меня не работает ни один, ни второй вариант, помогите, пожалуйста, разобраться! Спасибо!

    Добрый день! Разобралась, делаю кросс-таблицу и увидела, что в строке
    Макет = РеквизитФормыВЗначение(Объект).ПолучитьМакет(“Макет”);
    слово Объект не заключено в кавычки! “Ураааааааа, зарррррработало!!!!!!”

    МОДУЛЬ К ОШИБКЕ 1

    &НаСервере
    Процедура ТабличныйДокументНаСервере(ТабДок)
       
        Макет = ВнешниеОбработки.Запросы.ПолучитьМакет("Макет");
        //Макет = РеквизитФормыВЗначение(Объект).ПолучитьМакет("Макет");
        //строка выше позволит пользоваться отчетом не только из внеш.обработки, но и встроить отчет в меню
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   РасходТовараТовары.Товар КАК Товар,
            |   ПРЕДСТАВЛЕНИЕ(РасходТовараТовары.Товар),
            |   РасходТовараТовары.Ссылка.Покупатель КАК Покупатель,
            |   ПРЕДСТАВЛЕНИЕ(РасходТовараТовары.Ссылка.Покупатель),
            |   РасходТовараТовары.Количество КАК Количество,
            |   РасходТовараТовары.Сумма КАК Сумма
            |ИЗ
            |   Документ.РасходТовара.Товары КАК РасходТовараТовары
            |ИТОГИ
            |   СУММА(Количество),
            |   СУММА(Сумма)
            |ПО
            |   ОБЩИЕ,
            |   Покупатель,
            |   Товар";
       
        РезультатЗапроса = Запрос.Выполнить();
       
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
        ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
        ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
        ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
        ОбластьПокупатель = Макет.ПолучитьОбласть("Покупатель");
        ОбластьТовар = Макет.ПолучитьОбласть("Товар");
       
        ТабДок.Очистить();
        ТабДок.Вывести(ОбластьЗаголовок);
        ТабДок.Вывести(ОбластьШапкаТаблицы);
        ТабДок.НачатьАвтогруппировкуСтрок();
       
        ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        ВыборкаОбщийИтог.Следующий();      // Общий итог
        ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
        ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
       
        ВыборкаПокупатель = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        Пока ВыборкаПокупатель.Следующий() Цикл
            ОбластьПокупатель.Параметры.Заполнить(ВыборкаПокупатель);
            ТабДок.Вывести(ОбластьПокупатель, ВыборкаПокупатель.Уровень());
       
            ВыборкаТовар = ВыборкаПокупатель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
            Пока ВыборкаТовар.Следующий() Цикл
                ОбластьТовар.Параметры.Заполнить(ВыборкаТовар);
                ТабДок.Вывести(ОбластьТовар, ВыборкаТовар.Уровень());
            КонецЦикла;
        КонецЦикла;
       
        ТабДок.ЗакончитьАвтогруппировкуСтрок();
        ТабДок.Вывести(ОбластьПодвалТаблицы);
        ТабДок.Вывести(ОбластьПодвал);
       
        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

       
    КонецПроцедуры


    &НаКлиенте
    Процедура ТабличныйДокумент(Команда)
        ТабДок = Новый ТабличныйДокумент;
        ТабличныйДокументНаСервере(ТабДок);
        ТабДок.Показать();
    КонецПроцедуры

    МОДУЛЬ К ОШИБКЕ 2

    &НаСервере
    Процедура ТабличныйДокументНаСервере(ТабДок)
       
        //Макет = ВнешниеОбработки.Запросы.ПолучитьМакет("Макет");
        Макет = РеквизитФормыВЗначение(Объект).ПолучитьМакет("Макет");
        //строка выше позволит пользоваться отчетом не только из внеш.обработки, но и встроить отчет в меню
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   РасходТовараТовары.Товар КАК Товар,
            |   ПРЕДСТАВЛЕНИЕ(РасходТовараТовары.Товар),
            |   РасходТовараТовары.Ссылка.Покупатель КАК Покупатель,
            |   ПРЕДСТАВЛЕНИЕ(РасходТовараТовары.Ссылка.Покупатель),
            |   РасходТовараТовары.Количество КАК Количество,
            |   РасходТовараТовары.Сумма КАК Сумма
            |ИЗ
            |   Документ.РасходТовара.Товары КАК РасходТовараТовары
            |ИТОГИ
            |   СУММА(Количество),
            |   СУММА(Сумма)
            |ПО
            |   ОБЩИЕ,
            |   Покупатель,
            |   Товар";
       
        РезультатЗапроса = Запрос.Выполнить();
       
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
        ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
        ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
        ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
        ОбластьПокупатель = Макет.ПолучитьОбласть("Покупатель");
        ОбластьТовар = Макет.ПолучитьОбласть("Товар");
       
        ТабДок.Очистить();
        ТабДок.Вывести(ОбластьЗаголовок);
        ТабДок.Вывести(ОбластьШапкаТаблицы);
        ТабДок.НачатьАвтогруппировкуСтрок();
       
        ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        ВыборкаОбщийИтог.Следующий();      // Общий итог
        ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
        ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
       
        ВыборкаПокупатель = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
        Пока ВыборкаПокупатель.Следующий() Цикл
            ОбластьПокупатель.Параметры.Заполнить(ВыборкаПокупатель);
            ТабДок.Вывести(ОбластьПокупатель, ВыборкаПокупатель.Уровень());
       
            ВыборкаТовар = ВыборкаПокупатель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       
            Пока ВыборкаТовар.Следующий() Цикл
                ОбластьТовар.Параметры.Заполнить(ВыборкаТовар);
                ТабДок.Вывести(ОбластьТовар, ВыборкаТовар.Уровень());
            КонецЦикла;
        КонецЦикла;
       
        ТабДок.ЗакончитьАвтогруппировкуСтрок();
        ТабДок.Вывести(ОбластьПодвалТаблицы);
        ТабДок.Вывести(ОбластьПодвал);
       
        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

       
    КонецПроцедуры


    &НаКлиенте
    Процедура ТабличныйДокумент(Команда)
        ТабДок = Новый ТабличныйДокумент;
        ТабличныйДокументНаСервере(ТабДок);
        ТабДок.Показать();
    КонецПроцедуры

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  38. Letta

    Здравствуйте! По 5 модулю построение кросс таблиц итоговая строка подвала заполнилась значениями только после добавления после строки

        ВыборкаКонтрагент.Сбросить();

    строки

    ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");

    До этого момента работло в точности с модулем видеоурока. Прилагаю полный код.
    &НаСервере
    Процедура СформироватьНаСервере(ТабДок)
    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    | ПродажиОбороты.Контрагент КАК Контрагент,
    | ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление,
    | ПродажиОбороты.Номенклатура КАК Номенклатура,
    | ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
    | ПродажиОбороты.СуммаОборот КАК Сумма
    |ИЗ
    | РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    |ИТОГИ
    | СУММА(Сумма)
    |ПО
    | ОБЩИЕ,
    | Контрагент,
    | Номенклатура”;

    Макет = РеквизитФормыВЗначение(“Объект”).ПолучитьМакет(“Макет”);
    ОбластьШапкаТовар = Макет.ПолучитьОбласть(“Шапка|Товар”);
    ОбластьШапкаПокупатель = Макет.ПолучитьОбласть(“Шапка|Покупатель”);
    ОбластьШапкаИтог = Макет.ПолучитьОбласть(“Шапка|Итог”);
    ОбластьСтрокаТовар = Макет.ПолучитьОбласть(“Строка|Товар”);
    ОбластьСтрокаПокупатель = Макет.ПолучитьОбласть(“Строка|Покупатель”);
    ОбластьСтрокаИтог = Макет.ПолучитьОбласть(“Строка|Итог”);
    ОбластьПодвалТовар = Макет.ПолучитьОбласть(“Подвал|Товар”);
    ОбластьПодвалПокупатель = Макет.ПолучитьОбласть(“Подвал|Покупатель”);
    ОбластьПодвалИтог = Макет.ПолучитьОбласть(“Подвал|Итог”);

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, “Контрагент”);
    ТабДок.Вывести(ОбластьШапкаТовар);
    Пока ВыборкаКонтрагент.Следующий() Цикл
    ОбластьШапкаПокупатель.Параметры.Заполнить(ВыборкаКонтрагент);
    ТабДок.Присоединить(ОбластьШапкаПокупатель);
    КонецЦикла;
    ТабДок.Присоединить(ОбластьШапкаИтог);

    ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, “Номенклатура”);
    Пока ВыборкаНоменклатура.Следующий() Цикл
    ОбластьСтрокаТовар.Параметры.Заполнить(ВыборкаНоменклатура);
    ТабДок.Вывести(ОбластьСтрокаТовар);

    ВыборкаКонтрагент = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, “Контрагент”, “ВСЕ”);
    Пока ВыборкаКонтрагент.Следующий() Цикл
    ОбластьСтрокаПокупатель.Параметры.Заполнить(ВыборкаКонтрагент);
    ТабДок.Присоединить(ОбластьСтрокаПокупатель);
    КонецЦикла;
    ОбластьСтрокаИтог.Параметры.Заполнить(ВыборкаНоменклатура);
    ТабДок.Присоединить(ОбластьСтрокаИтог);
    КонецЦикла;

    ТабДок.Вывести(ОбластьПодвалТовар);

    ВыборкаКонтрагент.Сбросить();
    ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, “Контрагент”);
    Пока ВыборкаКонтрагент.Следующий() Цикл
    ОбластьПодвалПокупатель.Параметры.Заполнить(ВыборкаКонтрагент);
    ТабДок.Присоединить(ОбластьПодвалПокупатель);
    КонецЦикла;

    ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Если ВыборкаОбщийИтог.Следующий() Тогда
    ОбластьПодвалИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
    ТабДок.Присоединить(ОбластьПодвалИтог);
    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура Сформировать(Команда)
    ТабДок= Новый ТабличныйДокумент;
    СформироватьНаСервере(ТабДок);
    ТабДок.Показать();
    КонецПроцедуры

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Letta

        Спасибо, увидела ошибку. Исправила , заработало. База с сайта для выполнения работ отличается от видео.
        Может и к лучшему.

        РезультатЗапроса = Запрос.Выполнить();
            ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
            ТабДок.Вывести(ОбластьШапкаТовар);   
            Пока ВыборкаКонтрагент.Следующий() Цикл
                ОбластьШапкаПокупатель.Параметры.Заполнить(ВыборкаКонтрагент);
                ТабДок.Присоединить(ОбластьШапкаПокупатель);   
            КонецЦикла;
            ТабДок.Присоединить(ОбластьШапкаИтог);
           
            ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
            Пока ВыборкаНоменклатура.Следующий() Цикл
                ОбластьСтрокаТовар.Параметры.Заполнить(ВыборкаНоменклатура);
                ТабДок.Вывести(ОбластьСтрокаТовар);
               
                ВыборкаКонтрагент1 = ВыборкаНоменклатура.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент", "ВСЕ");
                Пока ВыборкаКонтрагент1.Следующий() Цикл
                    ОбластьСтрокаПокупатель.Параметры.Заполнить(ВыборкаКонтрагент1);
                    ТабДок.Присоединить(ОбластьСтрокаПокупатель); 
                КонецЦикла;
                ОбластьСтрокаИтог.Параметры.Заполнить(ВыборкаНоменклатура);
                ТабДок.Присоединить(ОбластьСтрокаИтог);
            КонецЦикла;
           
            ТабДок.Вывести(ОбластьПодвалТовар);
           
            ВыборкаКонтрагент.Сбросить();
            //ВыборкаКонтрагент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Контрагент");
            Пока ВыборкаКонтрагент.Следующий() Цикл
                ОбластьПодвалПокупатель.Параметры.Заполнить(ВыборкаКонтрагент);
                ТабДок.Присоединить(ОбластьПодвалПокупатель); 
            КонецЦикла;
           
            ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Если ВыборкаОбщийИтог.Следующий() Тогда
                ОбластьПодвалИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
                ТабДок.Присоединить(ОбластьПодвалИтог); 
            КонецЕсли;
        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  39. llbit

    Здравствуйте, не могу понять следующий момент:
    Урок 5 часть 5, получаем детальные запись при обходе результата по группировкам.

    Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
         //ЦИКЛ 1
        Пока Выборка.Следующий() Цикл
             
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Товар: "+ Выборка.Номенклатура + ", Количество: " + Выборка.Количество + ", Тип записи: " + Выборка.ТипЗаписи() + ", Уровень: " + Выборка.Уровень() + ", Группировка: " + Выборка.Группировка();
            Сообщение.Сообщить();
           
             ВыборкаДетальная = Выборка.Выбрать();
             //ЦИКЛ 2
            Пока ВыборкаДетальная.Следующий() Цикл
           
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Товар: "+ ВыборкаДетальная.Номенклатура + ", Количество: " + ВыборкаДетальная.Количество + ", Тип записи: " + ВыборкаДетальная.ТипЗаписи() + ", Уровень: " + ВыборкаДетальная.Уровень() + ", Группировка: " + ВыборкаДетальная.Группировка();
            Сообщение.Сообщить();
           
        КОнецЦикла

        КОнецЦикла

    По результату работы этого кода мы получаем вывод выборки и группировок и детальных записей. Но не могу понять, почему выводится с уровнями группировок по порядку (0,1,2) т.е. (Итог по иерархии, Итог по группировке, детальная запись.)
    В моем понимании в работе кода должно происходить так:
    1. Заходим в \\ЦИКЛ 1, вывелся Итог по иерархии
    2. Идем дальше
    3. Попадаем в \\ЦИКЛ 2, вывелась детальная запись.
    4.Выходим из \\ЦИКЛ 2, снова зашли в \\ЦИКЛ 1, вывелся итог по группировке

    по факту происходит так:

    1.Заходим в \\ЦИКЛ 1, вывелся Итог по иерархии
    2. Идем дальше
    3. Попадаем в \\ЦИКЛ 2, и сразу выходим, т.е. на первой итерации ВыборкаДетальная.Следующий() = ЛОЖЬ
    4.снова зашли в \\ЦИКЛ 1, вывелся итог по группировке
    5.Попадаем в \\ЦИКЛ 2, вывелась детальная запись.

    Прошу пояснить в чем ошибка, спасибо.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты