[ Вопрос дня ] Как в отчете на СКД получить цену товара на каждую дату его продажи?

Доброго дня, коллеги!

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

Курс: Профессиональная разработка отчетов в 1С 8.3 на СКД

Вопрос

Добрый день!  Подскажите, пожалуйста, как реализовать отчет на СКД по следующей форме (группировка колонок по дням продажи):

Номенклатура    02/01/2019    02/02/2019    …    N

Цена продажи    Цена в выбранном типе цен на дату продажи    Отклонение %

Цена продажи    Цена в выбранном типе цен на дату продажи    Отклонение %

Цена продажи    Цена в выбранном типе цен на дату продажи    Отклонение %

Цена продажи    Цена в выбранном типе цен на дату продажи    Отклонение %

То есть в настройках отчета нужно указать тип цен. Это и будет “выбранный тип цен”. Затем нужно получить данные о продажах – какой товар, в какую дату, по какой цене продавался. На каждую дату продажи из регистра сведений ЦеныНоменклатуры нужно получить цену товара на эту дату по тому типу цен, который выбран в настройках отчета. Как можно реализовать данный алгоритм в СКД?

Ответ

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

  • набор 1 с данными о продажах (должно быть поле с датой продажи)

    Набор 1 с данными о продажах

    (нажмите, чтобы увеличить картинку)

  • набор 2 с ценами товаров – срез последних по регистру сведений ЦеныНоменклатуры (должен быть параметр виртуальной таблицы – на какую дату получать срез)

    Набор 2 с ценами товаров

    (нажмите, чтобы увеличить картинку)

При настройке связи дату продажи из первого набора данных передавать в параметр второго набора данных:

Связи набора данных

(нажмите, чтобы увеличить картинку)

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

Подробнее такая задача рассматривается в курсе по СКД в видеоуроке 1C-SKD-Topic10-НесколькоНаборовДанных-Lesson170-СрезПоследнихНаКаждуюДату.

Это пример разобранного вопроса из Мастер-группы курса
Профессиональная разработка отчетов в 1С 8.3 на СКД.

Описание курса и примеры видео

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

  1. Александр

    А что если единица измерения установленной цены не совпадает с единицой измерения в документе продажи

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

      Добрый день!
      В приведенном примере этот аспект не учитывается.
      Значит, нужно будет доработать.
      Например, в наборе данных Продажи добавить поле ЕдиницаИзмерения, добавить в текст запроса набора данных Цены отбор по единице измерения, настроить связи наборов данных.
      Либо выполнять пересчеты по коэффициенту из единицы измерения.

  2. Николай

    Большое спасибо за информацию.
    Очень мало информации по использованию Параметров связи.
    Приведенные вами примеры помогли лучше понять их использование.

  3. Алексей

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

    быстрее вышло одним запросом с 2-мя временными таблицами:

    1) прочитать все обороты продажи и к ним лево-соединить все цены (результат 1,5 млн строк за 9 сек период взял 1,5 года)

    2) по полученным данным вычислить максимальную “дату цены” для каждого документа
    МАКСИМУМ(ВТ.ПериодЦена)<= ВТ.ПериодПродажа (здесь вышло 0,6 млн строк за 1,3 сек, это получается )

    3) из первой таблицы взял продажи с "датами цен" из второй таблицы (а на выходе я еще присоединил списание по партиям, чтобы еще показать себестоимость, тут еще 2 сек)

    похоже что ваш вариант на каждый документ+товар подсчитывает срез всех цен и считывает регистр сведений каждый раз заново (это как выполнять запрос в цикле)

    ваш вариант в консоли не замерял, но результата за 1 месяц ждал секунд 20 примерно
    хотя я самоучка (по форумам) и возможно какую-то тонкость сделал неправильно

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

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

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

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

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

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

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

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.