В процессе разработки в 1С часто возникает задача по формированию табличного документа с нестандартным форматированием. Одна из таких задач — создание сетки из идеально квадратных ячеек, например, для разработки визуальных схем, игровых полей или других графических интерфейсов. На первый взгляд, задача кажется простой, но на практике разработчики сталкиваются с неочевидной проблемой.
Рассмотрим подробно, почему прямое присвоение одинаковых значений высоте строки и ширине колонки не дает нужного результата и как правильно настроить табличный документ для получения квадратной сетки.
Основная сложность заключается в том, что платформа 1С использует разные единицы измерения для высоты строк и ширины колонок табличного документа.
ВысотаСтроки измеряется в пунктах (пт). Это стандартная типографская единица, равная 1/72 дюйма.ШиринаКолонки измеряется в условных единицах — количестве средних символов шрифта, установленного для ячейки по умолчанию. Эта величина зависит от типа и размера шрифта.Из-за этой разницы простое присвоение одинаковых числовых значений, например Область.ВысотаСтроки = 10 и Область.ШиринаКолонки = 10, приведет к созданию прямоугольной, а не квадратной ячейки. Платформа не предоставляет встроенных функций для прямого пересчета этих единиц, поэтому для решения задачи необходимо использовать обходные пути.
Самый распространенный и действенный метод — это подбор соотношения (коэффициента) между высотой и шириной, которое визуально дает квадрат. Этот коэффициент подбирается опытным путем и может незначительно меняться в зависимости от используемого шрифта.
Рассмотрим пример кода, где для заданного диапазона ячеек устанавливаются размеры с использованием такого коэффициента. В этом примере для получения квадрата ширина колонки устанавливается как Размер / 2, а высота строки — Размер * 3. Эти множители и есть наш эмпирический коэффициент.
Посмотрим на пример:
Процедура УстановитьКвадратныеЯчейки(ТабличныйДокумент, РазмерЯчейки, КоличествоКолонок, КоличествоСтрок)
ТабличныйДокумент.Очистить();
// Подбираем коэффициент. Например, соотношение ширины к высоте примерно 1:6
// Ширина = РазмерЯчейки
// Высота = РазмерЯчейки * 6 (или другие значения, подобранные экспериментально)
// В примере из форума использовались значения Размер/2 и Размер*3, что дает то же соотношение 1:6
ЗначениеШирины = РазмерЯчейки / 2;
ЗначениеВысоты = РазмерЯчейки * 3;
// Устанавливаем ширину для нужного количества колонок
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ОбластьКолонка = ТабличныйДокумент.Область("C" + Формат(НомерКолонки, "ЧГ=0"));
ОбластьКолонка.ШиринаКолонки = ЗначениеШирины;
КонецЦикла;
// Устанавливаем высоту для нужного количества строк
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ОбластьСтрока = ТабличныйДокумент.Область("R" + Формат(НомерСтроки, "ЧГ=0"));
ОбластьСтрока.ВысотаСтроки = ЗначениеВысоты;
КонецЦикла;
КонецПроцедуры
Этот способ хорошо работает, но имеет недостаток: перебор всех строк и колонок в цикле может быть непроизводительным, если речь идет о больших табличных документах.
Платформа 1С позволяет задавать свойства сразу для всего документа, не прибегая к циклам. Для этого нужно получить область всего табличного документа через метод Область() без параметров и уже для этой области установить нужные значения свойств ШиринаКолонки и ВысотаСтроки.
Этот подход значительно производительнее и делает код более лаконичным.
Рассмотрим улучшенный пример:
Процедура СформироватьКвадратнуюСетку(ТабДок)
// Устанавливаем подобранные значения для получения квадрата
// Например, соотношение 2 к 12, или 3 к 18 и т.д.
Ширина = 3;
Высота = 18;
// Применяем ширину ко всем колонкам документа
ТабДок.Область().ШиринаКолонки = Ширина;
// Применяем высоту ко всем строкам документа
ТабДок.Область().ВысотаСтроки = Высота;
// Важный момент: чтобы ячейки не меняли высоту при добавлении текста,
// отключаем автоматический подбор высоты
ТабДок.Область().АвтоВысотаСтроки = Ложь;
КонецПроцедуры
Важный момент, отмеченный в обсуждении, — это свойство АвтоВысотаСтроки. Если оно установлено в Истина (что является значением по умолчанию), то при добавлении в ячейку текста, который не помещается в одну строку, ее высота автоматически увеличится, нарушая геометрию нашей квадратной сетки. Поэтому для сохранения строгой формы ячеек это свойство следует устанавливать в Ложь.
Если размеры и количество ячеек вашей сетки фиксированы, отличным решением будет создание и настройка макета в конфигураторе. Вы можете один раз вручную настроить все высоты и ширины, цвета и границы, а затем программно выводить этот макет в табличный документ.
Разберем по шагам:
// Пример вывода заранее подготовленного макета
Макет = ПолучитьМакет("МойКвадратныйМакет");
ОбластьМакета = Макет.ПолучитьОбласть("Сетка");
ТабличныйДокумент.Вывести(ОбластьМакета);
Этот метод идеален для статических форм, так как полностью избавляет от необходимости подбирать коэффициенты в коде и обеспечивает предсказуемый результат.
Стоит отметить, что ТабличныйДокумент в 1С предназначен в первую очередь для отчетов и табличного представления данных. Для создания сложных интерактивных визуальных схем, диаграмм или графических редакторов его возможности могут быть ограничены.
Если ваша задача выходит за рамки простой "рисовалки", возможно, стоит рассмотреть использование внешних компонентов (ActiveX) или других технологий, которые предоставляют более мощные инструменты для работы с графикой.