1с скд объединить заголовки колонок

Обновлено: 07.07.2024

Проблема в СКД. При формировании в колонках таблицы вложенных группировок, родительский заголовок группировки, не объединяет заголовки дочерних группировок.

Если операция производится над сформированным табличным документом, то причём здесь СКД? над сформированным табличным документом, то причём здесь СКД? (19) AlexO, C добрым утром! Вопрос по комментарию трёхгодичной давности? Тем не менее попытаюсь ещё раз сформулировать: какое отношение описанный алгоритм имеет к СКД? Здесь обрабатывается уже сформированный табличный документ. А как он был сформирован для описанного алгоритма дело десятое. Точно также можно обрабатывать табличный документ, сформированный вручную. А как он был сформирован для описанного алгоритма дело десятое
Как раз наипервейшее. Потому как СКД настолько закрытый и запутанный механизм, что любое осмысленное вмешательство в него, дающее уверенный результат - уже огромный плюс. Проблема в СКД. При формировании в колонках таблицы вложенных группировок, родительский заголовок группировки, не объединяет заголовки дочерних группировок.

Это решение призвано привести в порядок вертикальные группировки в СКД. Если этот вариант можно использовать еще где нибудь я не против.

Спасибо за решение, сделал и для горизонтальных и вертикальных ячеек. Классно работает и для вертикальных и для горизонтальных ячеек. А у кого получилось одновременное объединение горизонтальных и верткальных? Например объединенная ячейка должна быть высотой 2 строки и шириной 3 колонки ? В платформе 8.2 уже все объединяет, если грамотно настроить (6) serg_gres, ок, сейчас потрачу полчасика на пример. подожди, не уходи :) (8) adminfo2002, и я жду. )) передо мной сейчас такая же задача. Но как не пыталась, простой настройкой не обошлась
Полгода прошло. у вас там временная аномалия? :)
(16) sdv88,

