Как не изобретать велосипед при разработке отчетов (22 минуты видео)



При построении отчетов есть ряд задач, которые при решении «в лоб» часто приводят к написанию тяжелых запросов или запросам в цикле или ручному выводу данных в таблицу.

Вот примеры таких задач:

  • Получение нарастающего объема продаж по месяцам, например, для вывода в виде диаграммы
  • Расчет разницы продаж текущего и предыдущего периода – для всех строк отчета
  • Сравнение объема продаж каждого менеджера с эталонным значением, которое вычисляется в ходе формирования этого отчета
  • Получение нарастающего итога по горизонтали и вертикали в кросс-таблицах

И все эти задачи решаются элементарно с помощью функций СКД – буквально за пару минут. Без запросов в цикле и кривого кода.

Сегодня рассмотрим использование некоторых функций СКД на конкретных примерах.

Видео 1. Как получить сумму в отчете нарастающим итогом?

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

На самом деле эту задачу можно решить и с помощью запроса (без функций СКД), но есть 2 проблемы:

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

С помощью функций СКД эта задача решается одной строчкой кода, и отчет будет работать максимально быстро, смотрим:

Видео 2. Как получить значение из предыдущей строки отчета?

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

Приведем несколько примеров, когда это может быть полезно:

  • Анализ дебиторской задолженности по дням – вычисляем тренд и абсолютное увеличение или уменьшение задолженности относительно прошлого периода
  • Анализ курсов валют и оценка прибыли или убытков от курсовой разницы – нужно получить дельту между текущим и предыдущим курсом и умножить на остаток денежных средств в валюте.

Такие задачи также трудоемко решить с помощью запроса, а в СКД это делается одной строкой:

Видео 3. Как сравнить итог по текущей строке с эталонным значением?

Пример, когда этот функционал может быть полезен:

  • В системе ведется учет продаж менеджерами
  • Руководитель отдела ведет личные продажи наряду с менеджерами
  • Требуется вывести отчет по продажам в разрезе менеджеров
  • В отчет также необходимо выводить дельту относительно объема продаж руководителя отдела.

То есть речь о том, что нужно сравнить каждую строку продаж менеджера с продажами руководителя отдела.

А эти данные могут, например, использоваться для начисления премии.

И опять же с помощью СКД эта задача решается в одну строку:

Видео 4. Получение нарастающего итога в кросс-таблице

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

Мы покажем, как с помощью одного параметра СКД управлять направлением расчета итогов:

Видео 5. Вывод табличной части в отдельной ячейке отчета

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

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

В СКД эта задача вновь решается одной функцией:

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

Эта тема детально раскрыта в курсе:

«Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)»

Поддержка – 2 месяца. Объем курса – 34 учебных часа.

Не откладывайте свое обучение!

