При разработке и настройке интерфейсов на управляемых формах 1С часто возникает типовая, но неочевидная для многих пользователей и начинающих разработчиков проблема. Разберем ситуацию: у нас есть документ, в нем табличная часть, а один из реквизитов этой таблицы имеет тип строки неограниченной длины. Для элемента формы установлен многострочный режим. Однако, когда пользователь начинает набирать текст и нажимает клавишу Enter для перехода на новую строку, система вместо переноса каретки завершает редактирование ячейки и переходит к следующему элементу. Проанализируем причину такого поведения и рассмотрим все доступные способы решения этой задачи, чтобы сделать работу в системе максимально комфортной.
Для начала выясним причину такого поведения платформы. В управляемых формах 1С:Предприятия поведение клавиши Enter при редактировании ячеек табличной части жестко регламентировано разработчиками платформы. По умолчанию нажатие этой клавиши сигнализирует системе об окончании ввода данных в текущее поле и инициирует переход к следующей ячейке или строке. Изменить эту логику программным путем так, чтобы клавиша Enter просто переносила строку внутри узкой ячейки таблицы, практически невозможно без потери стандартного и привычного пользователям функционала навигации. Поэтому мы рассмотрим другие, более корректные и эргономичные подходы.
Самый простой и быстрый способ, который не требует от разработчика никаких дополнительных настроек конфигурации, — это использование системного сочетания клавиш. Рассмотрим подробнее этот пользовательский метод.
Если вам нужно разорвать строку и перейти на новую, не выходя из режима редактирования ячейки, используйте комбинацию Shift + Enter. Это стандартное платформенное сочетание, которое позволяет вводить многострочный текст напрямую в поле таблицы. В некоторых случаях пользователи по аналогии с популярными табличными редакторами могут пробовать Alt + Enter, однако в среде 1С основным и гарантированно работающим сочетанием является именно комбинация с клавишей Shift.
Если ввод текста по нажатию горячих клавиш кажется пользователям неудобным (что часто бывает при необходимости ввода больших объемов текста), разберем встроенную настройку платформы — свойство РасширенноеРедактирование (или ExtendedEdit).
РасширенноеРедактирование и установите его в значение Истина.Какой будет результат? В ячейке таблицы появится специальная кнопка (обычно она выглядит как иконка лупы или кнопка с тремя точками). При нажатии на эту кнопку перед пользователем откроется отдельное модальное или блокирующее окно с полноценным большим текстовым полем. В этом окне можно свободно использовать обычный Enter для переноса строк. Это решение значительно повышает удобство при работе с объемными комментариями или описаниями.
Проанализируем наиболее профессиональный подход с точки зрения пользовательского опыта (UX). Если текст действительно большой, втискивать его в ячейку таблицы нецелесообразно. Посмотрим на пример, когда многострочное поле выносится за пределы самой таблицы.
Мы не добавляем реквизит как колонку таблицы на форму, либо делаем колонку невидимой или только для чтения, а под таблицей создаем самостоятельный элемент ПолеВвода.
Чтобы это поле всегда отображало текст из выделенной строки таблицы, настроим путь к данным (свойство Данные) для этого поля следующим образом:
Элементы.ИмяВашейТаблицы.ТекущиеДанные.ИмяВашегоРеквизита
При таком подходе, когда пользователь перемещается курсором по строкам таблицы, в нижнем многострочном поле автоматически обновляется текст, соответствующий текущей строке. В этом отдельном поле клавиша Enter работает привычным образом (переносит строку), появляется удобная полоса прокрутки, и при этом сама табличная часть остается визуально компактной и аккуратной.
Если по каким-то причинам настройка расширенного редактирования вам не подходит, создадим собственный механизм ввода через отдельное окно. Разберем по шагам, как это реализовать с помощью события НачалоВыбора и метода ПоказатьВводСтроки.
КнопкаВыбора (появится кнопка с тремя точками).НачалоВыбора для этого поля.Посмотрим на пример кода, который решает эту задачу асинхронно, как того требуют современные стандарты разработки 1С:
&НаКлиенте
Процедура ТоварыТекстОписаниеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартную обработку, чтобы не открывалось типовое окно выбора
СтандартнаяОбработка = Ложь;
// Получаем текущие данные строки
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Описываем обработчик завершения ввода
Оповещение = Новый ОписаниеОповещения("ПослеВводаТекстаОписания", ЭтотОбъект, ТекущиеДанные);
// Вызываем окно для ввода многострочного текста
ПоказатьВводСтроки(Оповещение, ТекущиеДанные.ТекстОписание, "Введите описание (многострочно)", 0, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаТекстаОписания(ВведеннаяСтрока, ДополнительныеПараметры) Экспорт
// Если пользователь не отменил ввод
Если ВведеннаяСтрока <> Неопределено Тогда
// Записываем введенный текст обратно в реквизит текущей строки
ДополнительныеПараметры.ТекстОписание = ВведеннаяСтрока;
КонецЕсли;
КонецПроцедуры
Таким образом, мы даем пользователю понятный интерфейс: он нажимает на кнопку в ячейке, перед ним всплывает окно, где он вводит любой текст с переносами строк, нажимает "ОК", и текст сохраняется в реквизите.
Даже если вы настроили удобный ввод, текст нужно еще и удобно читать. Рассмотрим, какие настройки отображения существуют в платформе.
Свойство Автовысота строки (AutoRowHeight)
Если в колонке находится многострочный текст, стандартная фиксированная высота строки обрежет его, и пользователь увидит только первую строку. Чтобы текст отображался целиком, найдите саму таблицу (элемент формы) и установите в ее свойствах флаг АвтовысотаСтроки. Высота каждой строки будет динамически подстраиваться под самый объемный текст в ячейках этой строки.
Принудительная Высота поля
Для конкретного поля в таблице можно принудительно задать свойство Высота, указав, например, значение 2 или 3. Также полезно использовать свойство РастягиватьПоВертикали. Это визуально расширит ячейки конкретно в этой колонке, превращая их в подобие небольших текстовых блоков.
В завершение разберем ситуацию, когда вам нужно вводить не просто «плоский» текст, а полноценный документ с выделением жирным шрифтом, списками и цветами. В этом случае обычный тип «Строка» не подойдет. В 1С для таких задач используется объект ФорматированныйДокумент. Для изучения практических примеров работы с этим объектом можно использовать материал по использованию форматированного документа.
Однако важно помнить: платформа не поддерживает прямое отображение и редактирование типа ФорматированныйДокумент непосредственно внутри ячеек табличной части. Если у вас возникла такая архитектурная задача, вам обязательно придется выносить элемент интерфейса, связанный с форматированным документом, за пределы таблицы — в отдельную область формы (как мы рассматривали в разделе про динамическое связывание полей). При переходе по строкам таблицы вы будете программно инициализировать и обновлять содержимое этого отдельного редактора. Для организации такой рабочей области подойдёт встраиваемый визуальный редактор форматированного текста.
Применяя описанные выше подходы, мы можем гибко настроить работу с многострочными реквизитами на управляемых формах 1С, обеспечив максимальное удобство для конечных пользователей системы.