"А вот тут немного снять.. здесь подчистить. тут отрезать. и вот изящная ложка готова!"
"Не, мне баклушу как сделать. "
Кто ж поймет этих 1сников. (5) adminfo2002, действительно, было бы очень интересно посмотреть на новое решение . Вопрос автору: объединятся ли смежные ячейки ресурсов с одинаковым значением? (7) serg_gres, не понял, зачем объединять ячейки ресурсов? Если речь идет об общей родительской группировке этих ресурсов, то да объединятся. Единственное найденное решение, на мой взгляд. И в 8.2 ничего подобного, как ни настраивай. мне наоборот надо чтобы родительская группировка не объединялась.. версия платформы 8.2.14.540. есть какая то настройка? А можно поподробнее описать, в каком виде вы хотите видеть родительские группировки? как в публикации на картинке где без объединения(покупатели или поставщики). чтобы над каждой колонкой было название верхней группировки. то есть начальный вариант в этой публикации Если данное решение можно применить где-то еще я буду только рад. Но в первую очередь это будет полезно пользователям СКД. работает только при выводе одного показателя в отчете.
Если делаешь вывод более одного показателя, то объединение не срабатывает:( Спасибо за замечание, добавлен доработанный пример для 8.2. Подскажите, если у меня нет кнопки сформировать, и форма рисуется стандартно, как мне использовать данную процедуру? (26) lamdth,
На форме создайте кнопку, прицепите к ней свой обработчик, текст можно подсмотреть где угодно. Например выдрать из моего отчета этой темы. Пример есть в книге "Руководство разработчика" гл 10.4. (30) rborovikov,
На скриншоте "Настройки СКД" показан пример настроек или можно скачать приложенный отчет и там посмотреть. Спасибо, помогло.
Я при использовании немного дополнил функцию ОбъединятьЯчейки():

Добавил массив, в котором указал конкретные строки, которые должны быть в ячейках для объединения. Потому что исходный вариант иногда объединял не то, что нужно. скачал для 8.2, процедуры в модуле форме вообще не прорабатываются, т.е. удалил вообще форму - результат тот же
p.s. допёр - сделано в обычных формах, хотя написано 8.2 думал на управляемых

Спасибо за алгоритм. Есть небольшое дополнение. Чтобы сделать именно шапку на колонками, а не просто объединить одинаковые ячейки и не оставлять итоги по группировке слева от колонок, то можно использовать группировку полей. Вот как у меня на рисунке. Тогда при использовании доп. кода по объединению ячеек можно получить красивую таблицу с шапками колонок.

Наткнулся случайно.
я чего-то не понял (может быть реализация связана с "-5" лет назад? или связано с особыми требованиями к формату отчета)
потому как ну нет проблемы вроде с отображением группировок

настройка "расположение группировок - вместе" дает красивый результат (ну на платформе 8.3. точно, при том что по умолчанию подразумевает "вместе" и ничего настраивать не нужно)

(37) graZy,
Сейчас проверил на платформе 8.3.4.465 (другой под рукой не было), проблема осталась.

з.ы.
Проверил на 8.3.5.1383 - результат тот же. (Для проверки можно использовать отчет из загрузок например "Объединяемые заголовки для 8.2" и закомментировать вызов "ОбработатьЗаголовки(. )"

(экперементировал на своем отчете)

рис 1 "расположение полей группировок вместе"
рис 2 "расположение полей группировок отдельно"

(40) graZy,
На втором вашем рисунке как раз нужно добиться общей шапки для "кварталов" и "полугодий" так а чем отчет на первом рисунке не устраивает. (зачем городить рисунок 2 с объединением) --- как писал ранее, если это только не требования к форме отчета (тогда понятно зачем) - в остальных случаях рис1 по мне так идеально подходит (и все стандартными средствами СКД)

Переработал функционал из поста 32.
Проблема в том, что если по колонкам есть уже объединенные ячейки то механизм не срабатывает.
Сделал универсальную шнягу, которая объединяет даже объединенные ячейки по списку:

Andrei_Ivanov; Дейл; Volfy; whilefor; dyuha; andreich_ru; + 6 – Ответить

(43) demien@tut.by, (43) demien@tut.by,
Добрый день.

Что бы настройки брались пользовательские надо
вместо этого:
Настройки = КомпоновщикНастроек.Настройки;

Надо написать это:
Настройки= КомпоновщикНастроек.ПолучитьНастройки();

// Возвращает количество объединяемых ячеек
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения)
Ячейка = ТабДок.Область(индСтр, индКол);

Если ПустаяСтрока(Ячейка.Текст) Тогда
Возврат 0;
КонецЕсли;

Если ТекстДляОбъединения.Найти(Ячейка.Текст) = Неопределено Тогда
Возврат 0;
КонецЕсли;

КоличествоКолонок = 0;
Для СледКолонка = индКол+1 По ТабДок.ШиринаТаблицы Цикл
ЯчейкаСлед = ТабДок.Область(индСтр, СледКолонка);
//Проверяем, чтобы текст был одним из указанных в ТекстДляОбъединения
Если Ячейка.Текст = ЯчейкаСлед.Текст ИЛИ ПустаяСтрока(ЯчейкаСлед.Текст) Тогда
КоличествоКолонок = КоличествоКолонок + 1;
Иначе
Возврат КоличествоКолонок;
КонецЕсли;
КонецЦикла;

// Обработка заголовков таблицы
//
// Параметры
// Табл - - Табличный документ формы
Процедура ОбработатьЗаголовки(ТабДок)

ТекстДляОбъединения = Новый Массив;

// накачиваем массив значениями текстов для анализа и объединения (замените на свое)
Выборка = Справочники.Регионы.Выбрать();
Пока Выборка.Следующий() Цикл
ТекстДляОбъединения.Добавить(СокрЛП(Выборка.Наименование));
КонецЦикла;
// конец

//Для оптимизации здесь нужно будет ограничить высоту таблицы
Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл

Для индКол=1 По ТабДок.ШиринаТаблицы Цикл

// определяем количество колонок объединения
КоличествоКолонок = ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения);
Если КоличествоКолонок Тогда
ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
ОбъединяемаяОбласть = ТабДок.Область(индСтр, индКол, индСтр, индКол+КоличествоКолонок);
ОбъединяемаяОбласть.Объединить();
ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
индКол = индКол+КоличествоКолонок;
КонецЕсли;
КонецЦикла;

// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
Если не ОбъединяемаяОбласть = Неопределено Тогда


Необходимо одинаковые заголовки группировок объединить.

Предлагаю данную операцию произвести над сформированным табличным документом, используя следующий код:

Вставляем вызов после формирования табличного документа:


Результат представлен ниже:


Решение претендует на универсальность.
Но главный недостаток этого способа, трудно заранее определить начальную и конечную область поиска, т. к. процедура может отработать и объединить любые другие смежные идентичные ячейки. Если есть идеи как однозначно идентифицировать ячейки заголовка группировок пишите. А пока этот код можно использовать с некоторыми изменения в каждом конкретном случае.

