При выгрузке отчетов на платформе 1С в формат Excel или при их обычном просмотре разработчики и пользователи часто сталкиваются с неэстетичным поведением: одна и та же колонка (например, «Банковский счет» или «Оплачено») неожиданно оказывается разделенной на две или более узкие подколонки. При этом соседние ячейки выравниваются корректно. Выясним причину такого поведения схемы компоновки данных (СКД) и рассмотрим способы настройки отчета для сохранения единой сетки.
Проанализируем механику работы платформы 1С при выгрузке отчета. В момент компоновки отчета система формирует единую математическую сетку вертикальных колонок для всего результирующего объекта ТабличныйДокумент.
Если над основной таблицей данных выводится заголовок отчета, выбранные параметры или отборы, платформа создает для них верхние объединяемые области ячеек. Если правые или левые границы верхних объединенных ячеек хотя бы на несколько пикселей не совпадают с вертикальными границами колонок таблицы данных, платформа 1С вынуждена расщеплять колонки самой таблицы на несколько узких подколонок. В результате визуально ячейка таблицы выглядит нормально за счет объединения, но в реальности структура документа оказывается сбитой, что мешает корректной работе пользователей с файлом в Excel.
Разберем самый простой вариант исправления схемы компоновки без написания кода. Если проблема заключается именно в сбивающей сетку шапке отчета, выполним следующие шаги:
Если заголовок отчета все же необходим, его можно вывести первым элементом структуры отчета в виде отдельной текстовой группировки без колонок, чтобы она не влияла на общую ширину столбцов.
Проанализируем ситуацию, когда разбиение колонок происходит из-за вывода дочерних реквизитов ссылочного объекта (например, реквизитов банковского счета или контрагента):
В случаях, когда стандартными настройками СКД не удается добиться ровной сетки, выравнивание заголовков реализуют программно после вывода результата компоновки. Рассмотрим пример процедуры обработки ячеек результирующего документооборота:
Процедура ОбработатьЗаголовки(ТабДок)
ОбъединяемаяОбласть = Неопределено;
// Проходим по верхним строкам шапки табличного документа
Для индСтр = 1 По 10 Цикл
НачальнаяКолонка = 0;
Для индКол = 1 По ТабДок.ШиринаТаблицы Цикл
ТекИмяПоля = ТабДок.Область(индСтр, индКол).Текст;
// Исключаем ресурсы из обработки
Если Не СхемаКомпоновкиДанных.ПоляИтога.Найти(ТекИмяПоля) = Неопределено Тогда
Продолжить;
КонецЕсли;
// Проверяем необходимость объединения
Если ОбъединятьЯчейки(ТабДок, индСтр, индКол) Тогда
Если Не НачальнаяКолонка Тогда
НачальнаяКолонка = индКол;
КонецЕсли;
ИначеЕсли НачальнаяКолонка Тогда
ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
ОбъединяемаяОбласть = ТабДок.Область(индСтр, НачальнаяКолонка, индСтр, индКол);
ОбъединяемаяОбласть.Объединить();
ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
НачальнаяКолонка = 0;
Иначе
НачальнаяКолонка = 0;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол)
Ячейка = ТабДок.Область(индСтр, индКол);
ЯчейкаСлед = ТабДок.Область(индСтр, индКол + 1);
Если ПустаяСтрока(Ячейка.Текст) Тогда
Возврат Ложь;
ИначеЕсли Ячейка.Текст = ЯчейкаСлед.Текст Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Наиболее надежным техническим решением является разделение формирования сетки заголовка и сетки основной таблицы отчета через обработчик ПриКомпоновкеРезультата в модуле объекта отчета.
Посмотри, как реализуется данный подход:
ПриКомпоновкеРезультата.СтандартнаяОбработка = Ложь.ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент в другой документ.Вывести() или ВставитьОбласть(). При этом сетка колонок таблицы не искажается границами шапки.Таким образом, комбинируя правильные настройки параметров вывода и при необходимости разделяя вывод шапки и таблицы данных, вы получите аккуратный отчет с фиксированной единой сеткой колонок, готовый к удобной выгрузке и обработке в Excel.