В процессе разработки отчетов и печатных форм в системе 1С:Предприятие часто возникает ситуация, когда один и тот же макет используется для вывода данных в разных контекстах. Иногда нам требуется, чтобы определенный параметр, присутствующий в области макета, в одном случае заполнялся данными, а в другом — оставался пустым или вовсе скрывался. При этом вносить изменения в сам макет (Макет) нельзя, так как он является общим или жестко заданным.
Разберем детально, как можно реализовать такое поведение программно, проанализируем типичные ошибки и рассмотрим несколько эффективных способов управления содержимым ячеек в уже сформированном табличном документе.
Прежде всего, нам необходимо понять фундаментальный принцип работы 1С с табличными документами. Проанализируем жизненный цикл ячейки. В объекте Макет ячейка может иметь заполненное свойство Заполнение со значением Параметр. Однако, как только мы выполняем команду Вывести() или Присоединить(), область копируется в итоговый ТабличныйДокумент.
Важный нюанс: в результирующем документе понятия «параметр» больше не существует. Для системы это теперь просто ячейка, содержащая конкретный текст или значение. Поэтому попытка обратиться к свойству следующим образом будет ошибочной:
// ОШИБОЧНЫЙ КОД
ТабДок.Область("R1C1").Параметр = "Текст";
У объекта типа ОбластьЯчеекТабличногоДокумента нет свойства Параметр. Для изменения данных в уже выведенной таблице мы должны использовать свойства Текст или Значение.
Рассмотрим ситуацию, когда мы точно знаем координаты ячейки, которую нужно очистить. Если в макете для ячейки установлено свойство «Содержать значение», то для очистки содержимого в коде следует использовать свойство Значение. Если же это обычный текст, используем свойство Текст.
Посмотрим на пример кода:
// Очистка текста в конкретной ячейке по адресу
ТабДок.Область(5, 3).Текст = ""; // Очищаем 5-ю строку, 3-ю колонку
// Если ячейка типизирована (например, Число или Дата)
ТабДок.Область("R5C3").Значение = Неопределено;
Проанализируем ситуацию: если параметр был заполнен как число, простое присвоение пустой строки в свойство Текст иногда может не сработать корректно из-за установленного формата или типа значения в макете. В таких случаях лучше работать напрямую со свойством Значение.
Если нам нужно не просто изменить текст, а полностью «обнулить» ячейку, сохранив при этом её визуальное оформление (границы, шрифт, заливку), воспользуемся методом Очистить(). Этот метод более гибкий, так как позволяет выбрать, что именно мы хотим удалить.
Выясним, как применить этот метод правильно. У него есть системное перечисление ТипОчисткиТабличногоДокумента. Рассмотрим пример:
НужнаяОбласть = ТабДок.Область(НомерСтроки, НомерКолонки);
// Удаляем только содержимое (текст/значение), не трогая рамки и цвета
НужнаяОбласть.Очистить(ТипОчисткиТабличногоДокумента.Содержимое);
Этот способ гарантирует, что визуально ячейка останется частью таблицы, но данные из нее исчезнут.
Основная сложность заключается в том, что при динамическом построении отчета мы не всегда знаем заранее номер строки, в которой окажется нужный нам параметр. Чтобы не прописывать номера строк «вслепую» (не использовать хардкод), воспользуемся свойствами самого табличного документа:
ТабДок.ВысотаТаблицы — возвращает номер последней выведенной строки.ТабДок.ШиринаТаблицы — возвращает общее количество колонок.Разберем алгоритм: сразу после вывода области, содержащей нужный параметр, мы можем обратиться к нему, зная, что он находится в последней строке документа.
// Выводим область из макета
ТабДок.Вывести(ОбластьСтрока);
// Сразу после вывода получаем доступ к ячейке в последней строке
// Допустим, параметр находится во второй колонке
НомерПоследнейСтроки = ТабДок.ВысотаТаблицы;
ТабДок.Область(НомерПоследнейСтроки, 2).Текст = "";
Это один из самых профессиональных и «чистых» способов. Мы можем модифицировать область макета уже после того, как заполнили её параметры, но до того, как она попала в итоговый документ. Это позволяет точечно управлять данными, не меняя глобальную структуру.
Посмотрим на пошаговую реализацию:
Обл = Макет.ПолучитьОбласть("СтрокаДанных");Обл.Параметры.Заполнить(СтруктураДанных);
// Например, очищаем ячейку во второй колонке этой области
Обл.Область(1, 2).Текст = "";
ТабДок.Вывести(Обл);Этот подход идеален, если один и тот же параметр встречается в области несколько раз, а скрыть его нужно только в одном конкретном месте.
Проанализируем ситуацию, когда физическое удаление текста может нарушить работу встроенных формул табличного документа или привести к нежелательному изменению высоты строк. В таком случае мы можем прибегнуть к «хитрости» — визуальному скрытию.
Для этого достаточно установить цвет текста равным цвету фона ячейки:
Ячейка = ТабДок.Область(ТабДок.ВысотаТаблицы, 5);
Ячейка.ЦветТекста = Ячейка.ЦветФона;
Текст останется в документе (его можно будет увидеть, если выделить ячейку), но при печати и обычном просмотре он будет абсолютно невидим.
Если ваша ячейка с параметром является частью объединения (Merge), помните, что обращение к ней по адресу R1C1 сработает только в том случае, если этот адрес является «верхним левым» углом объединения.
Чтобы упростить себе задачу, мы рекомендуем в самом макете назначать имена не только строкам, но и конкретным ячейкам. Даже если параметр называется одинаково, имя ячейки (например, Ячейка_Скидка) позволит вам легко найти её в выведенной области через метод Область() без вычисления точных индексов строк и колонок.
Выясним причину, почему это удобно: при изменении структуры макета (добавлении новых колонок слева) ваш код, завязанный на номера колонок (например, Область(Строка, 2)), сломается. Код, использующий имя области, продолжит работать корректно.
Мы рассмотрели несколько вариантов решения задачи. Выбор метода зависит от ваших целей:
ТабДок.Область() через ВысотаТаблицы.Вывести().ЦветТекста.Используя эти приемы, вы сможете создавать гибкие и динамичные печатные формы, не перегружая макет избыточными областями и условиями.