При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести не все данные за период, а только актуальное (последнее) значение, например, последнюю цену номенклатуры. Стандартные настройки группировок часто выводят первую найденную запись, что не всегда соответствует бизнес-задачам. Давайте разберем, как правильно реализовать получение последней цены.
Этот подход наиболее эффективен с точки зрения производительности, так как вычисления происходят на стороне сервера СУБД еще до передачи данных в СКД. Мы используем временные таблицы для определения максимальной даты и получения цены, соответствующей этой дате.
Рассмотрим пошаговый процесс реализации:
ВР_Осн, объединив документы (например, АвансовыйОтчет и ПоступлениеТоваровУслуг).ВР_Цены только необходимые поля: Номенклатура, Цена и Дата.ВР_ПослДата с помощью группировки.Пример реализации запроса:
ВЫБРАТЬ Т.Номенклатура, Т.Ссылка КАК Регистратор, Т.Ссылка.Дата КАК Дата, Т.Цена
ПОМЕСТИТЬ ВР_Осн
ИЗ Документ.ПоступлениеТоваровУслуг.Товары КАК Т
ГДЕ Т.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2;
ВЫБРАТЬ Номенклатура, МАКСИМУМ(Дата) КАК Дата
ПОМЕСТИТЬ ВР_ПослДата
ИЗ ВР_Осн
СГРУППИРОВАТЬ ПО Номенклатура;
ВЫБРАТЬ ВР_Осн.Номенклатура, ВР_Осн.Цена КАК ЦенаПоследняя
ПОМЕСТИТЬ ВР_ПослЦены
ИЗ ВР_Осн КАК ВР_Осн
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВР_ПослДата КАК ВР_ПослДата
ПО ВР_Осн.Номенклатура = ВР_ПослДата.Номенклатура
И ВР_Осн.Дата = ВР_ПослДата.Дата;
Если структура отчета простая и данных не очень много, можно воспользоваться функцией ВычислитьВыражениеСГруппировкойМассив или ВычислитьВыражение непосредственно в ресурсах СКД.
Для настройки в поле Ресурсы можно прописать выражение, которое будет искать последнюю цену в рамках группировки по номенклатуре. Однако, чтобы этот метод сработал корректно, необходимо:
Дата."Последняя" для правильного позиционирования внутри массива данных.Выражение в ресурсах может выглядеть так:
МИНИМУМ(ВычислитьВыражениеСГруппировкойМассив("ВычислитьВыражение(""Цена"",,,""Последняя"",""Последняя"")", "Регистратор"))
При работе с подобными задачами всегда обращайте внимание на следующие аспекты:
ВычислитьВыражение.Цена и ЦенаПоследняя), чтобы пользователю было удобно с ними работать.Надеемся, что данные методы помогут вам корректно настроить отчет и получать актуальные данные по ценам. Если возникнут дополнительные вопросы, всегда обращайтесь к настройкам соединения наборов данных, так как использование виртуальных таблиц (например, СрезПоследних для регистров сведений) является наиболее архитектурно правильным решением в 1С.