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