Добавлен доработанный файл для 8.2, где предоставлен модифицированный пример для нескольких ресурсов (показателей) - спасибо Evgeniy.

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Если операция производится над сформированным табличным документом, то причём здесь СКД? над сформированным табличным документом, то причём здесь СКД? (19) AlexO, C добрым утром! Вопрос по комментарию трёхгодичной давности? Тем не менее попытаюсь ещё раз сформулировать: какое отношение описанный алгоритм имеет к СКД? Здесь обрабатывается уже сформированный табличный документ. А как он был сформирован для описанного алгоритма дело десятое. Точно также можно обрабатывать табличный документ, сформированный вручную. А как он был сформирован для описанного алгоритма дело десятое
Как раз наипервейшее. Потому как СКД настолько закрытый и запутанный механизм, что любое осмысленное вмешательство в него, дающее уверенный результат - уже огромный плюс. Проблема в СКД. При формировании в колонках таблицы вложенных группировок, родительский заголовок группировки, не объединяет заголовки дочерних группировок.

Это решение призвано привести в порядок вертикальные группировки в СКД. Если этот вариант можно использовать еще где нибудь я не против.

Спасибо за решение, сделал и для горизонтальных и вертикальных ячеек. Классно работает и для вертикальных и для горизонтальных ячеек. А у кого получилось одновременное объединение горизонтальных и верткальных? Например объединенная ячейка должна быть высотой 2 строки и шириной 3 колонки ? В платформе 8.2 уже все объединяет, если грамотно настроить (6) serg_gres, ок, сейчас потрачу полчасика на пример. подожди, не уходи :) (8) adminfo2002, и я жду. )) передо мной сейчас такая же задача. Но как не пыталась, простой настройкой не обошлась
Полгода прошло. у вас там временная аномалия? :)
(16) sdv88,

