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