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

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

Практические задания

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

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

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

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

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

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

      Добрый день!
      Доступ в Мастер-группу приостановлен. На Ваш e-mail отправлен новый токен – активируйте его, когда потребуется возобновить обучение.

  1. isp06@mail.ru

    Вопрос такой.
    каким образом могу построить запрос
    что бы получить
    к счету 90.02 ко всем счетам где есть аналитика договори и контрагент

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


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

      • isp06@mail.ru

        Вопрос такой к 23 заднию
        вы выбрали КадровыеПеремещенияСрезПоследних
        для отбора всех сотрудников у которых когда либо была должность руководитель
        можно же было выбрать просто кадровыеПеремещения или я не прав???
        почему именно через срез?

        • AlexeyDubrovin

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

      • isp06@mail.ru

        А с использованием СКД как это возможно сделать?

  2. Priest

    Добрый день,
    Подскажите, пожалуйста:
    Столкнулся с неприятной ситуацией при формировании шахматки. Захотел я сделать все как в задании, но выводить итоги только по колонке «Итог». Соответственно я решил что цикл для заполнения подвал|месяц мне не нужен и убрал его. А в итоге ячейка Подвал|Итог смещается далеко влево. В результате приходится возвращать цикл с присоединением колонки месяц в подвале, но мне не очень нравится такое решение. Нет-ли другого способа зафиксировать ячейку Подвал|Итог под колонкой Итог?

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


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

      • Priest

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

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


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

          • Priest

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

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


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

              • Priest

                Добрый день,
                Понял, большое спасибо. Очень надеялся что можно будет проще, но видимо это единственный способ.

  3. toliman778

    добры день в 24 задании не стал помещать дважды во временную таблицу а сразу расчитал результат. грузят ли дополнително новые ВТ базу?

     ВЫБРАТЬ
        ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаЗакупочная,
        ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
        0 КАК ЦенаРозничная
    ПОМЕСТИТЬ ВТЦены
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ЦенаЗакупочная) КАК ЦеныНоменклатурыСрезПоследних

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        0,
        ЦеныНоменклатурыСрезПоследних.Номенклатура,
        ЦеныНоменклатурыСрезПоследних.Цена
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ЦенаРозничная) КАК ЦеныНоменклатурыСрезПоследних
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТЦены.Номенклатура КАК Номенклатура,
        МАКСИМУМ(ВТЦены.ЦенаЗакупочная) КАК ЦенаЗакупочная,
        МАКСИМУМ(ВТЦены.ЦенаРозничная) КАК ЦенаРозничная,
        (МАКСИМУМ(ВТЦены.ЦенаРозничная) - МАКСИМУМ(ВТЦены.ЦенаЗакупочная)) / МАКСИМУМ(ВТЦены.ЦенаЗакупочная) * 100 КАК ПроцентНаченки
    ИЗ
        ВТЦены КАК ВТЦены

    СГРУППИРОВАТЬ ПО
        ВТЦены.Номенклатура
    • Василий Ханевич


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

  4. ThurisazGudleifr

    Доброго времени суток.
    В видеоуроках рассказывалось про параметр Субконто виртуальной таблицы остатков регистра бухгалтерии. Сказано, что если мы укажем, например, вид Номенклатура, то в результат запроса в Субконто1 попадет то субконто, которое физически является Субконто2 (если оно Номенклатурное конечно). Для чего это сделано? На практике для отчетов? Не возникнет ли путаницы?

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


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

      • ThurisazGudleifr

        Василий, как лучше поступить в следующей ситуации?

        Необходимо написать запрос, получить определенные данные, поместить во ВТ, потом соединить с другой и тд. Выгружаем в ТЗ. Далее необходимо получить запросом еще данные, также выгрузив в тз, либо сделать Выборку, после чего обойти ее используя данные из первого запроса в алгоритме внутри цикла. Писать Запрос = Новый (тут пишем первый запрос), потом пишем Запрос = Новый (тут второй запрос)? Или более правильно получить необходимые данные из второго запроса в первом запросе, поместить во временную таблицу, потом с помощью менеджера вт получить данные?

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


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

  5. ThurisazGudleifr

    Василий, посмотрите пожалуйста мою обработку (25 задание). Код писал вручную, макет создавал тоже вручную.
    1) Результат аналогичный, как и при автоматическом формировании, но смущает то, что нет так называемого смещения по уровням (на подобии табуляции). Макет у меня немного отличается — областей меньше, но это ведь не влияет на смещение?
    2) Я получил только поля Представление(…), Вы еще выбрали ссылочного типа. Для чего это делается? Почему нельзя обойтись только представлением, как это сделал я?

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


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

      • Udar

        А что означает: «поместить ссылку»? Я написал в параметре «КонтрагентПредставление», в параметре расшифровки «Контрагент», однако форма объекта из отчета не открывается.

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


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

  6. ThurisazGudleifr

    Здравствуйте.
    1) В решении 22 задания есть условие:

     КадроваяИсторияСрезПоследних.Должность.Наименование ПОДОБНО "%руководитель%"

    Первая мысль при виде разыменования полей — постараться найти путь решения задачи без лишней неявной связи с таблицей Должности. Есть метод Представление(), но при

    ПРЕДСТАВЛЕНИЕ(КадроваяИсторияСрезПоследних.Должность) ПОДОБНО «%руководитель%»

    появляется ошибка: Неверные параметры «ПОДОБНО». В чем моя ошибка?

    2) В 24 задании Вы сгруппировали строки по полю Номенклатура, после чего поместили во врем.таб. «ВТ», а потом из нее взяли поля и рассчитали наценку. Почему все это не сделали без создания ВТ? Сгруппировали, а потом бы рассчитали сразу процент наценки. Это для наглядности или правило хорошего тона?

    3) 24 задание решил с помощью ВТ и внутренних соединений между ними. Что лучше выбирать Объединение или Соединение, когда можно решить задачу и так и так? Что производительнее? Ведь в Вашем варианте объединяются таблицы + группировка + помещение во ВТ, в моем случае только помещение во ВТ + Внутреннее Соединение. Группировка при достаточно больших объемах данных использует немало ресурсов?

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


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

      • ThurisazGudleifr

        В методичке про получение остатков:
        «Сначала при помощи первого запроса, входящего в объединение, выбираются данные из итоговой таблицы AccumRgT85. Итоги получаются на дату хранения текущих итогов (01.11.3999)»

        «Во втором запросе объединения используется таблица движений регистра AccumRg81. В зависимости от вида движения (если RecordKind равно 0, то это Приход, в противном случае – Расход) проставляется знак в выражении. Платформа выбирает данные за период с даты, указанной в качестве параметра виртуальной таблицы, по дату хранения текущих итогов (01.11.3999).»

        Не совсем понятна логика выполнения запроса. В первом запросе мы получаем ВСЕ итоги. Во втором запросе мы получаем итоги с даты параметра по дату текущих итогов (3999).

        Далее мы объединяем эти два запроса, группируем. Каким образом получается количество товара на дату указанную в параметре запроса, если в первом запросе (который объединяется) мы уже получили все Итоги, а потом к ним грубо говоря добавляем еще со второго запроса?

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


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

          • ThurisazGudleifr

            Большое спасибо за Ваши подробные ответы! Теперь все понятно. =)

  7. valeri4

    Добрый день ! В задании № 27 добавил условия на виртуальные таблицы &ДатаНачала и &ДатаКонец, заполнил значения параметров, но результат почему пустая выборка. Как правильно наложить условия, чтобы получить результат не по всему регистру а за указанные пользователем диапазон?

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


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

      • Udar

        Добрый день!
        Подскажите пожалуйста, как в запросе параметрах описать не параметр на выбор, а конкретное значение ссылки, то есть не Товар.Вид = &Услуга, а Товар.Вид = Перечисление.ВидыТоваров.Услуга?

        • Калиниченко Дмитрий


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

  8. Andrey_Solovyev

    Добрый день
    В комментарии к одной из ваших статей встретилась фраза об использовании регистратора в параметрах виртуальной таблице, а не в секции ГДЕ. Можете прокомментировать. Спасибо

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


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

      • StanislavCh

        А у меня обнаружилась существенная разница на реальной клиентской базе (файловой) с большим кол-вом введенных документов. При использовании ГДЕ запрос делался секунд 17 ! вернул условие в виртуальную таблицу, время запроса вернулось к привычным долям секунды…

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


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

  9. Priest

    Добрый день,
    Подскажите, пожалуйста, по 24-му заданию никак не могу сообразить, почему нельзя обойтись одним запросом?
    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних1.Цена КАК Цена1,
    (ЦеныНоменклатурыСрезПоследних1.Цена — ЦеныНоменклатурыСрезПоследних.Цена) / ЦеныНоменклатурыСрезПоследних.Цена * 100 КАК Поле1
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенЗак) КАК ЦеныНоменклатурыСрезПоследних
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенРоз) КАК ЦеныНоменклатурыСрезПоследних1
    ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатурыСрезПоследних1.Номенклатура

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


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

  10. Pchelka

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

    1. Запрос = Новый Запрос;
    Запрос.Текст = «ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
    | ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
    | &НачалоПериода,
    | &КонецПериода,
    | ,
    | ,
    | Счет = &Счет,
    | ,
    | Субконто1.ИНН = &ИНН
    | ИЛИ Субконто1.РегистрационныйНомер = &РегистрационныйНомер) КАК ХозрасчетныйОстаткиИОбороты»;

    Запрос.УстановитьПараметр(«ИНН»,_ИНН);
    Запрос.УстановитьПараметр(«КПП»,_КПП);
    Запрос.УстановитьПараметр(«НачалоПериода»,Период.ДатаНачала);
    Запрос.УстановитьПараметр(«КонецПериода»,Новый Граница(КонецДня(Период.ДатаОкончания), ВидГраницы.Включая));
    Запрос.УстановитьПараметр(«РегистрационныйНомер»,РегистрационныйНомер);
    Запрос.УстановитьПараметр(«Счет»,ПланыСчетов.Хозрасчетный.ПредоставленныеЗаймы);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    …..
    КонецЕсли;

    Выборка.Следующий() возвращает «истина». Выборка.СуммаНачальныйОстаток = 0. Выборка.СуммаКонечныйОстаток = 0

    2. Но если добавить в текст запроса
    Запрос.Текст = Запрос.Текст + » Где ХозрасчетныйОстаткиИОбороты.Субконто1.КПП = &КПП»;

    То Выборка.Следующий() возвращает ложь. В параметр «КПП» передается «773601001» (КПП контрагента из первого запроса)
    Но ведь должно возвращаться тоже самое, что и в первом запросе. В чем отличие?

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


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

      • Pchelka

        Логика понятна, спасибо.
        Скажите, почему запрос возвращает NULL, а не 0, получается, если нет оборотов между счетами, то в ОборотыДтКт Null?

        Запрос.УстановитьПараметр(«СчетАвансов», ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным);
        Запрос.УстановитьПараметр(«СчетКасса», ПланыСчетов.Хозрасчетный.Касса);
        Запрос.УстановитьПараметр(«СчетРасчетныеСчета», ПланыСчетов.Хозрасчетный.РасчетныеСчета);
        МассивВидовСубконто1 = Новый Массив; МассивВидовСубконто1.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств); МассивВидовСубконто1.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.БанковскиеСчета);
        Запрос.УстановитьПараметр(«МассивВидовСубконто1», МассивВидовСубконто1);

        МассивВидовСубконто = Новый Массив; МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
        Запрос.УстановитьПараметр(«НачалоПериода»,Период.ДатаНачала);
        Запрос.УстановитьПараметр(«КонецПериода»,Новый Граница(КонецДня(Период.ДатаОкончания), ВидГраницы.Включая));

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

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


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

  11. Artemka92

    Подскажите, пожалуйста, что значит поле «Активность» в регистрах? Какую информацию оно в себе содержит?

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


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

  12. Dimanzo

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

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


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

  13. Lazy Stranger

    Задание 28 можно сделать и с 1 ВТ вместо 2:

    ВЫБРАТЬ
    ПродажиОбороты.КоличествоОборот КАК КоличествоОборот
    ПОМЕСТИТЬ ВТ
    ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
    ПродажиОбороты.КоличествоОборот / ВТ.КоличествоОборот * 100 КАК Процент
    ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты,
    ВТ КАК ВТ
    ИТОГИ
    СУММА(КоличествоОборот),
    СУММА(Процент)
    ПО
    ОБЩИЕ

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


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

  14. Lazy Stranger

    Здравствуйте!
    Задачу 24 я делал через внутреннее соединение таблиц розничных и закупочных цен. Есть ли какие то преимущества и недостатки у такого варианта?

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

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ЗакупочныеЦены.Номенклатура КАК Номенклатура,
    ЗакупочныеЦены.ЦенаЗакупочная КАК ЦенаЗакупочная,
    РозничныеЦены.ЦенаРозничная КАК ЦенаРозничная,
    ВЫРАЗИТЬ(РозничныеЦены.ЦенаРозничная / ЗакупочныеЦены.ЦенаЗакупочная * 100 — 100 КАК ЧИСЛО(12, 2)) КАК Наценка
    ИЗ
    ЗакупочныеЦены КАК ЗакупочныеЦены
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РозничныеЦены КАК РозничныеЦены
    ПО (ЗакупочныеЦены.Номенклатура = РозничныеЦены.Номенклатура)

    УПОРЯДОЧИТЬ ПО
    Наценка УБЫВ

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


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

      • Lazy Stranger

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

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


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

  15. Ян

    Здравствуйте, Василий! Возник, наверно, совершенно тупой вопрос, но в задаче 27 мне захотелось определить переменные для вида номенклатуры Товар и Услуга, так вот, почему-то не получилось.
    В начале модуля формы объявляю

    &НаСервере
    Перем ВидНомТовар ;
    Перем ВидНомУслуга ;

    Пытался после описания всех процедур и функций определить значения переменных
    (в теле модуля) — ошибка, он не знает, что такое «Перечисления».
    Если же определять переменные в отдельной серверной процедуре, то в следующей серверной процедуре уже не видны значения,
    хотя переменные и объявлены «сверху». Что я делаю не так?

    Заглядывал сюда https://курсы-по-1с.рф/articles/модули-в-платформе-1с-предприятие-8-3/#point5
    что-то не нахожу ответ.

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


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

  16. Ян

    Здравствуйте, Василий!
    В задании 25 у Вас РеквизитФормыВЗначение(«Отчет»), у меня это работало и с «Объект».
    Делать как у Вас «просто потому что так надо» или есть принципиальная разница?

    И ещё почему-то не получается вернуться в конструктор запроса, чтобы что-то поправить.
    «Не найден текст запроса, создать новый?»
    Яндекс говорит, надо вставать курсором в текст запроса, но мне не удалось добиться.
    Зеленый комментарий вернул сверху и снизу сформированного конструктором кода, всё равно.
    Если не удалять комментарий, то получается.
    Как всё-таки правильно вставлять этот комментарий (или обойтись без этого), чтоб попасть в конструктор повторно?

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


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

      • Ян

        по п.1 странно, потому что помощник с ctrl-tab выдал единственный вариант «Объект», попробую разобраться.. (8.3.13)
        и в п 2 комментарии такие я добавлял (из вновь созданного отчета копировал), может, что не так или пробел лишний..

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


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

          • Ян

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

            Макет = ВнешниеОтчеты.Задача27.ПолучитьМакет("Макет");

            то, что мы делаем

            Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет");

            Как только возвращаешь обратно автоматически созданную строку получения макета, конструктор снова видит запрос.
            Одних только комментариев недостаточно. Вот такой вот глюк.

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


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

  17. Ян

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

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


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

      • Ян

        Вот попытался дату сразу в конструкторе запроса привести к нужному формату («январь 2014»),
        через добавление поля с функцией с форматной строкой, что ни пробую, синтаксическая ошибка.
        Так нельзя или как-то неправильно пробую?

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


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

          • Ян

            Здравствуйте, Василий! СКД решает этот вопрос?

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


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

  18. Letta

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

    ВЫБРАТЬ
        СправочникНоменклатура.Ссылка
    ПОМЕСТИТЬ ВТ_Номенклатура
    ИЗ
        Справочник.Номенклатура КАК СправочникНоменклатура
    ГДЕ
        СправочникНоменклатура.Ссылка В ИЕРАРХИИ(&Номенклатура)
        И СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПродажиОбороты.Период КАК Период,
        ПродажиОбороты.Номенклатура КАК Номенклатура,
        ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
        ПродажиОбороты.СтоимостьОборот КАК СуммаПродажи,
        ПродажиОбороты.СтоимостьБезСкидокОборот КАК СуммаБезСкидокПродажи,
        0 КАК КоличествоОстаток,
        0 КАК Цена,
        0 КАК СуммаОстатка
    ИЗ
        РегистрНакопления.Продажи.Обороты(
                &НачалоПериода,
                &КонецПериода,
                Месяц,
                НЕ Контрагент В (&Контрагент)
                    И Организация В (&Организация)
                    И Номенклатура В
                        (ВЫБРАТЬ
                            ВТ_Номенклатура.Ссылка КАК Номенклатура
                        ИЗ
                            ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ПродажиОбороты

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        0,
        ТоварыНаСкладахОстатки.Номенклатура,
        0,
        0,
        0,
        ТоварыНаСкладахОстатки.КоличествоОстаток,
        ЦеныНоменклатурыСрезПоследних.Цена,
        ТоварыНаСкладахОстатки.КоличествоОстаток * ЦеныНоменклатурыСрезПоследних.Цена
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.Остатки(
                &КонецПериода,
                Номенклатура В
                    (ВЫБРАТЬ
                        ВТ_Номенклатура.Ссылка КАК Номенклатура
                    ИЗ
                        ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ТоварыНаСкладахОстатки
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                    &КонецПериода,
                    ТипЦен = &ТипЦены
                        И Номенклатура В
                            (ВЫБРАТЬ
                                ВТ_Номенклатура.Ссылка КАК Номенклатура
                            ИЗ
                                ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних
            ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

    УПОРЯДОЧИТЬ ПО
        Номенклатура,
        Период
    ИТОГИ
        СУММА(КоличествоПродажи),
        СУММА(СуммаПродажи),
        СУММА(СуммаБезСкидокПродажи),
        СУММА(КоличествоОстаток),
        СУММА(СуммаОстатка)
    ПО
        ОБЩИЕ
    • Василий Ханевич


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

      • Letta

        При помощи программного кода, подготовила макет, пытаюсь вывести шапку с месяцами выдает ошибку «В случае использования операторов ОБЪЕДИНИТЬ, поля предложений УПОРЯДОЧИТЬ ПО и ИТОГИ ПО должны находиться в списке выбора.
        <>Период ПЕРИОДАМИ(МЕСЯЦ, , )»

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

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

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


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

          • Letta

            Да, так работает, только заменила на

            НАЧАЛОПЕРИОДА(&НачалоПериода, МЕСЯЦ) КАК Период,

            , т.к. если ставить дату при добавлении колонки с параметром периода Месяц добавляет все периоды с этой даты.
            Кросс-таблица состоит из строк Заголовок, Шапка, Номенклатура, Подвал и колонок ДляВсех (где выводиться наименование номенклатуры), Остатки, Месяц, Итого. Не получается вывести в одну строку во вложении пример результата отчета.

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

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


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

              • Letta

                Спасибо. Посмотрю. Так же уже думала о предыдущем периоде не участвующем в оборотах. Возможно нужен совсем другой принцип для формирования отчета данного типа.

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


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

                  • Letta

                    Надо пробовать, главное скорость формирования не потерять

              • Letta

                Добрый день! Отчет сформирован, получился красиво. Работаю чтобы по группам номенклатуры выводился в ИЕРАРХИИ.

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


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

              • Letta

                Для более точного получения данных по остаткам и оборотам на конец периода

                Граница = Новый Граница(КонецДня(КонецПериода), ВидГраницы.Включая);
                Запрос.УстановитьПараметр("КонецПериода", Граница);
                • Василий Ханевич


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

  19. elfnatal

    Добрый день!
    Я правильно понимаю, что в ЗУП 3 для регистров расчетов не настроены Перерасчеты? Нашла только регистры сведений Перерасчеты и обработку УправлениеПерерасчетами. Или в новой версии используется другой механизм перерасчетов?

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


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

  20. elfnatal

    Подскажите, почему в плане запроса при получении остатков регистра накопления берется запись из таблицы итогов на последнюю дату- 01.11.3999, а не на ближайшую? Пример из видео как раз подходящий — нужно получить остатки на дату первой записи в регистре, а субд делает столько лишних вычислений, все имеющиеся записи в базе отнимает от конечного остатка. Почему так?
    Тем более на странице методической поддержки написано, что должна браться ближайшая запись. Но этого почему-то не происходит.
    https://its.1c.ru/db/metod8dev/content/2726/hdoc
    «В случае получения остатков на 15.07.2004 сначала будут получены данные из таблицы итогов на момент времени 01.08.2004, так как это ближайший больший момент времени, на который посчитаны остатки, а затем будут обработаны данные из таблицы движений за период с 15.07.2004 по 31.07.2004 включительно. «

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


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

  21. Denis74

    Здравствуйте! Подскажите, насколько оправдано в параметрах виртуальной таблицы использовать разыменование полей измерений (Например «РегистрвСведений.ЦеныНоменклатуры.СрезПоследних( ,ТипЦены.Наименование ПОДОБНО «%закупочная%»)»). Фактически происходит построение вложенного запроса, НО!!! строится он единожды или для каждой записи индивидуально(т.е. происходит многократное обращение к Справочник.ТипыЦены)????? Возможно, в данном случае правильно будет заранее сформировать временную таблицу, которая бы удовлетворяла условию «ПОДОБНО «%закупочная%»»???, а в условии виртуальной таблицы записать «РегистрвСведений.ЦеныНоменклатуры.СрезПоследних( ,ТипЦены В (Выбрать ВТ_ТипыЦены.ТипЦены Из ВТ_ТипыЦены))»??? Спасибо!

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


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

  22. Letta

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

    ВЫБРАТЬ
        ЗакупкиОбороты.Номенклатура КАК Номенклатура,
        ЗакупкиОбороты.Контрагент
    ПОМЕСТИТЬ ВТ_НоменклатураПоЗкупкеОтКонтрагента
    ИЗ
        РегистрНакопления.Закупки.Обороты(&ДатаНачала, &ДатаОкончанияОтчета, , Контрагент = &Поставщик) КАК ЗакупкиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЗакупкиОбороты.Период КАК Период,
        ЗакупкиОбороты.КоличествоОборот КАК КоличествоЗакуп,
        ЗакупкиОбороты.СтоимостьОборот КАК СтоимостьЗакуп
    ПОМЕСТИТЬ ВТ_Закупки2
    ИЗ
        ВТ_НоменклатураПоЗкупкеОтКонтрагента КАК ВТ_НоменклатураПоЗкупкеОтКонтрагента,
        РегистрНакопления.Закупки.Обороты(&ДатаНачалаОтчета, &ДатаОкончанияОтчета, Месяц, Контрагент = &Поставщик) КАК ЗакупкиОбороты
    ГДЕ
        ЗакупкиОбороты.Номенклатура = ВТ_НоменклатураПоЗкупкеОтКонтрагента.Номенклатура

    продажи за период

    ВЫБРАТЬ
        ЗакупкиОбороты.Номенклатура КАК Номенклатура,
        ЗакупкиОбороты.Контрагент
    ПОМЕСТИТЬ ВТ_НоменклатураПоЗкупкеОтКонтрагента
    ИЗ
        РегистрНакопления.Закупки.Обороты(&ДатаНачала, &ДатаОкончанияОтчета, , Контрагент = &Поставщик) КАК ЗакупкиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПродажиОбороты.Период КАК Период,
        ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
        ПродажиОбороты.СтоимостьОборот КАК СтоимостьПродажи
    ПОМЕСТИТЬ ВТ_Продажи3
    ИЗ
        ВТ_НоменклатураПоЗкупкеОтКонтрагента КАК ВТ_НоменклатураПоЗкупкеОтКонтрагента,
        РегистрНакопления.Продажи.Обороты(&ДатаНачалаОтчета, &ДатаОкончанияОтчета, Месяц, ) КАК ПродажиОбороты
    ГДЕ
        ПродажиОбороты.Номенклатура = ВТ_НоменклатураПоЗкупкеОтКонтрагента.Номенклатура
        И ПродажиОбороты.Организация В (&Организация)
        И НЕ ПродажиОбороты.Контрагент В (&Контрагент)
    Объединенная
    ВЫБРАТЬ
        ЗакупкиОбороты.Номенклатура КАК Номенклатура,
        ЗакупкиОбороты.Контрагент
    ПОМЕСТИТЬ ВТ_НоменклатураПоЗкупкеОтКонтрагента
    ИЗ
        РегистрНакопления.Закупки.Обороты(&ДатаНачала, &ДатаОкончанияОтчета, , Контрагент = &Поставщик) КАК ЗакупкиОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЗакупкиОбороты.Период КАК Период,
        ЗакупкиОбороты.КоличествоОборот КАК КоличествоЗакуп,
        ЗакупкиОбороты.СтоимостьОборот КАК СтоимостьЗакуп
    ПОМЕСТИТЬ ВТ_Закупки2
    ИЗ
        ВТ_НоменклатураПоЗкупкеОтКонтрагента КАК ВТ_НоменклатураПоЗкупкеОтКонтрагента,
        РегистрНакопления.Закупки.Обороты(&ДатаНачалаОтчета, &ДатаОкончанияОтчета, Месяц, Контрагент = &Поставщик) КАК ЗакупкиОбороты
    ГДЕ
        ЗакупкиОбороты.Номенклатура = ВТ_НоменклатураПоЗкупкеОтКонтрагента.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПродажиОбороты.Период КАК Период,
        ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
        ПродажиОбороты.СтоимостьОборот КАК СтоимостьПродажи
    ПОМЕСТИТЬ ВТ_Продажи3
    ИЗ
        ВТ_НоменклатураПоЗкупкеОтКонтрагента КАК ВТ_НоменклатураПоЗкупкеОтКонтрагента,
        РегистрНакопления.Продажи.Обороты(&ДатаНачалаОтчета, &ДатаОкончанияОтчета, Месяц, ) КАК ПродажиОбороты
    ГДЕ
        ПродажиОбороты.Номенклатура = ВТ_НоменклатураПоЗкупкеОтКонтрагента.Номенклатура
        И ПродажиОбороты.Организация В(&Организация)
        И НЕ ПродажиОбороты.Контрагент В (&Контрагент)
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТ_Продажи3.Период,
        ЕСТЬNULL(ВТ_Закупки2.КоличествоЗакуп, 0) КАК КоличествоЗакуп,
        ЕСТЬNULL(ВТ_Закупки2.СтоимостьЗакуп, 0) КАК СуммаЗакуп,
        ЕСТЬNULL(ВТ_Продажи3.КоличествоПродажи, 0) КАК КоличествоПродаж,
        ЕСТЬNULL(ВТ_Продажи3.СтоимостьПродажи, 0) КАК СуммаПродаж
    ПОМЕСТИТЬ ВТ_Объединенная
    ИЗ
        ВТ_Продажи3 КАК ВТ_Продажи3
            ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Закупки2 КАК ВТ_Закупки2
            ПО ВТ_Продажи3.Период = ВТ_Закупки2.Период
    • Василий Ханевич


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

      • Letta

        По порядку: 1.Соединения пробовала Левое и Полное, что видно на последнем представленном коде (ВТ_Продажи3 КАК ВТ_Продажи3 ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Закупки2 КАК ВТ_Закупки2 ПО ВТ_Продажи3.Период = ВТ_Закупки2.Период). Хотелось бы все же разобраться почему не идет соединение, пробовала оставлять номенклатуру, все равно не понятно почему соединяет по связи не правильно.
        2. Отборы устанавливала на уровне виртуальных таблиц в которых уверена, очень уж впечатлил пример из видеоурока. Сейчас проверила отборы через ГДЕ и условие в ВТ сравнила результат.
        По вашей рекомендации создала запрос работает, результат сверила. Код прилагаю

        ВЫБРАТЬ
            ПродажиОбороты.Период КАК Период,
            ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
            ПродажиОбороты.СтоимостьОборот КАК СуммаПродажи,
            0 КАК КоличествоЗакупки,
            0 КАК СуммаЗакупки,
            0 КАК КоличествоПродажиВСЕ,
            0 КАК СуммаПродажиВСЕ
        ПОМЕСТИТЬ ВТ
        ИЗ
            РегистрНакопления.Продажи.Обороты(
                    &ДатаНачалаОтчета,
                    &ДатаОкончанияОтчета,
                    Месяц,
                    Организация В (&Организация)
                        И НЕ Контрагент В (&Контрагент)) КАК ПродажиОбороты,
            (ВЫБРАТЬ
                ЗакупкиОбороты.Номенклатура КАК Номенклатура
            ИЗ
                РегистрНакопления.Закупки.Обороты(&ДатаНачала, &ДатаОкончанияОтчета, , Контрагент = &Поставщик) КАК ЗакупкиОбороты) КАК ВложенныйЗапрос
        ГДЕ
            ПродажиОбороты.Номенклатура = ВложенныйЗапрос.Номенклатура
        ОБЪЕДИНИТЬ ВСЕ
        ВЫБРАТЬ
            ЗакупкиОбороты.Период,
            0,
            0,
            ЗакупкиОбороты.КоличествоОборот,
            ЗакупкиОбороты.СтоимостьОборот,
            0,
            0
        ИЗ
            РегистрНакопления.Закупки.Обороты(&ДатаНачалаОтчета, &ДатаОкончанияОтчета, Месяц, Контрагент = &Поставщик) КАК ЗакупкиОбороты
        ОБЪЕДИНИТЬ ВСЕ
        ВЫБРАТЬ
            ПродажиОбороты.Период,
            0,
            0,
            0,
            0,
            ПродажиОбороты.КоличествоОборот,
            ПродажиОбороты.СтоимостьОборот
        ИЗ
            РегистрНакопления.Продажи.Обороты(
                    &ДатаНачалаОтчета,
                    &ДатаОкончанияОтчета,
                    Месяц,
                    Организация В (&Организация)
                        И НЕ Контрагент В (&Контрагент)) КАК ПродажиОбороты
        ГДЕ
            ПродажиОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
        ;
        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
            ВТ.Период КАК Период,
            СУММА(ВТ.КоличествоПродажи) КАК КоличествоПродажи,
            СУММА(ВТ.СуммаПродажи) КАК СуммаПродажи,
            СУММА(ВТ.КоличествоЗакупки) КАК КоличествоЗакупки,
            СУММА(ВТ.СуммаЗакупки) КАК СуммаЗакупки,
            СУММА(ВТ.КоличествоПродажиВСЕ) КАК КоличествоПродажиВСЕ,
            СУММА(ВТ.СуммаПродажиВСЕ) КАК СуммаПродажиВСЕ
        ИЗ
            ВТ КАК ВТ
        СГРУППИРОВАТЬ ПО
            ВТ.Период
        УПОРЯДОЧИТЬ ПО
            Период
        ИТОГИ ПО
            ОБЩИЕ
        • Василий Ханевич


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

          • Letta

            Контрагент и Организация выбираются чтобы не было задвоение продаж (м/у собственными фирмами) Поставщик для отбора номенклатуры закупки по поставщику. Так работает. Получается в моем самом первом варианте левое или полное нельзя сделать?

            ВЫБРАТЬ
                ЗакупкиОбороты.Номенклатура КАК Номенклатура
            ПОМЕСТИТЬ ВТ_Номенклатура
            ИЗ
                РегистрНакопления.Закупки.Обороты(&Дата1, &Дата2, , Контрагент = &Поставщик) КАК ЗакупкиОбороты
            ;
            ////////////////////////////////////////////////////////////////////////////////
            ВЫБРАТЬ
                ПродажиОбороты.Период КАК Период,
                ПродажиОбороты.КоличествоОборот КАК КоличествоПродажи,
                ПродажиОбороты.СтоимостьОборот КАК СуммаПродажи,
                0 КАК КоличествоЗакупки,
                0 КАК СуммаЗакупки
            ПОМЕСТИТЬ ВТ
            ИЗ
                РегистрНакопления.Продажи.Обороты(
                        &НачалоПериода,
                        &КонецПериода,
                        Месяц,
                        НЕ Контрагент В (&Контрагент)
                            И Организация В (&Организация)
                            И Номенклатура В
                                (ВЫБРАТЬ
                                    ВТ_Номенклатура.Номенклатура КАК Номенклатура
                                ИЗ
                                    ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ПродажиОбороты

            ОБЪЕДИНИТЬ ВСЕ

            ВЫБРАТЬ
                ЗакупкиОбороты.Период,
                0,
                0,
                ЗакупкиОбороты.КоличествоОборот,
                ЗакупкиОбороты.СтоимостьОборот
            ИЗ
                РегистрНакопления.Закупки.Обороты(
                        &НачалоПериода,
                        &КонецПериода,
                        Месяц,
                        Контрагент = &Поставщик
                        И Номенклатура В
                            (ВЫБРАТЬ
                                ВТ_Номенклатура.Номенклатура КАК Номенклатура
                            ИЗ
                                ВТ_Номенклатура КАК ВТ_Номенклатура)) КАК ЗакупкиОбороты
            ;

            ////////////////////////////////////////////////////////////////////////////////
            ВЫБРАТЬ
                ВТ.Период КАК Период,
                СУММА(ВТ.КоличествоПродажи) КАК КоличествоПродажи,
                СУММА(ВТ.СуммаПродажи) КАК СуммаПродажи,
                СУММА(ВТ.КоличествоЗакупки) КАК КоличествоЗакупки,
                СУММА(ВТ.СуммаЗакупки) КАК СуммаЗакупки
            ИЗ
                ВТ КАК ВТ
            СГРУППИРОВАТЬ ПО
                ВТ.Период
            • Василий Ханевич


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

  23. Lirina

    Добрый день!
    1.В видео по решению 25-го практического задания у Вас написано в коде :»РеквизитФормыВЗначение(«Отчет»)». Я написала при выполнении задания: «Объект», программа выполняется, а если написать «Отчет», то не выполняется. Ошибка в видео?
    2.Для выполнения 28-го и 29-го практического задания я, несмотря на изучаемую тему, обратилась в конструкторе запроса к физической таблице «Продажи», вместо как у Вас «Продажи.Обороты», получился требуемый результат. Объясните, почему нужно при выполнении таких заданий обращаться к таблице «Продажи.Обороты»?

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


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

      • Lirina

        Спасибо, не ожидала, что так быстро ответите! :-)

  24. sasasupov

    Добрый день. Подскажите какую версию бухгалтерской базы 3.0 вы используете в видео 7 модуля.

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


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

  25. avtom1c

    День добрый! Модуль 7. Перерасчеты. Говорится о РегистрРасчета.ОсновныеНачисленияРаботниковОрганизации, в ЗУП 3.0 его не вижу, он есть в 2,5? Так примеры приводились же на 3,0

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


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

  26. MaxKor

    Здравствуйте! Подскажите пожалуйста, как правильнее написать такой запрос.
    Есть ТаблицаЗначений, в ней колонки Наименование и Артикул (обе строковые). Нужно сравнить эти значения с номенклатурой в БД, также по Наименованию и Артикулу, и в выборку вывести те значения, для которых не нашлось совпадений в БД.

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


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

  27. ids79

    Добрый вечер.
    Просьба временно приостановить мой токен.

    • Кузьмин Сергей


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

  28. ids79

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

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


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

      • ids79

        Доброе утро.
        Спасибо Василий.
        Можно еще несколько вопросов по итогам:
        1. В управлении итогами есть флаг: Разделение итого. Для чего это нужно и как работает?
        2. Пересчет всех итогов за период расчета и текущие итоги, а также сдвиг периода хранения итогов система рассчитывает автоматически при внесении изменений в регистр? Если да, зачем тогда в управлении итогами есть функции пересчета?
        3. В видео Вы говорите, что если итог получился 0, то запрос по остаткам не выдает никаких записей. Почему это так, ведь если проанализировать запрос SQL, будут суммированы все приходы и расходы, и система должна выдать 0, а не отсутствие строки?

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


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

  29. h6.62606896

    Задание 27, пример решения выполнен через объединение запросов.
    Будет ли ошибкой такое решение, через соединение таблиц?

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


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

  30. h6.62606896

    Задание 25
    Почему ошибка? — «Поле объекта не обнаружено (Номенклатура)»

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


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

      • h6.62606896

        Повторил дома, запрос тот же. Ошибки нет.

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


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

  31. dr.mescalero

    Скриншот к предыдущему посту (не нашел как в редактировании его добавить…).

    %D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B93.png

  32. dr.mescalero

    Вечер добрый.
    Задание 24.
    Недоглядел про объединение, и делал по-своему.
    Время выполнения мизерное, результат идентичен эталонному — 27 записей, 0,007с, всё как в скриншоте задания.
    Вопрос, собственно, к чему? Будет ли считаться такой вариант решения ошибкой на экзаменах, или «результат превыше всего»?

    ВЫБРАТЬ
        Закупочные.Номенклатура КАК Товар,
        Закупочные.Цена КАК Закупочная,
        Розничные.Цена КАК Розничная,
        ВЫРАЗИТЬ((Розничные.Цена - Закупочные.Цена) / Закупочные.Цена * 100 КАК ЧИСЛО(10, 3)) КАК Процент
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен.Наименование = "Розничная цена") КАК Розничные
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен.Наименование = "Закупочная цена") КАК Закупочные
            ПО Розничные.Номенклатура = Закупочные.Номенклатура
    УПОРЯДОЧИТЬ ПО
        Товар
    • Василий Ханевич


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

      • avtom1c

        Василий, а если использовать полное соединение?

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


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

  33. Mr.Smoke27

    Модуль 7
    Задание №24
    Я решил немного другим способом, по моему субъективному мнению, проще и нагляднее, но не это ведь самое важное в запросе. Какой способ более правильный и почему? Какие ключевые различия между вашим и моим решением, какой способ будет работать быстрее на нормальных данных?

    ВЫБРАТЬ
        ЗакупочныеЦены.Номенклатура КАК Номенклатура,
        ЗакупочныеЦены.Цена КАК ЦенаЗакупки
    ПОМЕСТИТЬ ВТ_Закупка
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &Закупка) КАК ЗакупочныеЦены
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        РозничныеЦены.Номенклатура КАК Номенклатура,
        РозничныеЦены.Цена КАК ЦенаРозницы
    ПОМЕСТИТЬ ВТ_Розница
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &Розничные) КАК РозничныеЦены
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВЫБОР
            КОГДА ВТ_Закупка.Номенклатура ЕСТЬ NULL
                ТОГДА ВТ_Розница.Номенклатура
            ИНАЧЕ ВТ_Закупка.Номенклатура
        КОНЕЦ КАК Номенклатура,
        ВТ_Закупка.ЦенаЗакупки КАК ЦенаЗакупки,
        ВТ_Розница.ЦенаРозницы КАК ЦенаРозницы,
        ВЫБОР
            КОГДА ВТ_Закупка.ЦенаЗакупки = 0
                ТОГДА 0
            ИНАЧЕ 100 * (ВТ_Розница.ЦенаРозницы - ВТ_Закупка.ЦенаЗакупки) / ВТ_Закупка.ЦенаЗакупки
        КОНЕЦ КАК ПроцентНаценки
    ИЗ
        ВТ_Закупка КАК ВТ_Закупка
            ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Розница КАК ВТ_Розница
            ПО ВТ_Закупка.Номенклатура = ВТ_Розница.Номенклатура
    • Василий Ханевич


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

  34. Akorg

    Вопрос по задаче 21. Я слышал, что сравнения на подобие не очень хороши с точки зрения производительности, т.к. не позволяют использовать индексы. Не лучше ли было с этой точки зрения решение типа:

    ВЫБРАТЬ
        Должности.Ссылка КАК Ссылка
    ПОМЕСТИТЬ Руководители
    ИЗ
        Справочник.Должности КАК Должности
    ГДЕ
        Должности.Наименование ПОДОБНО "%руководитель%"

    ИНДЕКСИРОВАТЬ ПО
        Ссылка
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        КадроваяИсторияСрезПоследних.Сотрудник КАК Сотрудник,
        КадроваяИсторияСрезПоследних.Должность КАК Должность
    ИЗ
        РегистрСведений.КадроваяИстория.СрезПоследних(, ) КАК КадроваяИсторияСрезПоследних
    ГДЕ
        КадроваяИсторияСрезПоследних.Должность В
                (ВЫБРАТЬ
                    Руководители.Ссылка
                ИЗ
                    Руководители КАК Руководители)
    • Василий Ханевич


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

      • Akorg

        Заранее трудно предположить как поведет себя запрос на том или ином наборе данных, но хочется выработать некий стиль, который бы на серьезных объемах данных давал лучший результат (на маленьких — это все равно будет одинаково). Так вот с этой точки зрения как лучше писать — как у меня или как в решении?

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


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

          • Akorg

            Эксперименты на реальной БД привели к следующим выводам. Если условие на наименование накладывается на уровне параметров виртуальной таблицы, то однозначно создание временной таблицы значительно увеличивает время выполнения запроса. Видимо, в этом случае система как раз и проделывает ту же самую предварительную работу по отбору при создании виртуальной таблицы, что и при я при создании временной таблицы. А если условие налагается в секции ГДЕ, то там результаты получаются сравнимые с преимуществом в ту или иную сторону, в зависимости от выбранной виртуальной таблицы.

            • Вячеслав Вязигин

              День добрый!

              Вам необходимо освоить профайлер SQL, там Вы в графическом виде сможете увидеть план исполнения запросов на уровне СУБД, применяемые операторы и используемые индексы. Для проведения исследований это очень хороший инструмент.

              • Akorg

                У нас БД PostgresSQL, а профайлер, насколько я понял, для MS SQL Server.

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


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

  35. zxcv398

    День добрый. В видеоуроке вы рассказываете про виртуальную таблицу ДанныеГрафика для регистра расчета Начисления. А при подготовке перехода на ЗУП 3.1.3 у меня эта таблица пустая. На форумах находила сообщение, что якобы, с какого-то релиза она не заполняется автоматически системой. Подскажите, все-таки на релизе 3.1.3 таблица Начисления.ДанныеГрафика заполняется системой или эти сведения вручную придется собирать?

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


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

  36. Akorg

    Еще эксперименты по задаче 27. Придумал еще один способ решения — с помощью соединений. Все исследования решил сразу проводить на реальной нашей БД за полгода. Ниже приведены 3 варианта запроса и планы их исполнения. Результат получился неожиданным. Самым медленным получился вариант с объединением, затем с соединением (я думал он будет самым плохим), лучший — без соединений и объединений. Можно это прокомментировать? (Возможно, я не умею правильно анализировать данные плана запроса).
    PS. Посмотрел внимательнее на запрос с объединением — увидел некорректность сравнения: во временных таблицах не выполняется группировка, как в других запросах. Исправил это и получил ожидаемый результат. Так что вопрос можно снимать.

    Вариант 1 (объединения)

    ВЫБРАТЬ
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент КАК АналитикаУчетаПоПартнерамКонтрагент,
        ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК Тоары,
        0 КАК Услуги
    ПОМЕСТИТЬ ВременнаяТаблица
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Дата1, &Дата2, , АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)) КАК ВыручкаИСебестоимостьПродажОбороты

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент,
        0,
        ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Дата1, &Дата2, , АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)) КАК ВыручкаИСебестоимостьПродажОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВременнаяТаблица.АналитикаУчетаПоПартнерамКонтрагент КАК АналитикаУчетаПоПартнерамКонтрагент,
        СУММА(ВременнаяТаблица.Тоары) КАК Тоары,
        СУММА(ВременнаяТаблица.Услуги) КАК Услуги
    ИЗ
        ВременнаяТаблица КАК ВременнаяТаблица

    СГРУППИРОВАТЬ ПО
        ВременнаяТаблица.АналитикаУчетаПоПартнерамКонтрагент

    УПОРЯДОЧИТЬ ПО
        АналитикаУчетаПоПартнерамКонтрагент
    ------------------------------------------------------------------------
    "aggregate  (cost=2.03..2.04 rows=1 width=22) (actual time=0.056..0.056 rows=1 loops=1)
      ->  seq scan on  t1  (cost=0.00..1.01 rows=1 width=22) (actual time=0.009..0.010 rows=1 loops=1)
            filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.119 ms
    execution time: 0.105 ms
    ",rowsaffected=1

    "aggregate  (cost=2.03..2.04 rows=1 width=22) (actual time=0.038..0.038 rows=1 loops=1)
      ->  seq scan on  t1  (cost=0.00..1.01 rows=1 width=22) (actual time=0.006..0.006 rows=1 loops=1)
            filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.079 ms
    execution time: 0.078 ms
    ",rowsaffected=1



    'sort  (cost=66.05..67.35 rows=520 width=35) (actual time=3.889..3.931 rows=520 loops=1)
      sort key: _q_001_f_000_type, _q_001_f_000_rtref, _q_001_f_000_rrref
      sort method: quicksort  memory: 65kb
      ->  hashaggregate  (cost=34.80..42.60 rows=520 width=35) (actual time=1.797..2.037 rows=520 loops=1)
            group key: _q_001_f_000_type, _q_001_f_000_rtref, _q_001_f_000_rrref
            ->  seq scan on tt4 t1  (cost=0.00..21.02 rows=1102 width=35) (actual time=0.008..0.177 rows=1102 loops=1)
    planning time: 0.144 ms
    execution time: 4.025 ms
    ',rowsaffected=520

    Вариант 2 (без объединений и соединений)

    ВЫБРАТЬ
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент КАК Контрагент,
        СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК Товары,
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар) КАК ЭтоТовар
    ПОМЕСТИТЬ ВременнаяТаблица
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Дата1, &Дата2, , ) КАК ВыручкаИСебестоимостьПродажОбороты

    СГРУППИРОВАТЬ ПО
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент,
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВременнаяТаблица.Контрагент КАК Контрагент,
        СУММА(ВЫБОР
                КОГДА ВременнаяТаблица.ЭтоТовар
                    ТОГДА ВременнаяТаблица.Товары
                ИНАЧЕ 0
            КОНЕЦ) КАК Товары,
        СУММА(ВЫБОР
                КОГДА НЕ ВременнаяТаблица.ЭтоТовар
                    ТОГДА ВременнаяТаблица.Товары
                ИНАЧЕ 0
            КОНЕЦ) КАК Услуги
    ИЗ
        ВременнаяТаблица КАК ВременнаяТаблица

    СГРУППИРОВАТЬ ПО
        ВременнаяТаблица.Контрагент

    УПОРЯДОЧИТЬ ПО
        Контрагент
    ------------------------------------------------------------------
    "seq scan on  t1  (cost=0.00..1.01 rows=1 width=36) (actual time=0.013..0.013 rows=1 loops=1)
      filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.267 ms
    execution time: 0.029 ms
    ",rowsaffected=1

    "aggregate  (cost=2.03..2.04 rows=1 width=22) (actual time=0.279..0.279 rows=1 loops=1)
      ->  seq scan on  t1  (cost=0.00..1.01 rows=1 width=22) (actual time=0.012..0.013 rows=1 loops=1)
            filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.252 ms
    execution time: 1.056 ms
    ",rowsaffected=1

    "index scan using config_pkey on config  (cost=0.41..8.43 rows=1 width=103) (actual time=0.042..0.042 rows=0 loops=1)
      index cond: ((filename = 'cc9cedf1-410d-414a-a05f-f167b8908470.3'::mvarchar) and (partno = 0))
    planning time: 0.299 ms
    execution time: 0.061 ms
    ",rowsaffected=0



    'sort  (cost=48.09..49.39 rows=520 width=33) (actual time=2.811..2.855 rows=520 loops=1)
      sort key: _q_001_f_000_type, _q_001_f_000_rtref, _q_001_f_000_rrref
      sort method: quicksort  memory: 65kb
      ->  hashaggregate  (cost=16.84..24.64 rows=520 width=33) (actual time=0.840..1.069 rows=520 loops=1)
            group key: _q_001_f_000_type, _q_001_f_000_rtref, _q_001_f_000_rrref
            ->  seq scan on tt2 t1  (cost=0.00..10.26 rows=526 width=33) (actual time=0.008..0.093 rows=526 loops=1)
    planning time: 0.150 ms
    execution time: 2.934 ms
    ',rowsaffected=520

    Вариант 3 (соединение)

    ВЫБРАТЬ
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент КАК АналитикаУчетаПоПартнерамКонтрагент,
        СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК СуммаВыручкиОборот
    ПОМЕСТИТЬ Товары
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Дата1, &Дата2, , АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)) КАК ВыручкаИСебестоимостьПродажОбороты

    СГРУППИРОВАТЬ ПО
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент КАК АналитикаУчетаПоПартнерамКонтрагент,
        СУММА(ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот) КАК СуммаВыручкиОборот
    ПОМЕСТИТЬ Услуги
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&Дата1, &Дата2, , АналитикаУчетаНоменклатуры.Номенклатура.ВидНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)) КАК ВыручкаИСебестоимостьПродажОбороты

    СГРУППИРОВАТЬ ПО
        ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Контрагент
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЕСТЬNULL(Товары.АналитикаУчетаПоПартнерамКонтрагент, Услуги.АналитикаУчетаПоПартнерамКонтрагент) КАК Контрагент,
        Товары.СуммаВыручкиОборот КАК Товары,
        Услуги.СуммаВыручкиОборот КАК Услуги
    ИЗ
        Товары КАК Товары
            ПОЛНОЕ СОЕДИНЕНИЕ Услуги КАК Услуги
            ПО (Товары.АналитикаУчетаПоПартнерамКонтрагент = Услуги.АналитикаУчетаПоПартнерамКонтрагент)

    УПОРЯДОЧИТЬ ПО
        Контрагент
    --------------------------------------------------------------------
    "aggregate  (cost=2.03..2.04 rows=1 width=22) (actual time=0.056..0.056 rows=1 loops=1)
      ->  seq scan on  t1  (cost=0.00..1.01 rows=1 width=22) (actual time=0.009..0.009 rows=1 loops=1)
            filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.118 ms
    execution time: 0.105 ms
    ",rowsaffected=1



    "aggregate  (cost=2.03..2.04 rows=1 width=22) (actual time=0.056..0.056 rows=1 loops=1)
      ->  seq scan on  t1  (cost=0.00..1.01 rows=1 width=22) (actual time=0.008..0.009 rows=1 loops=1)
            filter: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (_regid = '\\xf1ed9ccc0d414a41a05ff167b8908470'::bytea))
    planning time: 0.115 ms
    execution time: 0.103 ms
    ",rowsaffected=1



    'sort  (cost=86.10..87.36 rows=505 width=156) (actual time=3.045..3.074 rows=520 loops=1)
      sort key: (case when ("*select* 1".sdbl_decomp_1_type is null) then "*select* 1".sdbl_decomp_3_type else "*select* 1".sdbl_decomp_1_type end), (case when ("*select* 1".sdbl_decomp_1_type is null) then "*select* 1".sdbl_decomp_3_rtref else "*select* 1".sdbl_decomp_1_rtref end), (case when ("*select* 1".sdbl_decomp_1_type is null) then "*select* 1".sdbl_decomp_3_rrref else "*select* 1".sdbl_decomp_1_rrref end)
      sort method: quicksort  memory: 65kb
      ->  result  (cost=1.60..63.42 rows=505 width=156) (actual time=0.043..1.210 rows=520 loops=1)
            ->  append  (cost=1.60..63.42 rows=505 width=156) (actual time=0.041..1.043 rows=520 loops=1)
                  ->  subquery scan on "*select* 1"  (cost=1.60..17.75 rows=22 width=63) (actual time=0.041..0.261 rows=6 loops=1)
                        ->  hash join  (cost=1.60..17.54 rows=22 width=63) (actual time=0.040..0.259 rows=6 loops=1)
                              hash cond: ((t2._q_001_f_000_type = t3._q_001_f_000_type) and (t2._q_001_f_000_rtref = t3._q_001_f_000_rtref) and (t2._q_001_f_000_rrref = t3._q_001_f_000_rrref))
                              ->  seq scan on tt5 t2  (cost=0.00..10.04 rows=504 width=32) (actual time=0.008..0.062 rows=504 loops=1)
                              ->  hash  (cost=1.22..1.22 rows=22 width=31) (actual time=0.019..0.019 rows=22 loops=1)
                                    buckets: 1024  batches: 1  memory usage: 2kb
                                    ->  seq scan on tt6 t3  (cost=0.00..1.22 rows=22 width=31) (actual time=0.002..0.008 rows=22 loops=1)
                  ->  subquery scan on "*select* 2"  (cost=18.86..20.34 rows=1 width=159) (actual time=0.299..0.316 rows=16 loops=1)
                        ->  hash anti join  (cost=18.86..20.33 rows=1 width=31) (actual time=0.299..0.312 rows=16 loops=1)
                              hash cond: ((t4._q_001_f_000_type = t5._q_001_f_000_type) and (t4._q_001_f_000_rtref = t5._q_001_f_000_rtref) and (t4._q_001_f_000_rrref = t5._q_001_f_000_rrref))
                              ->  seq scan on tt6 t4  (cost=0.00..1.22 rows=22 width=31) (actual time=0.002..0.004 rows=22 loops=1)
                              ->  hash  (cost=10.04..10.04 rows=504 width=24) (actual time=0.289..0.289 rows=504 loops=1)
                                    buckets: 1024  batches: 1  memory usage: 28kb
                                    ->  seq scan on tt5 t5  (cost=0.00..10.04 rows=504 width=24) (actual time=0.004..0.108 rows=504 loops=1)
                  ->  subquery scan on "*select* 3"  (cost=1.60..25.33 rows=482 width=160) (actual time=0.025..0.406 rows=498 loops=1)
                        ->  hash anti join  (cost=1.60..20.51 rows=482 width=32) (actual time=0.023..0.332 rows=498 loops=1)
                              hash cond: ((t6._q_001_f_000_type = t7._q_001_f_000_type) and (t6._q_001_f_000_rtref = t7._q_001_f_000_rtref) and (t6._q_001_f_000_rrref = t7._q_001_f_000_rrref))
                              ->  seq scan on tt5 t6  (cost=0.00..10.04 rows=504 width=32) (actual time=0.004..0.065 rows=504 loops=1)
                              ->  hash  (cost=1.22..1.22 rows=22 width=24) (actual time=0.014..0.014 rows=22 loops=1)
                                    buckets: 1024  batches: 1  memory usage: 2kb
                                    ->  seq scan on tt6 t7  (cost=0.00..1.22 rows=22 width=24) (actual time=0.001..0.003 rows=22 loops=1)
    planning time: 0.500 ms
    execution time: 3.191 ms
    ',rowsaffected=520
    • Василий Ханевич


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

  37. Akorg

    Вопрос по задаче 27. Я вижу здесь два варианта решения. (Сейчас нахожусь в другом городе и решения преподавателя просматривать не могу).

    Вариант 1 (с объединениями, как сказано в теме задачи)

    ВЫБРАТЬ
        ПродажиОбороты.Контрагент КАК Контрагент,
        ПродажиОбороты.СуммаОборот КАК Товары,
        0 КАК Услуги
    ПОМЕСТИТЬ ВременнаяТаблица
    ИЗ
        РегистрНакопления.Продажи.Обороты(, , , Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)) КАК ПродажиОбороты

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        ПродажиОбороты.Контрагент,
        0,
        ПродажиОбороты.СуммаОборот
    ИЗ
        РегистрНакопления.Продажи.Обороты(, , , Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) КАК ПродажиОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВременнаяТаблица.Контрагент КАК Контрагент,
        СУММА(ВременнаяТаблица.Товары) КАК Товары,
        СУММА(ВременнаяТаблица.Услуги) КАК Услуги
    ИЗ
        ВременнаяТаблица КАК ВременнаяТаблица

    СГРУППИРОВАТЬ ПО
        ВременнаяТаблица.Контрагент

    Вариант 2 (без объединений)

    ВЫБРАТЬ
        ПродажиОбороты.Контрагент КАК Контрагент,
        СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаОборот,
        ПродажиОбороты.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар) КАК ЭтоТовар
    ПОМЕСТИТЬ ВременнаяТаблица
    ИЗ
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

    СГРУППИРОВАТЬ ПО
        ПродажиОбороты.Контрагент,
        ПродажиОбороты.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПродажиОбороты.Контрагент КАК Контрагент,
        СУММА(ВЫБОР
                КОГДА ПродажиОбороты.ЭтоТовар
                    ТОГДА ПродажиОбороты.СуммаОборот
                ИНАЧЕ 0
            КОНЕЦ) КАК Товары,
        СУММА(ВЫБОР
                КОГДА НЕ ПродажиОбороты.ЭтоТовар
                    ТОГДА ПродажиОбороты.СуммаОборот
                ИНАЧЕ 0
            КОНЕЦ) КАК Услуги
    ИЗ
        ВременнаяТаблица КАК ПродажиОбороты

    СГРУППИРОВАТЬ ПО
        ПродажиОбороты.Контрагент

    На учебной БД план запросов показывает одинаковые результаты, однако на реальной нашей БД ЕРП за полгода запрос второго вида дает более быстрый результат. Получается лучше делать без объединений?

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


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

      • Akorg

        А разве так не на любой БД должно быть? Ведь нам в любом случае понадобятся все записи, а при объединении мы дважды накладываем отбор, да еще и по не индексированному полю.

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


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

  38. Klinval

    Практическое задание №28. Получение процентов от общего количества запросом. Я решил вот так:

    ВЫБРАТЬ
        ПродажиОбороты.Номенклатура КАК Номенклатура,
        ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
        ПродажиОбороты.КоличествоОборот / СУММА(ПродажиОбороты1.КоличествоОборот) * 100 КАК Процент
    ИЗ
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты,
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты1

    СГРУППИРОВАТЬ ПО
        ПродажиОбороты.Номенклатура,
        ПродажиОбороты.КоличествоОборот
    ИТОГИ
        СУММА(КоличествоОборот),
        СУММА(Процент)
    ПО
        ОБЩИЕ

    Результат идентичен вашему. Моё решение решается за один пакет запросов. Ваше же решение предполагает одно обращение к БД, но 2 временные таблицы.

    ВЫБРАТЬ
        ПродажиОбороты.Номенклатура КАК Номенклатура,
        ПродажиОбороты.КоличествоОборот КАК КоличествоОборот
    ПОМЕСТИТЬ ВТ
    ИЗ
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        СУММА(ВТ.КоличествоОборот) КАК КоличествоОборот
    ПОМЕСТИТЬ ВТ_Всего
    ИЗ
        ВТ КАК ВТ
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТ.Номенклатура,
        ВТ.КоличествоОборот КАК КоличествоОборот,
        100 * ВТ.КоличествоОборот / ВТ_Всего.КоличествоОборот КАК Процент
    ИЗ
        ВТ КАК ВТ,
        ВТ_Всего КАК ВТ_Всего
    ИТОГИ
        СУММА(КоличествоОборот),
        СУММА(Процент)
    ПО
        ОБЩИЕ

    Можете прокомментировать моё решение: насколько оно хуже (или идентично) вашему?

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


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

      • chumavik

        Тоже решил задачу способом, отличным от способа преподавателя.

        ВЫБРАТЬ
            ПродажиОбороты.КоличествоОборот КАК ОбщееКоличество
        ПОМЕСТИТЬ втОбщееКоличество
        ИЗ
            РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
            ПродажиОбороты.Номенклатура КАК Номенклатура,
            ПродажиОбороты.КоличествоОборот КАК Количество,
            ПродажиОбороты.КоличествоОборот / втОбщееКоличество.ОбщееКоличество * 100 КАК Процент
        ИЗ
            РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
                ЛЕВОЕ СОЕДИНЕНИЕ втОбщееКоличество КАК втОбщееКоличество
                ПО (ИСТИНА)
        ИТОГИ
            СУММА(Количество),
            СУММА(Процент)
        ПО
            ОБЩИЕ

        За 2 пакета запросов, но с двумя чтениями таблицы. Вариант преподавателя более правильный, хотя и менее очевидный.

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


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

  39. Klinval

    Здравствуйте!

    Тема: «Параметры виртуальной таблицы оборотов (про регистр бухгалтерии)»
    Текст: «Параметры виртуальной таблицы оборотов позволяют задать условие отбора данных из информационной базы. Параметры следует задавать строго в порядке их описания:»

    Меня интересует фраза: «Параметры следует задавать строго в порядке их описания» . В принципе сама фраза понятно и суть понятна, но не понятно что будет если её не соблюсти? Если я сначала заполню КонецПериода, а потом НачалоПериода или сначала КорСубконто, а потом УсловиеСчета то что нарушится или сломается?

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


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

  40. vkul2010

    Здравствуйте, Василий.
    Не понял про МетодДополнения с параметром ДвиженияИГраницыПериода
    Задал заведомо более широкий период нежели период, за который есть движения в регистре ТоварныеЗапасы:
    Дата1=01.01.2012, Дата2=31.12.2012 (демо «Управляемое приложение»). Однако в результате выполнения запроса

    ВЫБРАТЬ
        ТоварныеЗапасыОстаткиИОбороты.Период КАК Период,
        ТоварныеЗапасыОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот
    ИЗ
        РегистрНакопления.ТоварныеЗапасы.ОстаткиИОбороты(&Дата1, &Дата2, Месяц, ДвиженияИГраницыПериода, ) КАК ТоварныеЗапасыОстаткиИОбороты

    УПОРЯДОЧИТЬ ПО
        Период

    не увидел записей с датами 01.01.2012 и 01.12.2012
    В результате отразились только записи с движениями.
    Т.е. разницы между ДвиженияИГраницыПериода и Движения в данном случае не увидел.
    Ведь в теории: «если выбирается вариант ДвиженияИГраницыПериода, то граничные периоды будут включаться независимо от наличия или отсутствия движений в рамках интервала»?

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


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

      • vkul2010

        Спасибо. Понял, необходимым условием д.б. наличие остатков на границах периода.
        Просто у меня прошла ассоциация с 7-чной группировкой в запросе типа «Группировка Месяц все;», когда независимо от наличия остатков или движений выводятся периоды.
        Поэтому и выбрал я в запросе только обороты, зная, что на конец периода 01.12.2012 остатки точно есть и запрос мне выдаст эту строку с остатками.

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


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

  41. vkul2010

    Здравствуйте, Василий.
    Задание 24 сначала выполнил так:

    ВЫБРАТЬ
        Закупочная.Номенклатура КАК Товар,
        ЕСТЬNULL(Закупочная.Цена, 0) КАК Закупочная,
        ЕСТЬNULL(Розничная.Цена, 0) КАК Розничная,
        ВЫБОР
            КОГДА ЕСТЬNULL(Закупочная.Цена, 0) = 0
                ТОГДА 0
            ИНАЧЕ ЕСТЬNULL(Розничная.Цена, 0) / ЕСТЬNULL(Закупочная.Цена, 0) * 100 - 100
        КОНЕЦ КАК Наценка
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенРозн) КАК Розничная
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенЗакуп) КАК Закупочная
            ПО (Закупочная.Номенклатура = Розничная.Номенклатура)

    Потом увидел, что Вы использовали 2 временных таблицы. Да и само задание озаглавлено «Объединение запросов». Понял, что был невнимателен. Но возник вопрос — какой запрос производительнее? Посмотрел на статистику:
    мой — Statistics: RecordsScanned = 270, ParseTime = 0, ExecuteTime = 0, BuffersMemory = 25712, ResultRecords = 27, RecordSize = 56
    Ваш — Statistics: RecordsScanned = 27, ParseTime = 0, ExecuteTime = 0, BuffersMemory = 25362, ResultRecords = 27, RecordSize = 81
    правильно ли я понимаю, что показатель RecordsScanned говорит о «тормознутости» моего запроса к Вашему как 10:1 ? (вопрос может быть и не в тему, но раз уж мы используем консоль запросов с такими опциями)

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


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

  42. Александр

    Добрый день
    В решении задания 25 непонятно зачем нужны итоги по номенклатуре? Ведь это, по сути, уже детальные записи, сгруппированные самой виртуальной таблицей.

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


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

  43. Vladislav222

    Задание 24. решил так

    ВЫБРАТЬ
        Закупочная.Номенклатура,
        Закупочная.Цена КАК ЦенаЗакупочная,
        Розничная.Цена КАК ЦенаРозничная,
        (Розничная.Цена - Закупочная.Цена) / (Закупочная.Цена * 0.01) КАК ПроцентНаценки
    ИЗ
        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                ,
                ТипЦен.Наименование В
                    (ВЫБРАТЬ
                        ТипыЦен.Наименование
                    ИЗ
                        Справочник.ТипыЦен КАК ТипыЦен
                    ГДЕ
                        ТипыЦен.Наименование ПОДОБНО "%Закупочная цена%")) КАК Закупочная
            ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
                    ,
                    ТипЦен.Наименование В
                        (ВЫБРАТЬ
                            ТипыЦен.Наименование
                        ИЗ
                            Справочник.ТипыЦен КАК ТипыЦен
                        ГДЕ
                            ТипыЦен.Наименование ПОДОБНО "%Розничная цена%")) КАК Розничная
            ПО Закупочная.Номенклатура = Розничная.Номенклатура
    • Василий Ханевич


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

      • Vladislav222

        спасибо за поправки.

        P.S. получается в работе при использовании соединении в запросах, нужно всегда «подстраховываться» не забывать проверять значения NULL?

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


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

  44. Dmitlion

    Добрый день. Попался запрос к срезу последних регистра сведений, который получает данные из «реквизитов» этого регистра. Каким образом получаются значения реквизитов в срезе последних и чем реквизит отличается от ресурса в этом контексте? Тот же вопрос по другим видам регистров.

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


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

  45. Dmitlion

    Задумался про реквизит «Активность» для регистров сведений, накопления и бух. В каких ситуациях активность может стать = «Ложь»? Иногда в запросе удобно обратиться именно к физической таблице. Насколько в реальных базах можно нарваться на неактивные записи?

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


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

  46. Любовь

    Добрый день! Возможно, мой вопрос в целом не по теме курса, но по информации из видео 2 модуля 7. В этом уроке озвучивается новая особенность организации таблиц БД для платформы 8.3 — для регистра сведений теперь создается таблица итогов среза последних/первых, если в конфигураторе для этого регистра сделаны определенные настройки. Вопрос по использованию этой новой возможности — чем руководствоваться при выборе использовать/не использовать?
    Заранее спасибо за ответ / переадресацию к информации, где это можно почитать)

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


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

  47. wins

    27 задача.

    1. Почему нельзя проще сделать?

    ВЫБРАТЬ
      ПродажиОбороты.Контрагент КАК Контрагент,
      СУММА(ВЫБОР
     КОГДА ПродажиОбороты.Номенклатура.ВидНоменклатуры = Значение(Перечисление.ВидыНоменклатуры.Услуга)
      ТОГДА ПродажиОбороты.СуммаОборот
      ИНАЧЕ 0
     КОНЕЦ) КАК СуммаУслуги,
    СУММА(ВЫБОР
     КОГДА ПродажиОбороты.Номенклатура.ВидНоменклатуры = Значение(Перечисление.ВидыНоменклатуры.Товар)
      ТОГДА ПродажиОбороты.СуммаОборот
      ИНАЧЕ 0
     КОНЕЦ) КАК СуммаТовары
    ИЗ
        РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

    СГРУППИРОВАТЬ ПО
        ПродажиОбороты.Контрагент

    2. Почему во всех примерах не используется «значение»
    В данном случае — это жесткое требование для конкретного отчета.

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


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

  48. wins

    Задание 24.
    1. Подскажите, пожалуйста, почему используется логика — в три «запроса».
    Хотя там же на втором — можно получить результат
    Например вот так:

    (СУММА(ВТ_Цены.ЦенаРозница) / СУММА(ВТ_Цены.ЦенаЗакупка) — 1) * 100

    2. В решениях нет проверки на ноль. Как для обучающего курса, не думаю что это хорошо.

    3. Чем приведенный вариант решения — лучше или хуже соединения?

    4. Что и где настроить, чтобы ответы приходили на почту?

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


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

  49. KripWorland

    Здравствуйте. Немного не по теме, но возможно ли используя запросы решить такую задачу:
    Есть две таблицы, в первой одна колонка, во второй две. Общих полей нет.
    Нужно склеить таблицы, чтобы получилось следующее:
    Таб1.Поле1 Таб2.Поле1 Таб2.Поле2
    запись1 запись1 запись1
    запись2 запись2 запись2

    и так столько строк, сколько в наименьшей из таблиц

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


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

      • KripWorland

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

        %D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0.jpg

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


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

          • KripWorland

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

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


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

              • KripWorland

                Благодарю, всё понятно. Но в данном случае и слияние проще сделать программным кодом, т.к. обе таблицы — результат запроса. Просто хотелось максимально решить запросами.
                Еще раз спасибо за помощь.

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