Скрытие столбца в табличном макете 1С: в конфигураторе и из кода
Содержание
Колонку макета можно скрыть тремя способами: на этапе проектирования, программно через свойство Видимость области ячеек или обнулив ширину столбца. Первый подходит для постоянных колонок, второй для условных: «нет скидок — столбец «Скидка» не нужен».
Для печатных форм обычно выбирают второй путь. Макет остаётся один, а состав колонок меняется по данным документа. Ниже разобрано, чем способы отличаются, как адресовать нужный столбец и что будет при выводе на печать и в Excel.
Сравнение способов: какой выбрать
| Способ | Когда подходит | Ограничение |
|---|---|---|
| Скрытие в редакторе макета | Колонка нужна не всегда, но решение принимает разработчик, а не данные | Для пользователя ничего не меняется без правки макета |
Область.Видимость = Ложь | Условие зависит от данных: пустой столбец, настройка пользователя | Нужно знать номер колонки в итоговом документе |
Область.ШиринаКолонки = 0 | Быстрый приём, когда колонку надо «схлопнуть» | Колонка формально существует, в Excel её можно показать |
| Отдельные области макета | Состав колонок меняется сильно (два-три варианта таблицы) | Больше областей в макете, но нет работы с координатами |
Если вариантов таблицы два или три, часто проще завести отдельные области и выводить нужную. Если колонок много и условий много, управляйте видимостью из кода.
Как работает свойство «Видимость» у области ячеек
Свойство Видимость есть у объекта ОбластьЯчеек табличного документа. Значение Ложь прячет все строки или столбцы, которые попали в область. Значение Истина возвращает их.
Важно, что скрывается не сам набор ячеек, а строки или столбцы целиком. Если вы получили область из одной ячейки и поставили ей Видимость = Ложь, 1С не скроет ячейку. Нужна область, которая занимает столбец по всей высоте.
Поэтому первый шаг всегда один: получить область-столбец. Это делают так:
// Область, занимающая третий столбец по всей высоте таблицы
ОбластьКолонки = ТабДок.Область(1, 3, ТабДок.ВысотаТаблицы(), 3);
ОбластьКолонки.Видимость = Ложь;
Параметры по порядку: верхняя строка, левая колонка, нижняя строка, правая колонка. Для столбца левая и правая границы совпадают.
Скрытые колонки не удаляются и не сдвигают нумерацию. Третий столбец остаётся третьим, даже если он не виден. Это удобно: координаты в коде не «плывут».
Скрытие колонок на этапе проектирования макета
Откройте макет в конфигураторе: у объекта (документ, обработка, справочник) в ветке «Макеты» выберите макет и откройте его двойным щелчком. Выделите заголовок нужной колонки, щёлкнув по её номеру над таблицей, и вызовите контекстное меню. Команды управления колонками там есть, а ширину задают в окне свойств выделенного столбца.
Для постоянной настройки подойдёт любой из приёмов:
- Выделите столбец целиком и скройте его командой контекстного меню.
- Задайте минимальную ширину столбца, если нужен «схлопнутый» вид.
- Вынесите необязательную колонку в отдельную область, чтобы подключать её только по условию.
Третий вариант гибче всего. Допустим, в накладной есть колонка «Артикул», которую показывают не всем. Вы заводите две области: СтрокаСАртикулом и СтрокаБезАртикула. В коде выбираете, какую вывести. Ни координаты, ни видимость трогать не надо.
Скрытая в макете колонка остаётся в макете. Если форму сформировали с помощью ПолучитьОбласть, свойства видимости переносятся вместе с областью, и она так же скрыта в готовом документе. Проверьте это на тестовом выводе до того, как отдавать форму пользователям.
Программное управление видимостью в коде
Типовая задача: вывести таблицу и спрятать столбец, если он пустой во всех строках. Алгоритм простой: пройти по строкам, найти хотя бы одно значение, и если ничего не нашлось, скрыть столбец.
Процедура СкрытьПустыеКолонки(ТабДок, ПерваяСтрока, ПерваяКолонка, ПоследняяКолонка)
ВысотаТаблицы = ТабДок.ВысотаТаблицы();
Для Колонка = ПерваяКолонка По ПоследняяКолонка Цикл
ЕстьДанные = Ложь;
Для Строка = ПерваяСтрока По ВысотаТаблицы Цикл
Если НЕ ПустаяСтрока(ТабДок.Область(Строка, Колонка).Текст) Тогда
ЕстьДанные = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЕстьДанные Тогда
ТабДок.Область(1, Колонка, ВысотаТаблицы, Колонка).Видимость = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура вызывается после того, как таблица полностью заполнена и выведена. Параметр ПерваяСтрока — строка, с которой начинаются данные (после шапки). Заголовок колонки не должен влиять на проверку, иначе «пустых» колонок не будет никогда.
Если условие не зависит от содержимого, всё ещё проще:
Если НЕ ПоказыватьСкидку Тогда
ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Ложь;
КонецЕсли;
А вернуть колонку так:
ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Истина;
Ширина как запасной приём
Второй рычаг — ШиринаКолонки. Ширину ставят у области-столбца:
ТабДок.Область(1, 5, ТабДок.ВысотаТаблицы(), 5).ШиринаКолонки = 0;
Работает, но хуже. При нулевой ширине колонка не исчезает логически: пользователь, открыв сохранённый файл, может вытянуть её обратно. Видимость надёжнее по смыслу, потому что явно говорит платформе: «этого столбца в документе нет».
Как узнать номер нужной колонки
Жёстко прописанные номера ломаются при первой же правке макета. Если добавить колонку слева, все цифры в коде сдвигаются.
Надёжнее брать номер из именованной области. В макете выделите ячейку шапки нужной колонки и дайте ей имя. Затем получите координаты:
ОбластьШапки = ТабДок.Область("КолонкаСкидка");
НомерКолонки = ОбластьШапки.Лево;
Свойства Лево, Право, Верх, Низ возвращают координаты области. Из Лево вы получаете индекс столбца, и он остаётся верным, как бы ни менялся макет.
Если область выводится много раз (например, строки таблицы), имя нужно только в шапке. Колонки у шапки и строк в одной таблице совпадают.
Имя области действует в рамках того документа, куда область выведена. Если вы собираете документ из нескольких макетов, проверьте, что имя не повторяется: 1С вернёт первую найденную область, а не ту, что вы ожидали.
Работа с диапазонами: несколько колонок сразу
Скрыть сразу блок столбцов можно одной областью. Нужны левая и правая границы:
// Скрыть колонки с 4-й по 7-ю
ТабДок.Область(1, 4, ТабДок.ВысотаТаблицы(), 7).Видимость = Ложь;
Для несмежных колонок вызывают скрытие по очереди. Удобно собрать их номера в массив:
КолонкиКСкрытию = Новый Массив;
КолонкиКСкрытию.Добавить(2);
КолонкиКСкрытию.Добавить(6);
КолонкиКСкрытию.Добавить(9);
Для Каждого НомерКолонки Из КолонкиКСкрытию Цикл
ТабДок.Область(1, НомерКолонки, ТабДок.ВысотаТаблицы(), НомерКолонки).Видимость = Ложь;
КонецЦикла;
Если в таблице есть объединённые ячейки в шапке, поведение зависит от того, какие столбцы они затрагивают. Скройте один из объединённых столбцов, и заголовок может «ужаться» или пропасть. Протестируйте шапку отдельно: при условных колонках объединения лучше делать внутри одной группы, которая скрывается целиком.
Группировка как альтернатива
У табличного документа есть группировки колонок: пользователь сворачивает и разворачивает блок значком рядом с шапкой. Это хороший вариант для отчётов, где пользователь сам решает, нужны ли ему детали. В отличие от Видимость, пользователь может раскрыть группу без вмешательства разработчика.
Для печатной формы группировка обычно не нужна. Там состав колонок определяете вы.
Вывод на печать и в Excel
Скрытые колонки не попадают на печатный лист. Это то, ради чего их скрывают, и особенно заметно при подгонке формы под ширину страницы: когда колонок меньше, остальные занимают больше места.
С экспортом в Excel картина не такая строгая. Ориентируйтесь на правило: скрытая колонка в файле обычно остаётся скрытой, но её можно показать средствами Excel. Если данные в колонке конфиденциальные (цена закупки, скидка клиента), не полагайтесь на скрытие. Не выводите такую колонку в документ вообще.
Для этого есть простая проверка. Сформируйте документ, сохраните в формате Excel и откройте файл: посмотрите, видна ли колонка и есть ли в ней данные.
| Что нужно | Как поступить |
|---|---|
| Колонка не нужна на бумаге, в файле допустима | Видимость = Ложь |
| Колонка не должна попасть к получателю документа | Не выводить область с этой колонкой |
| Пользователь сам решает, что смотреть | Группировка колонок |
Ещё одна особенность: ширину печатной страницы настраивают через свойства печати табличного документа (масштаб, «по ширине страницы»). Если после скрытия колонок на листе осталось много пустого места, проверьте, не задан ли у формы фиксированный масштаб.
Скорость работы при частых изменениях видимости
На небольших формах разницы не заметите. На отчётах в десятки тысяч строк полезно помнить три вещи.
- Меняйте видимость один раз после вывода, а не в каждой строке. Один вызов на столбец, а не тысяча.
- Не проверяйте содержимое колонки через
Область(Строка, Колонка).Текстдля всех строк, если можно решить по данным. Пусты ли значения, проще узнать из таблицы значений или запроса до вывода. - Пользуйтесь областью на весь столбец, а не обходом ячеек.
Рабочий приём: перед выводом по данным определить набор нужных колонок, вывести документ и после сразу скрыть лишние. Так код не лезет в уже сформированный документ с проверками.
// Определяем по данным, нужна ли колонка скидки
ЕстьСкидки = Ложь;
Для Каждого Строка Из ТаблицаТоваров Цикл
Если Строка.Скидка <> 0 Тогда
ЕстьСкидки = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// ... вывод таблицы ...
Если НЕ ЕстьСкидки Тогда
ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Ложь;
КонецЕсли;
Проверка по таблице значений быстрее, чем чтение текста из ячеек документа.
Готовый пример: печатная форма с необязательной колонкой
Соберём всё вместе. Нужна форма со столбцами «Номенклатура», «Количество», «Цена», «Скидка», «Сумма». Скидку показываем, только если она есть хотя бы в одной строке.
Порядок работы такой:
- В макете дайте ячейке шапки столбца «Скидка» имя
ШапкаСкидка. - Выведите шапку и строки таблицы обычным способом, через
ПолучитьОбластьиВывести. - Определите по данным, есть ли скидки, как показано выше.
- Получите номер колонки:
НомерСкидки = ТабДок.Область("ШапкаСкидка").Лево. - Если скидок нет, скройте колонку областью на всю высоту таблицы.
- Покажите документ или отправьте на печать.
Итоговая сумма и подписи под таблицей не зависят от скрытого столбца, если в макете они не опираются на его ширину. Проверьте это глазами один раз: сформируйте форму с обоими вариантами данных, со скидкой и без, и сравните, как выглядит нижняя часть листа.
Хотите, чтобы форма была одинаково аккуратной в обоих вариантах, выровняйте итоговую строку по правому краю таблицы. Тогда скрытие колонки не оставит «дыры» справа.