"А вот тут немного снять.. здесь подчистить. тут отрезать. и вот изящная ложка готова!"
"Не, мне баклушу как сделать. "
Кто ж поймет этих 1сников. (5) adminfo2002, действительно, было бы очень интересно посмотреть на новое решение . Вопрос автору: объединятся ли смежные ячейки ресурсов с одинаковым значением? (7) serg_gres, не понял, зачем объединять ячейки ресурсов? Если речь идет об общей родительской группировке этих ресурсов, то да объединятся. Единственное найденное решение, на мой взгляд. И в 8.2 ничего подобного, как ни настраивай. мне наоборот надо чтобы родительская группировка не объединялась.. версия платформы 8.2.14.540. есть какая то настройка? А можно поподробнее описать, в каком виде вы хотите видеть родительские группировки? как в публикации на картинке где без объединения(покупатели или поставщики). чтобы над каждой колонкой было название верхней группировки. то есть начальный вариант в этой публикации Если данное решение можно применить где-то еще я буду только рад. Но в первую очередь это будет полезно пользователям СКД. работает только при выводе одного показателя в отчете.
Если делаешь вывод более одного показателя, то объединение не срабатывает:( Спасибо за замечание, добавлен доработанный пример для 8.2. Подскажите, если у меня нет кнопки сформировать, и форма рисуется стандартно, как мне использовать данную процедуру? (26) lamdth,
На форме создайте кнопку, прицепите к ней свой обработчик, текст можно подсмотреть где угодно. Например выдрать из моего отчета этой темы. Пример есть в книге "Руководство разработчика" гл 10.4. (30) rborovikov,
На скриншоте "Настройки СКД" показан пример настроек или можно скачать приложенный отчет и там посмотреть. Спасибо, помогло.
Я при использовании немного дополнил функцию ОбъединятьЯчейки():

Добавил массив, в котором указал конкретные строки, которые должны быть в ячейках для объединения. Потому что исходный вариант иногда объединял не то, что нужно. скачал для 8.2, процедуры в модуле форме вообще не прорабатываются, т.е. удалил вообще форму - результат тот же
p.s. допёр - сделано в обычных формах, хотя написано 8.2 думал на управляемых

Спасибо за алгоритм. Есть небольшое дополнение. Чтобы сделать именно шапку на колонками, а не просто объединить одинаковые ячейки и не оставлять итоги по группировке слева от колонок, то можно использовать группировку полей. Вот как у меня на рисунке. Тогда при использовании доп. кода по объединению ячеек можно получить красивую таблицу с шапками колонок.

Наткнулся случайно.
я чего-то не понял (может быть реализация связана с "-5" лет назад? или связано с особыми требованиями к формату отчета)
потому как ну нет проблемы вроде с отображением группировок

настройка "расположение группировок - вместе" дает красивый результат (ну на платформе 8.3. точно, при том что по умолчанию подразумевает "вместе" и ничего настраивать не нужно)

(37) graZy,
Сейчас проверил на платформе 8.3.4.465 (другой под рукой не было), проблема осталась.

з.ы.
Проверил на 8.3.5.1383 - результат тот же. (Для проверки можно использовать отчет из загрузок например "Объединяемые заголовки для 8.2" и закомментировать вызов "ОбработатьЗаголовки(. )"

(экперементировал на своем отчете)

рис 1 "расположение полей группировок вместе"
рис 2 "расположение полей группировок отдельно"

(40) graZy,
На втором вашем рисунке как раз нужно добиться общей шапки для "кварталов" и "полугодий" так а чем отчет на первом рисунке не устраивает. (зачем городить рисунок 2 с объединением) --- как писал ранее, если это только не требования к форме отчета (тогда понятно зачем) - в остальных случаях рис1 по мне так идеально подходит (и все стандартными средствами СКД)

Переработал функционал из поста 32.
Проблема в том, что если по колонкам есть уже объединенные ячейки то механизм не срабатывает.
Сделал универсальную шнягу, которая объединяет даже объединенные ячейки по списку:

Andrei_Ivanov; Дейл; Volfy; whilefor; dyuha; andreich_ru; + 6 – Ответить

(43) demien@tut.by, (43) demien@tut.by,
Добрый день.

Что бы настройки брались пользовательские надо
вместо этого:
Настройки = КомпоновщикНастроек.Настройки;

Надо написать это:
Настройки= КомпоновщикНастроек.ПолучитьНастройки();

// Возвращает количество объединяемых ячеек
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения)
Ячейка = ТабДок.Область(индСтр, индКол);

Если ПустаяСтрока(Ячейка.Текст) Тогда
Возврат 0;
КонецЕсли;

Если ТекстДляОбъединения.Найти(Ячейка.Текст) = Неопределено Тогда
Возврат 0;
КонецЕсли;

КоличествоКолонок = 0;
Для СледКолонка = индКол+1 По ТабДок.ШиринаТаблицы Цикл
ЯчейкаСлед = ТабДок.Область(индСтр, СледКолонка);
//Проверяем, чтобы текст был одним из указанных в ТекстДляОбъединения
Если Ячейка.Текст = ЯчейкаСлед.Текст ИЛИ ПустаяСтрока(ЯчейкаСлед.Текст) Тогда
КоличествоКолонок = КоличествоКолонок + 1;
Иначе
Возврат КоличествоКолонок;
КонецЕсли;
КонецЦикла;

// Обработка заголовков таблицы
//
// Параметры
// Табл - - Табличный документ формы
Процедура ОбработатьЗаголовки(ТабДок)

ТекстДляОбъединения = Новый Массив;

// накачиваем массив значениями текстов для анализа и объединения (замените на свое)
Выборка = Справочники.Регионы.Выбрать();
Пока Выборка.Следующий() Цикл
ТекстДляОбъединения.Добавить(СокрЛП(Выборка.Наименование));
КонецЦикла;
// конец

//Для оптимизации здесь нужно будет ограничить высоту таблицы
Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл

Для индКол=1 По ТабДок.ШиринаТаблицы Цикл

// определяем количество колонок объединения
КоличествоКолонок = ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения);
Если КоличествоКолонок Тогда
ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
ОбъединяемаяОбласть = ТабДок.Область(индСтр, индКол, индСтр, индКол+КоличествоКолонок);
ОбъединяемаяОбласть.Объединить();
ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
индКол = индКол+КоличествоКолонок;
КонецЕсли;
КонецЦикла;

// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
Если не ОбъединяемаяОбласть = Неопределено Тогда

Использование предопределенных макетов

Система компоновки данных предоставляет широкие возможности по использованию предопределенных макетов при создании отчетов. Предопределенные макеты предназначены для оформления областей отчета и могут создаваться при помощи конструктора схемы компоновки данных, в котором для создания макетов необходимо перейти на вкладку Макеты .


Любой предопределенный макет представляет собой область табличного документа. Существуют следующие типы предопределенных макетов :

  • Макет поля,
  • Макет группировки,
  • Макет заголовка группировки,
  • Макет ресурсов.

Примерная структура отчета приведена на указанном ниже рисунке:


Примерная структура отчета, содержащего таблицу, приведена на указанном ниже рисунке:


Макет поля

