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