- Номера столбцов в СКД
- Многоуровневая нумерация в отчете СКД (программный вывод)
- Иерархическая нумерация в отчете СКД с помощью макета поля
- Скачать файлы
- Специальные предложения
- См. также
- Шпаргалка разработчика для работы с формами Промо
- K-SOFT: Улучшенная форма отчета
- 1С Специалист ЗУП 3
- СКД. Объединение ячеек на примере «Справка инвентаризации расчетов с покупателями и поставщиками по форме ИНВ-17»
- Каталог игр с приставок из моего детства Промо
- СКД: красивые надписи в заголовках колонок
- Самое полное решение задач для подготовки к Специалисту по ЗУП 3.1
- Прорыв и провал 3D графики в 1С
- Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула Промо
Номера столбцов в СКД
Определять номер запросе не покатит. У нас же в запросе один порядок колонок, в макете другой. Они могут вообще скрыть какие-то колонки или добавить пользовательские.
Эти колонки не в запросе рисуются, а в процессоре вывода
// Вот такой код нужно вставить в форму отчета
// для обработчика кнопки, которую вы поместите на форму отчета,
// и назовёте, например, сформировать
Процедура ДействияФормыСформировать(Кнопка)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
КоличествоСтрокШапки = ТабДокумент.ФиксацияСверху;
КоличествоКолонок = ТабДокумент.ШиринаТаблицы;
ИсходнаяОбласть = ТабДокумент.Область(КоличествоСтрокШапки,,КоличествоСтрокШапки);
ОбластьПриемник = ТабДокумент.Область(КоличествоСтрокШапки+1,,КоличествоСтрокШапки+1);
ТабДокумент.ВставитьОбласть(ИсходнаяОбласть,ОбластьПриемник,ТипСмещенияТабличногоДокумента.ПоГоризонтали,Ложь);
Для Ном = 1 По КоличествоКолонок Цикл
ТекОбласть = ТабДокумент.Область(КоличествоСтрокШапки+1,Ном);
ТекОбласть.Текст = «»+Ном;
ТекОбласть.ЦветФона = ЦветаСтиля.ЦветФонаШапкиОтчета;
Шрифт = Новый Шрифт(«Arial»,10,Ложь,Ложь,Ложь,Ложь);
ТекОбласть.Шрифт = Шрифт;
ТекОбласть.ЦветТекста = Новый Цвет;
ТекОбласть.ЦветРамки = ЦветаСтиля.ЦветЛинииОтчета;
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,1);
ТекОбласть.Обвести(Линия, Линия, Линия, Линия);
ТекОбласть.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ТекОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
КонецЦикла;
Счтаю, что тема закрыта.
Обещанное вознаграждение за решение данного вопроса на совести автора этой темы форума.
//Добавил расшифровку,о которой писал
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
КоличествоСтрокШапки = ТабДокумент.ФиксацияСверху;
КоличествоКолонок = ТабДокумент.ШиринаТаблицы;
ИсходнаяОбласть = ТабДокумент.Область(КоличествоСтрокШапки,,КоличествоСтрокШапки);
ОбластьПриемник = ТабДокумент.Область(КоличествоСтрокШапки+1,,КоличествоСтрокШапки+1);
ТабДокумент.ВставитьОбласть(ИсходнаяОбласть,ОбластьПриемник,ТипСмещенияТабличногоДокумента.ПоГоризонтали,Ложь);
Для Ном = 1 По КоличествоКолонок Цикл
ТекОбласть = ТабДокумент.Область(КоличествоСтрокШапки+1,Ном);
ТекОбласть.Текст = «»+Ном;
ТекОбласть.ЦветФона = ЦветаСтиля.ЦветФонаШапкиОтчета;
Шрифт = Новый Шрифт(«Arial»,10,Ложь,Ложь,Ложь,Ложь);
ТекОбласть.Шрифт = Шрифт;
ТекОбласть.ЦветТекста = Новый Цвет;
ТекОбласть.ЦветРамки = ЦветаСтиля.ЦветЛинииОтчета;
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,1);
ТекОбласть.Обвести(Линия, Линия, Линия, Линия);
ТекОбласть.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ТекОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
КонецЦикла;
Если хотите поиграться с цветам,
то можно так
ТекОбласть.ЦветФона = Новый Цвет(192,192,192);
ТекОбласть.ЦветТекста = Новый Цвет(255,255,255);
ТекОбласть.ЦветРамки = Новый Цвет(0,0,0);
Это соответствует картинке «Выборпериода.png»
Хотя лично мне, больше нравятся стилизованные цвета.
В вышеупомянутом примере они как раз и используются. Отчет выглядит в компоновке данных очень красиво!
//Если вы вдруг захотите использовать экзотические макеты оформления схемы компоновки данных, тогда
//нужно немного модифицировать код обработки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
// Проверяем, установлен ли пользовательский макет оформления компоновки данных
// и, если он установлен, то берем значения элементов оформления из него,
// иначе — из основного.
МакетОформления = Новый МакетОформленияКомпоновкиДанных;
ПараметрМакетаОформления = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«МакетОформления»));
Если ПараметрМакетаОформления.Использование Тогда
МакетОформления = БиблиотекаМакетовОформленияКомпоновкиДанных[ПараметрМакетаОформления.Значение].ПолучитьМакет();
Иначе
МакетОформления = БиблиотекаМакетовОформленияКомпоновкиДанных[«Основной»].ПолучитьМакет();
КонецЕсли;
ОформлениеЗаголовкаТаблицы = МакетОформления.Элементы.Найти(«ЗаголовокТаблицы»).Значение[0].Оформление;
ЦветФона = ОформлениеЗаголовкаТаблицы.Элементы.Найти(«ЦветФона»).Значение;
ЦветРамки = ОформлениеЗаголовкаТаблицы.Элементы.Найти(«ЦветГраницы»).Значение;
ЦветТекста = ОформлениеЗаголовкаТаблицы.Элементы.Найти(«ЦветТекста»).Значение;
Шрифт = ОформлениеЗаголовкаТаблицы.Элементы.Найти(«Шрифт»).Значение;
Линия = ОформлениеЗаголовкаТаблицы.Элементы.Найти(«СтильГраницы»).Значение;
// Вставляем область нумерации колонок и выводим результат
ТабДокумент = ЭлементыФормы.Результат;
КоличествоСтрокШапки = ТабДокумент.ФиксацияСверху;
КоличествоКолонок = ТабДокумент.ШиринаТаблицы;
ИсходнаяОбласть = ТабДокумент.Область(КоличествоСтрокШапки,,КоличествоСтрокШапки);
ОбластьПриемник = ТабДокумент.Область(КоличествоСтрокШапки+1,,КоличествоСтрокШапки+1);
Для Ном = 1 По КоличествоКолонок Цикл
ТекОбласть = ТабДокумент.Область(КоличествоСтрокШапки+1,Ном);
ТекОбласть.Шрифт = Шрифт;
ТекОбласть.Текст = «»+Ном;
ТекОбласть.ЦветФона = ЦветФона;
ТекОбласть.ЦветТекста = ЦветТекста;
ТекОбласть.ЦветРамки = ЦветРамки;
ТекОбласть.Обвести(Линия, Линия, Линия, Линия);
ТекОбласть.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ТекОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
КонецЦикла;
КонецПроцедуры
А то, как-то не по фэн-шую получается.
// Протестировал самый неэкзотический случай, когда макет оформления «Безоформления», нашёл небольшую ошибку,
// теперь со всеми макетами работает
Процедура ДействияФормыСформировать(Кнопка)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
// Проверяем, установлен ли пользовательский макет оформления компоновки данных
// и, если он установлен, то берем значения элементов оформления из него,
// иначе — из основного.
МакетОформления = Новый МакетОформленияКомпоновкиДанных;
ПараметрМакетаОформления = КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«МакетОформления»));
Если ПараметрМакетаОформления.Использование Тогда
МакетОформления = БиблиотекаМакетовОформленияКомпоновкиДанных[ПараметрМакетаОформления.Значение].ПолучитьМакет();
Иначе
МакетОформления = БиблиотекаМакетовОформленияКомпоновкиДанных[«Основной»].ПолучитьМакет();
КонецЕсли;
ОформлениеЗаголовкаТаблицы = МакетОформления.Элементы.Найти(«ЗаголовокТаблицы»).Значение;
Если ОформлениеЗаголовкаТаблицы = Неопределено Тогда
ЦветФона = Новый Цвет(255,255,255);
ЦветРамки = Новый Цвет(0,0,0);
ЦветТекста = Новый Цвет(0,0,0);
Шрифт = Новый Шрифт(«Arial»,10,Ложь,Ложь,Ложь,Ложь);
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,0);
Иначе
ЦветФона = ОформлениеЗаголовкаТаблицы[0].Оформление.Элементы.Найти(«ЦветФона»).Значение;
ЦветРамки = ОформлениеЗаголовкаТаблицы[0].Оформление.Элементы.Найти(«ЦветГраницы»).Значение;
ЦветТекста = ОформлениеЗаголовкаТаблицы[0].Оформление.Элементы.Найти(«ЦветТекста»).Значение;
Шрифт = ОформлениеЗаголовкаТаблицы[0].Оформление.Элементы.Найти(«Шрифт»).Значение;
Линия = ОформлениеЗаголовкаТаблицы[0].Оформление.Элементы.Найти(«СтильГраницы»).Значение;
КонецЕсли;
// Вставляем область нумерации колонок и выводим результат
ТабДокумент = ЭлементыФормы.Результат;
КоличествоСтрокШапки = ТабДокумент.ФиксацияСверху;
КоличествоКолонок = ТабДокумент.ШиринаТаблицы;
ИсходнаяОбласть = ТабДокумент.Область(КоличествоСтрокШапки,,КоличествоСтрокШапки);
ОбластьПриемник = ТабДокумент.Область(КоличествоСтрокШапки+1,,КоличествоСтрокШапки+1);
Для Ном = 1 По КоличествоКолонок Цикл
ТекОбласть = ТабДокумент.Область(КоличествоСтрокШапки+1,Ном);
ТекОбласть.Шрифт = Шрифт;
ТекОбласть.Текст = «»+Ном;
ТекОбласть.ЦветФона = ЦветФона;
ТекОбласть.ЦветТекста = ЦветТекста;
ТекОбласть.ЦветРамки = ЦветРамки;
ТекОбласть.Обвести(Линия, Линия, Линия, Линия);
ТекОбласть.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
ТекОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
КонецЦикла;
КонецПроцедуры
Источник
Многоуровневая нумерация в отчете СКД (программный вывод)
Задача: нередко при разработке отчетов возникает необходимость многоуровневой нумерации элементов отчета в соответствии с его структурой. Система компоновки данных не предоставляет средств для решения этой задачи. Проблема усугубляется в случае отчетов с иерархической группировкой где количество уровней вложенности произвольно и заранее неизвестно.
Попытки решения данной задачи только средствами СКД успехом не увенчались. Поиск существующих решений желаемых результатов не принес:
- вариант Ильи Васильева (swimdog) имеет ограничение по уровням вложенности и требует анализа выходного табличного документа для определения размещения номера;
вариант Алексея А (Isonic) с произвольной иерархией представляется неудобным в реализации так как вложенность заранее неизвестна и при изменении группировок придется переопределять значение поля иерархической нумерации;
Решение. Предлагаемое решение позволяет решить задачу многоуровневой нумерации путем формирования номера при поэлементном программном выводе отчета. Преимуществом решения является отсутствие привязки к структуре данных, уровень иерархии определяется вложенностью элементов поступающих от процессора компоновки. Для нумерации достаточно создать вычисляемое поле и добавить несложный код вычисления номера в вывод отчета. Настройка размещения и отображения поля осуществляется стандартными средствами СКД.
Фрагмент кода формирования иерархического номера:
Код функции ПолучитьМногоуровневыйНомерПоИерархии:
Также вам потребуется функция «ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля» которую можно взять из статьи о установке собственных значений полей при программном выводе отчета СКД либо скачать пример отчета в котором «все включено».
P.S. Алгоритм разработан для иерархической нумерации по строкам отчета, но работает и при наличии группировок колонок. Вывод номера по колонкам не предусмотрен.
Огромная благодарность Денису Урянскому (dhurricane) за вдумчивое тестирование и подсказки.
Внешний отчет с примером иерархической нумерации тестировался на платформе 8.3.13.1644.
Обновление 16.01.2020: Перезагружен файл с примером. Просьба скачавшим связаться с автором для получения новой версии, либо самостоятельно обновить код функции ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля() из текста статьи про нее. В прежней реализации возможен несистематический пропуск параметров.
Источник
Иерархическая нумерация в отчете СКД с помощью макета поля
СКД — очень мощная и удобная штука. Но зачастую, для решения некоторых вопросов, приходится изобретать что-то немыслимое. Вот и в данной публикации один из примеров.
Задача состоит в том, чтобы в иерархическом отчете на СКД, вывести нумерацию строк по иерархии. Например:
Мне не хотелось заниматься нумерацией программно, как представлено в некоторых публикациях на инфостарте, а сделать это средствами СКД.
Так вот решение данного вопроса лежит в макете , точнее в оформлении поля, где можно в выражении писать что угодно.
Текст выражения выглядит так:
В примере представлен вариант для 3-х уровней отчета, собственно если отчет имеет больше уровней, то нужно будет дописать выражение по аналогии. В итоге получаем отчет вот такого вида.
Отчет разрабатывался на платформе 8.3.13.1644.
Скачать файлы
Наименование | Файл | Версия | Размер |
---|---|---|---|