В процессе разработки печатных форм и журналов в 1С часто возникает задача сделать документ интерактивным. Типичный пример — журнал инструктажа, где пользователь прямо в выведенной форме выбирает темы из справочника. Однако при добавлении длинного текста высота строки не всегда подстраивается автоматически, что приводит к «обрезанию» информации. Разберем подробно, как решить проблему автоматического изменения высоты строки в уже сформированном табличном документе, особенно для конфигураций на обычных формах, таких как УПП 1.2.
Многие разработчики начинают с установки стандартных свойств области в макете или программно. Обычно это следующий набор команд:
Область.АвтоВысотаСтроки = Истина;
Область.РастягиватьПоГоризонтали = Истина;
Область.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
Проанализируем ситуацию: если эти настройки заданы, но высота не меняется, скорее всего, вы столкнулись с одним из двух ограничений платформы 1С:
АвтоВысотаСтроки перестает работать корректно. Платформа просто не может вычислить высоту для сложной структуры колонок.АвтоВысотаСтроки.Рассмотрим первый метод, который помогает в простых случаях (без объединения ячеек). Чтобы заставить 1С пересчитать высоту, нужно не только установить флаг, но и сбросить текущее значение высоты в ноль. Это дает платформе сигнал, что размер строки не определен и его нужно рассчитать исходя из содержимого.
В обработчике события ПолеТабличногоДокумента1Выбор (или аналогичном) выполните следующий код:
// Получаем текущую строку, где произошло изменение
НомерСтроки = Элемент.ТекущаяОбласть.Верх;
ОбластьСтроки = Элемент.Область(НомерСтроки, , НомерСтроки, );
// Устанавливаем свойства для переноса и автовысоты
ОбластьСтроки.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
ОбластьСтроки.АвтоВысотаСтроки = Истина;
// КРИТИЧЕСКИ ВАЖНО: устанавливаем высоту в 0 для принудительного пересчета
ОбластьСтроки.ВысотаСтроки = 0;
Если ячейки объединены или стандартные свойства не помогают, мы применим профессиональный метод — расчет высоты через временный «невидимый» документ. Суть метода заключается в том, что мы создаем копию нашей ячейки в пустом документе, где нет объединения колонок, и просим платформу рассчитать высоту там.
Разберем этот процесс по шагам:
ТабличныйДокумент в оперативной памяти.АвтоВысотаСтроки.Пример реализации функции для вычисления высоты:
Функция РассчитатьВысотуСтроки(Текст, ШиринаКолонки)
ВремТабДок = Новый ТабличныйДокумент;
// Устанавливаем ширину колонки точно как в оригинале
ВремТабДок.Область("C1").ШиринаКолонки = ШиринаКолонки;
// Заполняем ячейку данными
Ячейка = ВремТабДок.Область("R1C1");
Ячейка.Текст = Текст;
Ячейка.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
// Включаем автовысоту для строки
ВремТабДок.Область("R1").АвтоВысотаСтроки = Истина;
ВремТабДок.Область("R1").ВысотаСтроки = 0;
// Платформа рассчитает высоту при попытке обращения к ней
Возврат ВремТабДок.Область("R1").ВысотаСтроки;
КонецФункции
Затем в событии выбора вызовем эту функцию и установим значение:
// Пример вызова
ШиринаОбласти = ТекущаяОбласть.ШиринаКолонки; // Если колонка одна
// Если ячейка объединена, нужно просуммировать ширину всех входящих колонок
НоваяВысота = РассчитатьВысотуСтроки(НоваяТемаИнструктажа, ШиринаОбласти);
ОбластьСтроки.ВысотаСтроки = НоваяВысота;
Проанализируем еще один подход, предложенный в обсуждении: использование заранее подготовленных областей макета. Если мы знаем, что темы инструктажа обычно укладываются в 1, 2 или 3 строки, мы можем создать в макете три варианта одной и той же строки с разной фиксированной высотой.
Выясним причину выбора этого метода: он работает быстрее, чем создание временных документов, и гарантирует предсказуемый визуальный результат. Однако он менее гибкий.
Рассмотрим алгоритм действий:
Строка_1_линия, Строка_2_линии, Строка_3_линии.СтрДлина() или считаем количество символов ПС (перенос строки).ВставитьОбласть(), чтобы заменить текущую строку на нужную область из макета.Пример кода для выбора области:
ДлинаТекста = СтрДлина(ВыбраннаяТема);
Если ДлинаТекста > 100 Тогда
НужнаяОбласть = Макет.ПолучитьОбласть("Строка_3_линии");
ИначеЕсли ДлинаТекста > 50 Тогда
НужнаяОбласть = Макет.ПолучитьОбласть("Строка_2_линии");
Иначе
НужнаяОбласть = Макет.ПолучитьОбласть("Строка_1_линия");
КонецЕсли;
// Заполняем область и выводим (или подменяем в уже выведенном ТабДоке)
НужнаяОбласть.Параметры.Тема = ВыбраннаяТема;
При работе с динамической высотой в Обычных формах (как в УПП 1.2) стоит учитывать следующие моменты:
Arial и Times New Roman при одинаковом кегле может существенно влиять на высоту строки.ТабличныйДокумент не перерисовывается мгновенно. В этом случае можно попробовать метод ТабДок.Показать() или просто передать фокус другому элементу формы, чтобы спровоцировать обновление графического интерфейса.Подведем итог: наиболее надежным способом для интерактивных форм является метод скрытого расчетного документа. Он позволяет игнорировать проблемы объединенных ячеек и дает точный результат в пунктах, который затем легко применить к строке выведенного документа.