Скрытие столбца в табличном макете 1С: в конфигураторе и из кода

· 9 мин

Содержание

Колонку макета можно скрыть тремя способами: на этапе проектирования, программно через свойство Видимость области ячеек или обнулив ширину столбца. Первый подходит для постоянных колонок, второй для условных: «нет скидок — столбец «Скидка» не нужен».

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

Сравнение способов: какой выбрать

СпособКогда подходитОграничение
Скрытие в редакторе макетаКолонка нужна не всегда, но решение принимает разработчик, а не данныеДля пользователя ничего не меняется без правки макета
Область.Видимость = ЛожьУсловие зависит от данных: пустой столбец, настройка пользователяНужно знать номер колонки в итоговом документе
Область.ШиринаКолонки = 0Быстрый приём, когда колонку надо «схлопнуть»Колонка формально существует, в Excel её можно показать
Отдельные области макетаСостав колонок меняется сильно (два-три варианта таблицы)Больше областей в макете, но нет работы с координатами

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

Как работает свойство «Видимость» у области ячеек

Свойство Видимость есть у объекта ОбластьЯчеек табличного документа. Значение Ложь прячет все строки или столбцы, которые попали в область. Значение Истина возвращает их.

Важно, что скрывается не сам набор ячеек, а строки или столбцы целиком. Если вы получили область из одной ячейки и поставили ей Видимость = Ложь, 1С не скроет ячейку. Нужна область, которая занимает столбец по всей высоте.

Поэтому первый шаг всегда один: получить область-столбец. Это делают так:

// Область, занимающая третий столбец по всей высоте таблицы
ОбластьКолонки = ТабДок.Область(1, 3, ТабДок.ВысотаТаблицы(), 3);
ОбластьКолонки.Видимость = Ложь;

Параметры по порядку: верхняя строка, левая колонка, нижняя строка, правая колонка. Для столбца левая и правая границы совпадают.

Скрытые колонки не удаляются и не сдвигают нумерацию. Третий столбец остаётся третьим, даже если он не виден. Это удобно: координаты в коде не «плывут».

Скрытие колонок на этапе проектирования макета

Откройте макет в конфигураторе: у объекта (документ, обработка, справочник) в ветке «Макеты» выберите макет и откройте его двойным щелчком. Выделите заголовок нужной колонки, щёлкнув по её номеру над таблицей, и вызовите контекстное меню. Команды управления колонками там есть, а ширину задают в окне свойств выделенного столбца.

Для постоянной настройки подойдёт любой из приёмов:

  1. Выделите столбец целиком и скройте его командой контекстного меню.
  2. Задайте минимальную ширину столбца, если нужен «схлопнутый» вид.
  3. Вынесите необязательную колонку в отдельную область, чтобы подключать её только по условию.

Третий вариант гибче всего. Допустим, в накладной есть колонка «Артикул», которую показывают не всем. Вы заводите две области: СтрокаСАртикулом и СтрокаБезАртикула. В коде выбираете, какую вывести. Ни координаты, ни видимость трогать не надо.

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

Программное управление видимостью в коде

Типовая задача: вывести таблицу и спрятать столбец, если он пустой во всех строках. Алгоритм простой: пройти по строкам, найти хотя бы одно значение, и если ничего не нашлось, скрыть столбец.

Процедура СкрытьПустыеКолонки(ТабДок, ПерваяСтрока, ПерваяКолонка, ПоследняяКолонка)

	ВысотаТаблицы = ТабДок.ВысотаТаблицы();

	Для Колонка = ПерваяКолонка По ПоследняяКолонка Цикл
		ЕстьДанные = Ложь;
		Для Строка = ПерваяСтрока По ВысотаТаблицы Цикл
			Если НЕ ПустаяСтрока(ТабДок.Область(Строка, Колонка).Текст) Тогда
				ЕстьДанные = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;

		Если НЕ ЕстьДанные Тогда
			ТабДок.Область(1, Колонка, ВысотаТаблицы, Колонка).Видимость = Ложь;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Процедура вызывается после того, как таблица полностью заполнена и выведена. Параметр ПерваяСтрока — строка, с которой начинаются данные (после шапки). Заголовок колонки не должен влиять на проверку, иначе «пустых» колонок не будет никогда.

Если условие не зависит от содержимого, всё ещё проще:

Если НЕ ПоказыватьСкидку Тогда
	ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Ложь;
КонецЕсли;

А вернуть колонку так:

ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Истина;

Ширина как запасной приём

Второй рычаг — ШиринаКолонки. Ширину ставят у области-столбца:

ТабДок.Область(1, 5, ТабДок.ВысотаТаблицы(), 5).ШиринаКолонки = 0;

Работает, но хуже. При нулевой ширине колонка не исчезает логически: пользователь, открыв сохранённый файл, может вытянуть её обратно. Видимость надёжнее по смыслу, потому что явно говорит платформе: «этого столбца в документе нет».

Как узнать номер нужной колонки

Жёстко прописанные номера ломаются при первой же правке макета. Если добавить колонку слева, все цифры в коде сдвигаются.

Надёжнее брать номер из именованной области. В макете выделите ячейку шапки нужной колонки и дайте ей имя. Затем получите координаты:

ОбластьШапки = ТабДок.Область("КолонкаСкидка");
НомерКолонки = ОбластьШапки.Лево;

Свойства Лево, Право, Верх, Низ возвращают координаты области. Из Лево вы получаете индекс столбца, и он остаётся верным, как бы ни менялся макет.

Если область выводится много раз (например, строки таблицы), имя нужно только в шапке. Колонки у шапки и строк в одной таблице совпадают.

