Доброго дня, коллеги!
В СКД прием настройки связи наборов данных с передачей параметров из одного набора в другой позволяет реализовывать сложные и интересные отчеты. Такой прием очень похож на использование переменных в запросах на SQL. Конечно тут возникает вопрос производительности такого отчета, но это уже совсем другая история.
Курс: Профессиональная разработка отчетов в 1С 8.3 на СКД
Вопрос
Номенклатура 02/01/2019 02/02/2019 … N
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
То есть в настройках отчета нужно указать тип цен. Это и будет “выбранный тип цен”. Затем нужно получить данные о продажах – какой товар, в какую дату, по какой цене продавался. На каждую дату продажи из регистра сведений ЦеныНоменклатуры нужно получить цену товара на эту дату по тому типу цен, который выбран в настройках отчета. Как можно реализовать данный алгоритм в СКД?
Ответ
Добрый день! Чтобы в отчете на СКД получить цену на каждую дату продажи, можно настроить связь двух наборов данных:
- набор 1 с данными о продажах (должно быть поле с датой продажи)
- набор 2 с ценами товаров – срез последних по регистру сведений ЦеныНоменклатуры (должен быть параметр виртуальной таблицы – на какую дату получать срез)
При настройке связи дату продажи из первого набора данных передавать в параметр второго набора данных:
Таким образом, для каждой продажи из первого набора данных получим данные о цене при помощи второго набора данных.
Подробнее такая задача рассматривается в курсе по СКД в видеоуроке 1C-SKD-Topic10-НесколькоНаборовДанных-Lesson170-СрезПоследнихНаКаждуюДату.
Профессиональная разработка отчетов в 1С 8.3 на СКД.
А что если единица измерения установленной цены не совпадает с единицой измерения в документе продажи
Добрый день!
В приведенном примере этот аспект не учитывается.
Значит, нужно будет доработать.
Например, в наборе данных Продажи добавить поле ЕдиницаИзмерения, добавить в текст запроса набора данных Цены отбор по единице измерения, настроить связи наборов данных.
Либо выполнять пересчеты по коэффициенту из единицы измерения.
Большое спасибо за информацию.
Очень мало информации по использованию Параметров связи.
Приведенные вами примеры помогли лучше понять их использование.
Рады, что материалы были полезны!
как раз появилась такая задача, найти все документы где сотрудники указали цену ниже установленной, по вашей наводке у меня получилось очень медленно…
быстрее вышло одним запросом с 2-мя временными таблицами:
1) прочитать все обороты продажи и к ним лево-соединить все цены (результат 1,5 млн строк за 9 сек период взял 1,5 года)
2) по полученным данным вычислить максимальную “дату цены” для каждого документа
МАКСИМУМ(ВТ.ПериодЦена)<= ВТ.ПериодПродажа (здесь вышло 0,6 млн строк за 1,3 сек, это получается )
3) из первой таблицы взял продажи с "датами цен" из второй таблицы (а на выходе я еще присоединил списание по партиям, чтобы еще показать себестоимость, тут еще 2 сек)
похоже что ваш вариант на каждый документ+товар подсчитывает срез всех цен и считывает регистр сведений каждый раз заново (это как выполнять запрос в цикле)
ваш вариант в консоли не замерял, но результата за 1 месяц ждал секунд 20 примерно
хотя я самоучка (по форумам) и возможно какую-то тонкость сделал неправильно
Добрый день!
Вы абсолютно правильно отмечаете – вариант с соединением двух наборов данных часто работает медленнее. Это объясняется техникой получения данных – применяется некий аналог “запросов в цикле”. Поэтому нужно знать, какие способы решения задачи вообще существуют, затем выбрать их них наиболее подходящий.
Подобный вопрос рассматривается в нашем курсе Профессиональная разработка отчетов в 1С 8.3 на СКД.
Он может систематизировать имеющиеся знания по СКД, полученные из различных источников самостоятельно.