Доброго дня, коллеги!
В СКД прием настройки связи наборов данных с передачей параметров из одного набора в другой позволяет реализовывать сложные и интересные отчеты. Такой прием очень похож на использование переменных в запросах на SQL. Конечно тут возникает вопрос производительности такого отчета, но это уже совсем другая история.
Курс: Профессиональная разработка отчетов в 1С 8.3 на СКД
Вопрос
Номенклатура 02/01/2019 02/02/2019 … N
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
Цена продажи Цена в выбранном типе цен на дату продажи Отклонение %
То есть в настройках отчета нужно указать тип цен. Это и будет “выбранный тип цен”. Затем нужно получить данные о продажах – какой товар, в какую дату, по какой цене продавался. На каждую дату продажи из регистра сведений ЦеныНоменклатуры нужно получить цену товара на эту дату по тому типу цен, который выбран в настройках отчета. Как можно реализовать данный алгоритм в СКД?
Ответ
Добрый день! Чтобы в отчете на СКД получить цену на каждую дату продажи, можно настроить связь двух наборов данных:
- набор 1 с данными о продажах (должно быть поле с датой продажи)
- набор 2 с ценами товаров – срез последних по регистру сведений ЦеныНоменклатуры (должен быть параметр виртуальной таблицы – на какую дату получать срез)
При настройке связи дату продажи из первого набора данных передавать в параметр второго набора данных:
Таким образом, для каждой продажи из первого набора данных получим данные о цене при помощи второго набора данных.
Подробнее такая задача рассматривается в курсе по СКД в видеоуроке 1C-SKD-Topic10-НесколькоНаборовДанных-Lesson170-СрезПоследнихНаКаждуюДату.
Профессиональная разработка отчетов в 1С 8.3 на СКД.




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