// Набор данных Запрос состоит из нескольких временных таблиц.
// В первой «ВТ_Ном» Выбираем товары по фильтру и число 1
ВЫБРАТЬ
Номенклатура.Ссылка,
1 КАК Ном
ПОМЕСТИТЬ ВТ_Ном
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
(НЕ Номенклатура.ЭтоГруппа)
{ГДЕ
Номенклатура.Ссылка.*}
;
// Во второй «ВТ_НомПП» получим номер по порядку: соединим каждый элемент первой
// таблицы со всеми элементами этой же таблицы, которые при сортировке будут равны или
// выше элемента, а число 1 просуммируем.
ВЫБРАТЬ
ВТ_Ном.Ссылка,
СУММА(ВТ_Ном.Ном) КАК НомПП
ПОМЕСТИТЬ ВТ_НомПП
ИЗ
ВТ_Ном КАК ВТ_Ном
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Ном КАК ВТ_Ном1
ПО ВТ_Ном.Ссылка.Наименование >= ВТ_Ном1.Ссылка.Наименование
СГРУППИРОВАТЬ ПО
ВТ_Ном.Ссылка
;
// Дальше «ВТ_Индекс» хитрость номер один: делим номер по порядку на удвоенное число
// строк на странице и отнимаем целую часть этого же деления, функция ВЫРАЗИТЬ в этом
// случае округляет частное по математическим правилам.
// Результат формулы колеблется от -0,5 до +0,499 назовём его ПлюсМинус, (см. Рис.1 Синус Хэ)
ВЫБРАТЬ
ВТ_НомПП.Ссылка,
ВТ_НомПП.НомПП КАК НомПП,
(ВТ_НомПП.НомПП - 1) / (&СтрокНаСтранице * 2) - (ВЫРАЗИТЬ((ВТ_НомПП.НомПП - 1) / (&СтрокНаСтранице * 2) КАК ЧИСЛО(10, 0))) КАК ПлюсМинус
ПОМЕСТИТЬ ВТ_Индекс
ИЗ
ВТ_НомПП КАК ВТ_НомПП
;
// А теперь всем строкам, у которых ПлюсМинус >= 0 (первая колонка каждой страница)
// присоединим строку с номером на СтрокНаСтранице больше, (см. Рис.2 Результат)
ВЫБРАТЬ
ВТ_Индекс.НомПП КАК НомПП1,
ВТ_Индекс.Ссылка КАК Номенклатура1,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена1,
ВТ_Индекс1.НомПП КАК НомПП2,
ВТ_Индекс1.Ссылка КАК Номенклатура2,
ЦеныНоменклатурыСрезПоследних1.Цена КАК Цена2
ИЗ
ВТ_Индекс КАК ВТ_Индекс
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Индекс КАК ВТ_Индекс1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ВидЦены)}) КАК ЦеныНоменклатурыСрезПоследних1
ПО ВТ_Индекс1.Ссылка = ЦеныНоменклатурыСрезПоследних1.Номенклатура
ПО (ВТ_Индекс.НомПП + &СтрокНаСтранице = ВТ_Индекс1.НомПП)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ВидЦены)}) КАК ЦеныНоменклатурыСрезПоследних
ПО ВТ_Индекс.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
ВТ_Индекс.ПлюсМинус >= 0
УПОРЯДОЧИТЬ ПО
НомПП1
Остаётся занести этот запрос в набор данных схемы компоновки, ну там настроить всё – отборы, оформления и т.п. Отсечку страниц, заголовок и всякие там штуки описывать не буду, смотрите в модуле отчета ПриКомпоновкеРезультата, файл без пароля.
Особенности этого варианта: только один тип цен и только Равно, но обязательно; количество строк подбирается пользователем; длинные наименования обрезаются; нет иерархии.
Вариант с остатками
Поменялся последний запрос в пакете: собственно просто соединение с регистром остатков для каждой из колонок.
ВЫБРАТЬ
ВТ_Индекс.НомПП КАК НомПП1,
ВТ_Индекс.Ссылка КАК Номенклатура1,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена1,
ВТ_Индекс1.НомПП КАК НомПП2,
ВТ_Индекс1.Ссылка КАК Номенклатура2,
ЦеныНоменклатурыСрезПоследних1.Цена КАК Цена2,
ТоварыНаСкладахОстатки.ВНаличииОстаток,
ТоварыНаСкладахОстатки1.ВНаличииОстаток КАК ВНаличииОстаток1
ИЗ
ВТ_Индекс КАК ВТ_Индекс
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Индекс КАК ВТ_Индекс1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ВидЦены)}) КАК ЦеныНоменклатурыСрезПоследних1
ПО ВТ_Индекс1.Ссылка = ЦеныНоменклатурыСрезПоследних1.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Склад)}) КАК ТоварыНаСкладахОстатки1
ПО ВТ_Индекс1.Ссылка = ТоварыНаСкладахОстатки1.Номенклатура
ПО (ВТ_Индекс.НомПП + &СтрокНаСтранице = ВТ_Индекс1.НомПП)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ВидЦены)}) КАК ЦеныНоменклатурыСрезПоследних
ПО ВТ_Индекс.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, {(Склад)}) КАК ТоварыНаСкладахОстатки
ПО ВТ_Индекс.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
ГДЕ
ВТ_Индекс.ПлюсМинус >= 0
УПОРЯДОЧИТЬ ПО
НомПП1