40 комментариев к “Как не изобретать велосипед при разработке отчетов (22 минуты видео)

  1. Serge_ASB сказал:

    Добрый день.
    Скажите, а как изменить запрос СКД, если мне нужно выводить динамику (скажем, курсов валют по дням) не по одной валюте, а по всем?

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

      Добрый день!
      Можно использовать простой текст запроса набора данных:

      ВЫБРАТЬ
          КурсыВалют.Период,
          КурсыВалют.Валюта,
          КурсыВалют.Курс
      ИЗ
          РегистрСведений.КурсыВалют КАК КурсыВалют

      Поле Курс определяем как ресурс.
      В настройках компоновки добавим диаграмму (тип диаграммы – график), у которой в точках будет Период, а в сериях – Валюта:
      Диаграмма
      В таком случае получим график изменения курса валют по дням.

  2. kulcha сказал:

    Добрый день. Как можно рассчитать разницу между продажами за текущий месяц и такой же месяц предыдущего года ?

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

      Добрый день!
      Можно использовать объединение двух наборов данных – запросов. В каждом из них будут одинаковые тексты запросов, но разные параметры – периоды, задающие интервал времени для получения из базы данных о продажах.
      В курсе по СКД рассматривается пример такого отчета.

  3. Сураев Игорь сказал:

    Добрый день. У Вас очень много очень полезных уроков, но найти их в общем списке крайне тяжело. Данные уроки пришлось искать полчаса путем просматривания всех новостей за полгода.
    К чему я: ну очень хотелось бы какую-то систематизацию данных для поиска подобных уроков. Или чтобы я мог сам для себя сохранить в личном кабинете интересующие для себя ссылки на новости со своими комментариями.

    • Насипов Фарит сказал:

      Проходите курсы – там раз в 20 больше, строго по порядку и систематизировано.

      А примеры.. – на то они и примеры, чтобы просто показывать примеры :)

  4. Владимир сказал:

    Спасибо за примеры,
    жаль что их так мало у 1С.

    Вернуться к вашей публикации меня натолкнула интересная комбинация с итогами в СКД, для которой пока не удалось найти решение, допускаю что Вы его знаете.
    Отчет содержит несколько вертикальных итогов, к которым нужно добавить еще один итог, который должен отображаться не самого нижнего уровня из 5-ти существующих, а с 3-го где данные нижних уровней не должны участвовать в этом итоге, данные для данного итога формируются отдельным запросом и присоединяются левым соединением к основному запросу. Для требуемого итога была использована следующее выражение в ресурсах: Сумма(ВычислитьВыражениеСГруппировкойМассив(“Остаток”, “Валюта”))
    где “Валюта” и есть та группировка с которой нужно начать считать итоги. Отчет правильно работал до тех пока была только одна валюта, как только валют стало больше, результат становился не верным и не объяснимым с точки зрения арифметики, соотношение между валютами примерно соблюдалось, но сами цифры отличались например в 2,28 раза. Учитывая, что нужно формировать итоги для данных из левого соединения была сделана попытка решить задачу через связанные наборы данных, но результат был точно таким же.
    Буду Вам очень благодарен если подскажите хотя бы идею решения. Спасибо!

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

      Добрый день!
      Затрудняюсь однозначно подсказать вам. Я бы попробовал первым делом добавить соединение в запрос или соединение с дополнительным набором данных, собственно как вы и пишете. Далее проверял бы сами данные, которые возвращает запрос. Т.е. в настройках компоновки делаю одну группировку – детальные записи. Анализирую, какой получается результат. Все ли данные корректно выбираются из базы, нет ли задвоений и т.д. После этого добавлять группировки, смотреть, какой результат получается, как отрабатывают выражения для ресурсов. Вот в таком направлении я бы пробовал решать задачу.

  5. Анатолий сказал:

    Огромное спасибо за видео уроки.С удовольствием посмотрел, очень познавательно. У меня вопрос: “Почему при условном оформлении вычисляемых (и пользовательских) полей выдаётся ошибка “Поле не найдено.”?”. Непонятно,чем отличается вычисляемое (или пользователькое) поле?

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

      Добрый день!
      Подобная ошибка может возникать, когда для вычисляемого поля не задается выражение, а только выражение на закладке Ресурсы. Получается, что на уровне детальных записей такое вычисляемое поле не определено, оно существует только на уровне группировки. Поэтому, когда мы пытаемся использовать это поле в детальных записях, то возникает такая ошибка.
      Пользовательское поле можно создать самостоятельно и при работе с отчетом в режиме “1С:Предприятие”, а вычисляемое поле может создать только разработчик при создании схемы компоновки данных.

  6. skv_79 сказал:

    Объясните, пожалуйста: почему нужно накладывать именно на уровне ресурсов все выражения? Не могу понять ключевые различия между описанием функции в вычисляемом поле и на уровне ресурса.

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

      Добрый день!
      Потому что мы хотим рассчитать итоговое значение выражения на уровне группировки, а не в детальных записях. Поэтому обращаемся к закладке Ресурсы в конструкторе схемы компоновки. Если планируем рассчитать значение на уровне детальных записей, то нужно задать выражение на закладке Вычисляемые поля.

  7. Esagila сказал:

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

    Спасибо за курс. За содержание и такое профессиональное объяснение.

    Спасибо за комментарии. Отдельное спасибо Snouphruh

  8. Dmitry K сказал:

    Этот материал есть в курсе который закончился 01.07? Есть смысл пересматривать?

    • Евгений Гилев (Мастер-тренер) сказал:

      Добрый день!

      Этот материал входит в курс, поэтому отдельно изучать покупателям не требуется

      Другие материалы по СКД, публиковавшиеся в июле, будут включены в курс сегодня-завтра.

      Ссылка на обновление будет выложена на стартовой странице курса.

  9. Крынецкий Александр сказал:

    Все хорошо, но есть поправка к первому видео.
    На вкладке “Вычисляемые поля” для добавляемых полей, все же лучше вписать в выражение: 0 (ноль, без кавычек). В противном случае, когда вы добавите детальные записи и попробуете в них вывести это поле – будет ошибка: “Поле не найдено …”(проверял на платформе 1С:Предприятие 8.3 (8.3.8.1502))

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

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

  10. Upit78 сказал:

    Спасибо огромное! С помощью этих уроков стало в том числе понятно, как быстро и просто пронумеровать по порядку строки отчета.

    • Snouphruh сказал:

      в принципе, это делается в запросе:

      ВЫБРАТЬ
      Номенклатура,
      КоличествоОборот Количество,
      СтоимостьОборот Сумма

      ПОМЕСТИТЬ
      ВТ_Номенклатура

      ИЗ
      РегистрНакопления.Продажи.Обороты

      ИНДЕКСИРОВАТЬ ПО
      Номенклатура

      ;

      ВЫБРАТЬ
      КОЛИЧЕСТВО (Т2.Номенклатура) Порядок,
      Т1.Номенклатура,
      Т1.Количество,
      Т1.Сумма

      ИЗ
      ВТ_Номенклатура Т1

      ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Номенклатура Т2
      ПО Т2.Номенклатура < Т1.Номенклатура

      СГРУППИРОВАТЬ ПО
      Т1.Номенклатура,
      Т1.Количество,
      Т1.Сумма

      УПОРЯДОЧИТЬ ПО
      Порядок

      • Роман сказал:

        ну да тэта-соединением и пользовались еще в 8.1 пока не придумали новых скд-функций

        • Snouphruh сказал:

          обычное соединение таблицы с самой же существовало и до 1С.
          таким же способом делаются и эти нарастающие итоги, и получение предыдущих или последующих значений и прочие фишки, которые делаются в СКД через СКДшные функции-вычисления.

          • GolD сказал:

            Проблема, что работает это медленно и плохо. Вы, видимо, на практике не пытались использовать свое соединение на большой базе.

            • Snouphruh сказал:

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

    • Насипов Фарит сказал:

      Если только как-то захватывать поток. Видео опубликованы на Wistia, этот сервис не дает возможности просто скачать.

      • Snouphruh сказал:

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

    • Snouphruh сказал:

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

      я пользуюсь браузером Хромом.
      1. нажимаете левой кнопкой мыши на этой странице (практически в любом месте);
      2. выбираете последний пункт в меню Inspect (в русской верии должно быть Исследовать). после чего экран поделится на 2 части, в одной половине будет сама текущая страница, а в другой половине – код этой страницы;
      3. в вверху будет меню, там надо выбрать пункт Network (сеть) (4ый пункт слева). содержимое в половине окна, где код, изменится;
      4. чуть ниже будет ещЁ одно меню, в котором надо выбрать пункт Media (Медиа) (6ой справа);
      5. далее на самой странице сайта (то есть на левой половине) надо запустить воспроизведение интересующего Вас видео. в правой половине в таблице появится файл, типа file.mp4;
      6. 2 раза щЁлкните по нему. в новой закладке откроется новая страница с тем файлом;
      7. в любом месте новой страницы вне видео так же нажмите левую кнопку мыши и выберите пункт «Сохранить как»;
      8. в появившемся диалогом окне укажите (введите) название, под которым будет сохранено видео на Вашем компьютере. при необходимости там же (в диалоговом окне) можно выбрать путь (место), где на диске будет сохранено видео.

        • Snouphruh сказал:

          пожалуйста!

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

      • rmarkovych сказал:

        1-2 пункты заменяет клавиша F12. Далее по инструкции. Спасибо. Не знал такого способа

    • Евгений Гилев (Мастер-тренер) сказал:

      Добрый день!

      Есть. Оно не блещет оригинальностью и наглядными примерами, но формально функционал описан.

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

      Добрый день!
      Да. В справке есть специальный раздел Система компоновки данных – Язык выражений системы компоновки данных:
      ЯзыкВыражений

    • vvi3ard сказал:

      Более того первые 2 видео полная копия описания на ИТС.
      С той только разницей что описание на ИТС я прочитал, и вероятно не очень понял, а по видео гораздо понятнее.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Мы используем файлы cookies, чтобы сделать сайт удобнее.
Продолжая просмотр сайта, Вы соглашаетесь с их использованием.
Подробнее