Данный макет предназначен для оформления определенных выводимых полей. При создании данного макета необходимо указать поле, для которого создается предопределенный макет. На указанном ниже рисунке создается макет поля для поля Документ.Контрагент .


Для того чтобы в создаваемом макете отображались значения выводимых полей, необходимо для ячейки макета, в которой необходимо отображать поле, добавить параметр макета. Сделать это можно следующим способом : в палитре свойств для ячейки макета установить свойство Заполнение = Параметр , а в качестве значения свойства Параметр установить имя параметра макета.


Затем в списке параметров макета необходимо установить в качестве выражения представление выводимого поля. В нашем случае это будет представление поля Контрагент .


В данном примере макет поля Контрагент выводится наклонным шрифтом увеличенной высоты.


Макет группировки

Данный макет предназначен для оформления группировок. При создании данного макета необходимо указать либо имя группировки, либо поля группировки, для которой создается макет. Также необходимо указать тип макета. Существуют следующие типы предопределенных макетов :

Заголовок - данный макет предназначен для оформления заголовка группировки. Заголовок группировки выводится в начале группировки. В случае если группировка содержит вложенные группировки, то заголовок группировки выводится перед записями вложенной группировки.

Подвал - данный макет предназначен для оформления подвала группировки. Подвал группировки выводится в конце группировки. В случае если группировка содержит вложенные группировки, то подвал группировки выводится после записей вложенной группировки.

Заголовок иерархии - данный макет предназначен для оформления заголовка иерархической группировки. Данный заголовок выводится в начале иерархической группировки .

Подвал иерархии - данный макет предназначен для оформления подвала иерархической группировки. Данный подвал выводится в конце иерархической группировки.

Общий итог заголовок - данный макет предназначен для оформления области отчета, отображающей общий итог по группировке, и выводится в начале группировки.

Общий итог подвал - данный макет предназначен для оформления области отчета, отображающей общий итог по группировке, и выводится в конце группировки.

Структура предопределенных макетов группировки показана на указанном ниже рисунке:

На указанном ниже рисунке создается макет заголовка для группировки с именем ДетальныеЗаписиНоменклатуры .


В данном примере для группировки с именем ДетальныеЗаписиНоменклатуры дополнительно выводится реквизит Код , а также изменена ширина колонок.


Макет заголовка группировки

Данный макет предназначен для оформления заголовков группировок. Заголовком группировки называется область отчета, содержащая имена выводимых в отчете полей. При создании данного макета необходимо указать либо имя группировки, либо поля группировки, для которой создается макет. Также необходимо указать тип макета. Типы макетов такие же, как и для макета группировки. Существует следующее правило вывода макетов заголовка группировки : макет заголовка группировки действует на указанную группировку и на все ее вложенные группировки до момента обнаружения другого макета заголовка группировки. При обнаружении другого макета заголовка группировки начинает использоваться обнаруженный макет заголовка группировки. Тем самым существует возможность создания различных макетов заголовка для различных группировок.


В данном примере для группировки Контрагент создан макет заголовка группировки. Данный макет также действует и на группировку с именем ДетальныеЗаписиНоменклатуры .


В данном примере для группировок Контрагент и ДетальныеЗаписиНоменклатуры созданы разные макеты заголовка группировки.


Макет ресурсов

Данный макет предназначен для оформления ресурсов таблицы. Ресурсами таблицы называется область отчета, содержащая значения полей ресурсов группировок или детальных записей. На указанном ниже рисунке выделены примеры областей ресурсов.


Для каждого макета ресурсов необходимо указать, для какой группировки строки и колонки таблицы он создается. Таким образом, макет ресурсов создается как бы на пересечении соответствующей строки и колонки таблицы. Например, на указанном ниже рисунке создается макет ресурсов для группировок Контрагент (колонки таблицы) и Номенклатура (строки таблицы).


При создании макета ресурсов необходимо указать либо имя группировки, либо поля группировки, для которой создается макет. Также необходимо указать тип макета. Типы макетов такие же, как и для макета группировки.


На указанном ниже рисунке изображен отчет с таблицей, в которой колонками являются контрагенты, а строками – номенклатура. Для указанной таблицы создано два макета ресурсов : макет ресурсов для колонок (изображен наклонным шрифтом) и макет ресурсов для общих итогов по горизонтали (изображен наклонным жирным шрифтом).


Примечание : для того чтобы макеты оформления не влияли на предопределенные макеты, создан специальный пустой макет оформления БезОформления . Данный макет оформления можно использовать в случае, когда необходимо использовать только цвета, шрифты и т. д. из предопределенных макетов.

Читайте также: