Как программно скрыть колонку в печатной форме 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке печатных форм в системе 1С:Предприятие часто возникает задача адаптации внешнего вида документа под конкретные условия. Одной из самых распространенных задач является необходимость скрыть определенную колонку (например, цену, артикул или сумму НДС) в зависимости от настроек пользователя или параметров самого документа. В данной статье мы подробно разберем несколько эффективных способов решения этой задачи, проанализируем типичные ошибки и выясним, как сохранить структуру таблицы при динамическом изменении состава колонок.

Метод 1. Сборка таблицы из вертикальных областей (Присоединить)

Этот способ считается наиболее корректным с точки зрения архитектуры 1С. Вместо того чтобы выводить всю строку целиком, мы разделяем макет на именованные вертикальные секции и «собираем» строку по частям. Рассмотрим подробнее, как это реализовать.

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

Разберем по шагам алгоритм вывода такой таблицы:

  1. Получаем области из макета.
  2. Выводим первую (левую) часть строки с помощью метода Вывести().
  3. Проверяем условие и, если нужно, добавляем следующую колонку методом Присоединить().
  4. Добавляем остальные колонки также через Присоединить().

Посмотрим на пример кода:


Макет = ПолучитьМакет("ПечатнаяФорма");
ОбластьСтрокаНачало = Макет.ПолучитьОбласть("Строка|КолонкаНомер");
ОбластьСтрокаНоменклатура = Макет.ПолучитьОбласть("Строка|КолонкаНоменклатура");
ОбластьСтрокаЦена = Макет.ПолучитьОбласть("Строка|КолонкаЦена");
ОбластьСтрокаСумма = Макет.ПолучитьОбласть("Строка|КолонкаСумма");

ТабДок.Вывести(ОбластьСтрокаНачало);
ТабДок.Присоединить(ОбластьСтрокаНоменклатура);

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

ТабДок.Присоединить(ОбластьСтрокаСумма);

Важный нюанс: при использовании этого метода структура результирующего документа формируется «на лету». Если условие не выполняется, колонка Цена просто не попадает в итоговый ТабличныйДокумент, и последующие колонки автоматически сдвигаются влево, не оставляя пустого места.

Метод 2. Установка ширины колонки в ноль

Рассмотрим ситуацию, когда таблица уже сформирована или переписывать алгоритм вывода через Присоединить() слишком трудозатратно. В этом случае мы можем воздействовать на уже готовый результат. Один из самых простых способов «скрыть» данные — установить ширину соответствующей колонки в значение 0.

Проанализируем ситуацию, описанную в обсуждении: почему команда типа Т.Область("ИмяКолонки").Видимость = Ложь часто вызывает ошибку? Дело в том, что после того как область из макета была выведена в результирующий табличный документ методом Вывести() или Присоединить(), она теряет свое «имя». В итоговом документе больше нет области с именем НазваниеКолонки, если вы не задали его принудительно.

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


// Предположим, мы знаем, что колонка с ценой — третья по счету
НомерКолонки = 3;
ОбластьКолонки = ТабДок.Область(, НомерКолонки, , НомерКолонки);
ОбластьКолонки.ШиринаКолонки = 0;

Если вы не знаете точный номер колонки (например, если состав колонок меняется динамически), можно воспользоваться методом поиска текста в шапке документа:


ОбластьНаходка = ТабДок.НайтиТекст("Цена");
Если ОбластьНаходка <> Неопределено Тогда
    НомерКолонки = ОбластьНаходка.Лево;
    ТабДок.Область(, НомерКолонки, , НомерКолонки).ШиринаКолонки = 0;
КонецЕсли;

Метод 3. Использование метода Скрыть()

Метод Скрыть() является более специализированным аналогом установки ширины в ноль. Он полностью исключает колонку из визуального отображения и печати.

Рассмотрим пример использования этого метода для результирующего документа:


// Скрываем 5-ю колонку
ТабДок.Область(, 5, , 5).Скрыть();

Преимущество этого метода в том, что он работает аналогично скрытию строк или колонок в Excel. Однако помните о проблеме объединенных ячеек. Если в шапке документа есть ячейка, объединенная по горизонтали и перекрывающая скрываемую колонку, визуальный результат может быть непредсказуемым (шапка может «поехать»).

Проблема «обрезанной» шапки и её решение

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

Чтобы этого избежать, рекомендуем придерживаться следующих правил:

  1. Программная коррекция объединения: Перед тем как скрывать или удалять колонку, найдите объединенные области в шапке, установите свойство Объединить = Ложь, скорректируйте границы и объедините их снова, исключая индекс скрытой колонки.
  2. Автомасштаб: Используйте свойство ТабДок.АвтоМасштаб = Истина. Это позволит системе самостоятельно подогнать итоговую ширину таблицы под параметры страницы (например, А4) после удаления лишних элементов.
  3. Использование нескольких макетов: Если вариантов отображения колонок немного, проще создать два отдельных макета (или две разные области строк в одном макете). Проанализируем этот подход: он требует больше времени на дизайн макета, но код становится максимально простым — вы просто выбираете нужную область по условию Если... Тогда....

Метод 4. Удаление области (УдалитьОбласть)

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


ОбластьДляУдаления = ТабДок.Область(, НомерКолонки, , НомерКолонки);
ТабДок.УдалитьОбласть(ОбластьДляУдаления, ТипСмещенияТабличногоДокумента.ПоГоризонтали);

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

Итоги и рекомендации

Подводя итог, можно выделить следующую стратегию выбора метода:

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

← На главную