Имя области действует в рамках того документа, куда область выведена. Если вы собираете документ из нескольких макетов, проверьте, что имя не повторяется: 1С вернёт первую найденную область, а не ту, что вы ожидали.

Работа с диапазонами: несколько колонок сразу

Скрыть сразу блок столбцов можно одной областью. Нужны левая и правая границы:

// Скрыть колонки с 4-й по 7-ю
ТабДок.Область(1, 4, ТабДок.ВысотаТаблицы(), 7).Видимость = Ложь;

Для несмежных колонок вызывают скрытие по очереди. Удобно собрать их номера в массив:

КолонкиКСкрытию = Новый Массив;
КолонкиКСкрытию.Добавить(2);
КолонкиКСкрытию.Добавить(6);
КолонкиКСкрытию.Добавить(9);

Для Каждого НомерКолонки Из КолонкиКСкрытию Цикл
	ТабДок.Область(1, НомерКолонки, ТабДок.ВысотаТаблицы(), НомерКолонки).Видимость = Ложь;
КонецЦикла;

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

Группировка как альтернатива

У табличного документа есть группировки колонок: пользователь сворачивает и разворачивает блок значком рядом с шапкой. Это хороший вариант для отчётов, где пользователь сам решает, нужны ли ему детали. В отличие от Видимость, пользователь может раскрыть группу без вмешательства разработчика.

Для печатной формы группировка обычно не нужна. Там состав колонок определяете вы.

Вывод на печать и в Excel

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

С экспортом в Excel картина не такая строгая. Ориентируйтесь на правило: скрытая колонка в файле обычно остаётся скрытой, но её можно показать средствами Excel. Если данные в колонке конфиденциальные (цена закупки, скидка клиента), не полагайтесь на скрытие. Не выводите такую колонку в документ вообще.

Для этого есть простая проверка. Сформируйте документ, сохраните в формате Excel и откройте файл: посмотрите, видна ли колонка и есть ли в ней данные.

Что нужноКак поступить
Колонка не нужна на бумаге, в файле допустимаВидимость = Ложь
Колонка не должна попасть к получателю документаНе выводить область с этой колонкой
Пользователь сам решает, что смотретьГруппировка колонок

Ещё одна особенность: ширину печатной страницы настраивают через свойства печати табличного документа (масштаб, «по ширине страницы»). Если после скрытия колонок на листе осталось много пустого места, проверьте, не задан ли у формы фиксированный масштаб.

Скорость работы при частых изменениях видимости

На небольших формах разницы не заметите. На отчётах в десятки тысяч строк полезно помнить три вещи.

  1. Меняйте видимость один раз после вывода, а не в каждой строке. Один вызов на столбец, а не тысяча.
  2. Не проверяйте содержимое колонки через Область(Строка, Колонка).Текст для всех строк, если можно решить по данным. Пусты ли значения, проще узнать из таблицы значений или запроса до вывода.
  3. Пользуйтесь областью на весь столбец, а не обходом ячеек.

Рабочий приём: перед выводом по данным определить набор нужных колонок, вывести документ и после сразу скрыть лишние. Так код не лезет в уже сформированный документ с проверками.

// Определяем по данным, нужна ли колонка скидки
ЕстьСкидки = Ложь;
Для Каждого Строка Из ТаблицаТоваров Цикл
	Если Строка.Скидка <> 0 Тогда
		ЕстьСкидки = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;

// ... вывод таблицы ...

Если НЕ ЕстьСкидки Тогда
	ТабДок.Область(1, КолонкаСкидки, ТабДок.ВысотаТаблицы(), КолонкаСкидки).Видимость = Ложь;
КонецЕсли;

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

Готовый пример: печатная форма с необязательной колонкой

Соберём всё вместе. Нужна форма со столбцами «Номенклатура», «Количество», «Цена», «Скидка», «Сумма». Скидку показываем, только если она есть хотя бы в одной строке.

Порядок работы такой:

  1. В макете дайте ячейке шапки столбца «Скидка» имя ШапкаСкидка.
  2. Выведите шапку и строки таблицы обычным способом, через ПолучитьОбласть и Вывести.
  3. Определите по данным, есть ли скидки, как показано выше.
  4. Получите номер колонки: НомерСкидки = ТабДок.Область("ШапкаСкидка").Лево.
  5. Если скидок нет, скройте колонку областью на всю высоту таблицы.
  6. Покажите документ или отправьте на печать.

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

Хотите, чтобы форма была одинаково аккуратной в обоих вариантах, выровняйте итоговую строку по правому краю таблицы. Тогда скрытие колонки не оставит «дыры» справа.

Типичные ошибки и способы их решения

Диагностика: выберите симптом

Частые вопросы

Можно ли скрыть колонку у пользователя без правки макета?
В печатной форме можно через условие в коде: макет не меняется, меняется видимость в готовом документе. В отчётах на СКД состав колонок настраивается самим пользователем в настройках отчёта.
Скрытая колонка занимает место на странице?
Нет. При печати на лист попадают только видимые столбцы, поэтому остальные получают больше места.
Что лучше: Видимость или нулевая ширина?
Видимость. Она явно сообщает, что столбца в документе нет. Нулевая ширина — запасной приём для быстрых решений.
Меняется ли нумерация столбцов после скрытия?
Нет. Скрытая колонка сохраняет свой номер, и координаты остальных не сдвигаются.
Как скрыть колонку только при печати, а на экране оставить?
Скрывайте колонку в копии документа, которую отправляете на печать, а экранный экземпляр оставьте как есть.