При разработке отчетов и печатных форм в 1С часто возникает задача: в зависимости от определенных условий скрыть одну или несколько колонок. Казалось бы, достаточно установить свойство Видимость в значение Ложь, но на практике программисты часто сталкиваются с тем, что колонка упрямо продолжает отображаться. В этой статье мы подробно разберем, почему это происходит, рассмотрим влияние структуры макета на программный код и изучим альтернативные методы формирования таблиц.
Первая и самая распространенная ошибка — попытка изменить свойства области непосредственно в объекте Макет. Важно понимать: макет — это лишь «чертеж» или шаблон. Все манипуляции по скрытию данных должны производиться с тем объектом, который мы показываем пользователю, то есть с результирующим табличным документом. Проанализируем типичный сценарий:
// ОШИБКА: Изменение макета не повлияет на уже выведенные данные
Макет = ПолучитьМакет("МойМакет");
Область = Макет.Область("Колонка1");
Область.Видимость = Ложь;
// ПРАВИЛЬНО: Работаем с итоговым документом
ТабДок.Вывести(ОбластьШапка);
// ... заполнение документа ...
ТабДок.Область("C4").Видимость = Ложь;
Рассмотрим подробнее работу с адресацией. При использовании строковых имен ячеек (например, "C4"), следует помнить о раскладке клавиатуры. В платформе 1С для обозначения колонок используется латинская буква "C" (Column). Если написать русскую "С", код может отработать без ошибок, но желаемого результата вы не получите. Чтобы исключить подобные ошибки, мы рекомендуем использовать получение области по номерам строк и колонок:
// Скрываем 4-ю колонку во всем документе (с 1 по последнюю строку)
НомерКолонки = 4;
ТабДок.Область(, НомерКолонки, , НомерКолонки).Видимость = Ложь;
Выясним основную техническую причину, по которой метод Видимость = Ложь может не работать. В 1С существует понятие «формат строк». Если в макете для разных областей (например, для шапки и для строк данных) вы создали разные форматы строк (пункт меню «Таблица – Формат строк – Создать формат строк»), то колонки в этих областях физически перестают быть связанными. Посмотрим на ситуацию глазами платформы: колонка №3 в шапке и колонка №3 в табличной части — это разные объекты с точки зрения верстки, если у них разные форматы.
Проанализируем последствия: когда вы даете команду скрыть колонку №3 у всего документа, платформа пытается применить это к «основному» формату строк. Области с «собственным» форматом строк при этом могут игнорировать команду. Чтобы избежать этой проблемы, придерживайтесь следующих правил:
Разберем более продвинутый и надежный способ — метод Присоединить(). Вместо того чтобы выводить всю строку целиком, а потом пытаться что-то в ней скрыть, мы будем строить строку только из тех колонок, которые нам нужны. Это гарантирует корректность отображения и избавляет от проблем с индексами.
Посмотрим на пример кода, реализующий этот подход:
// Получаем области из макета
ОбластьЛево = Макет.ПолучитьОбласть("Строка|Начало");
ОбластьЦФО = Макет.ПолучитьОбласть("Строка|КолонкаЦФО");
ОбластьПраво = Макет.ПолучитьОбласть("Строка|Конец");
// Выводим начало строки
ТабДок.Вывести(ОбластьЛево);
// Проверяем условие видимости
Если НужноПоказыватьЦФО Тогда
ТабДок.Присоединить(ОбластьЦФО);
КонецЕсли;
// Присоединяем оставшуюся часть
ТабДок.Присоединить(ОбластьПраво);
Этот метод считается «золотым стандартом» при разработке сложных отчетов. Мы не скрываем лишнее, мы просто не выводим то, что не требуется. Это позволяет избежать проблем с объединением ячеек и гарантирует, что в итоговом документе (и при его экспорте в Excel) структура будет чистой и предсказуемой.
Проанализируем ситуацию с объединенными ячейками. Если колонка, которую вы хотите скрыть, является частью горизонтального объединения (например, одна шапка над тремя колонками), установка видимости для одной из этих колонок может привести к непредсказуемым результатам: либо скроется вся объединенная группа, либо команда будет проигнорирована.
Важный момент: если необходимо скрыть колонку, входящую в объединение, перед выводом области в макете следует убедиться, что логика документа позволяет «разорвать» это объединение или скрыть его целиком. В противном случае верстка «поплывет».
Рассмотрим разницу между свойствами Видимость = Ложь и ШиринаКолонки = 0. Хотя визуально результат в 1С может показаться одинаковым, есть существенные отличия при дальнейшей работе с документом:
Поэтому мы рекомендуем всегда использовать именно свойство Видимость для управления отображением столбцов, особенно если вам нужна качественная выгрузка справочников в Excel с фильтрами.
Чтобы сделать код более читаемым и устойчивым к изменениям макета, мы рекомендуем использовать именованные области, назначенные целиком на колонки. В макете 1С можно выделить всю колонку (нажав на её буквенный заголовок сверху) и назначить ей имя (например, КолонкаСумма).
Тогда в коде управление видимостью будет выглядеть максимально прозрачно:
Если СкрыватьСуммы Тогда
// Обращаемся к колонке по имени, заданному в макете
ТабДок.Область("КолонкаСумма").Видимость = Ложь;
КонецЕсли;
Важно: убедитесь, что имя области в макете назначено именно на всю колонку (сверху донизу), а не на конкретную ячейку в шапке. Только в этом случае свойство Видимость «схлопнет» весь столбец в итоговом табличном документе.
Если у вас не скрывается колонка в табличном документе, выполните следующую проверку по шагам:
Видимость у итогового ТабличногоДокумента, а не у Макета.Присоединить().Следуя этим правилам, вы сможете создавать гибкие и динамичные отчеты, которые корректно отображаются в платформе 1С и сохраняют свою структуру при выгрузке во внешние форматы.