При работе с управляемыми формами в системе 1С:Предприятие 8.3, разработчики и пользователи часто сталкиваются с необходимостью тонкой настройки поведения табличных частей. Добавление реквизитов и элементов на управляемые формы может осуществляться разными способами, но управление стандартным поведением существующих элементов часто требует программного вмешательства. Одна из распространенных задач — это предотвращение автоматического добавления новой пустой строки при нажатии клавиши "Стрелка Вниз", когда курсор находится в последней ячейке последней строки таблицы. При этом нам важно сохранить возможность ручного редактирования существующих строк и программного добавления новых записей.
Рассмотрим эту проблему подробнее и выясним, как мы можем эффективно управлять поведением табличной части, чтобы достичь желаемого результата. Мы проанализируем различные подходы и найдем наиболее оптимальное решение, учитывая, что построение эффективных интерфейсов требует не только грамотной организации данных, но и удобных механизмов взаимодействия с ними.
Изначально, при столкновении с подобной задачей, разработчики часто обращают внимание на свойство РежимДобавленияСтрок элемента управления "Таблица". Давайте разберем его функциональность и почему оно не всегда подходит для нашей конкретной задачи.
1. Использование свойства РежимДобавленияСтрок
Свойство РежимДобавленияСтрок (RowAddingMode) элемента "Таблица" предназначено для управления возможностью добавления новых строк в табличную часть. Оно может принимать следующие значения:
Использование: Это значение по умолчанию. Оно позволяет добавлять новые строки как вручную (через кнопку "Добавить" в командной панели табличной части или нажатием "Стрелки Вниз" в последней строке таблицы), так и программно.Запрет: Это значение полностью запрещает добавление новых строк через интерфейс пользователя. В этом режиме добавлять строки в табличную часть можно только программно, используя метод Добавить() объекта табличной части.На первый взгляд, установка значения Запрет для свойства РежимДобавленияСтрок кажется идеальным решением. Мы могли бы установить его и затем программно добавлять строки, например, по нажатию отдельной кнопки, реализованной на форме. Посмотрим, как выглядит программное добавление строки:
&НаСервере
Процедура ДобавитьСтрокуВТабличнуюЧастьНаСервере()
Объект.ИмяВашейТабличнойЧасти.Добавить();
КонецПроцедуры
Однако, здесь возникает ключевое ограничение, которое делает этот подход неприемлемым для нашей задачи. Когда РежимДобавленияСтрок установлен в Запрет, он не только предотвращает добавление новой строки при нажатии "Стрелки Вниз", но и полностью блокирует возможность ручного ввода и редактирования данных в любую существующую ячейку табличной части. Пользователь не сможет вносить изменения в строки, если они не были добавлены программно или не существовали до установки этого режима. Это прямо противоречит нашему требованию о сохранении возможности ручного редактирования существующих строк.
2. Обработка событий ПриНажатии и ПриОкончанииРедактирования
Мы могли бы рассмотреть возможность перехвата нажатия клавиши "Стрелка Вниз" с помощью событий, подобных тем, что используются, когда реализуется программное перемещение колонки или другие динамические изменения формы. Давайте проанализируем, почему эти события не всегда подходят:
ПриНажатии: Это событие доступно для некоторых полей ввода. В его обработчике мы могли бы анализировать КодКлавиши и, если это "Стрелка Вниз" (код 40), устанавливать СтандартнаяОбработка = Ложь, чтобы отменить стандартное действие. Однако, опыт показывает, что данное событие не всегда надежно срабатывает в контексте табличных частей при переходе из последней ячейки в новую, еще не существующую строку.ПриОкончанииРедактирования: Данное событие табличной части срабатывает, когда пользователь завершает редактирование текущей строки. В этом событии доступны параметры НоваяСтрока и Отказ. Казалось бы, можно отменить добавление, если строка пустая.
&НаКлиенте
Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, Отказ)
Если НоваяСтрока И Отказ Тогда
Если Элемент.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Элемент.ТекущиеДанные.Пустая() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПриИзменении для ключевого поля табличной частиУчитывая ограничения предыдущих подходов, мы приходим к более гибкому решению. Суть его заключается в том, чтобы позволить системе добавить новую пустую строку, а затем немедленно проверить ее. Если она окажется пустой в определенном нами ключевом поле, мы ее удалим.
Разберем этот подход по шагам:
ИдентификаторСтроки или Номенклатура).ПриИзменении. Для выбранного поля табличной части создаем обработчик, который сработает при потере фокуса или завершении ввода.Пример кода для реализации решения (табличная часть Товары, поле ИдентификаторСтроки):
&НаКлиенте
Процедура ТоварыИдентификаторСтрокиПриИзменении(Элемент)
// Проверяем, является ли текущее ключевое поле пустым или неопределенным.
Если Элемент.ТекущиеДанные.ИдентификаторСтроки = Неопределено ИЛИ Строка(Элемент.ТекущиеДанные.ИдентификаторСтроки) = "" Тогда
// Удаляем текущую (только что добавленную и оставшуюся пустой) строку.
Элементы.Товары.УдалитьСтроки(Элемент.ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
Давайте разберем, почему это эффективно:
ИдентификаторСтроки).ПриИзменении.Строка(Элемент.ТекущиеДанные.ИдентификаторСтроки) = "" определяет пустоту, и метод УдалитьСтроки мгновенно убирает лишний элемент.Важные моменты и преимущества данного решения:
Наиболее практичным способом для предотвращения нежелательного автоматического добавления пустых строк в табличную часть является использование обработчика события ПриИзменении для одного из ключевых полей. Этот подход обеспечивает удобство работы, предотвращая появление "лишних" записей.
Мы рассмотрели шаги реализации и логику работы кода. Чтобы на лету анализировать поведение элементов и их свойства во время разработки, удобно использовать редактор форм в режиме предприятия, который позволяет редактировать свойства открытых форм без постоянного перезапуска конфигуратора. Надеемся, это решение поможет вам в создании качественных интерфейсов на платформе 1С:Предприятие 8.3.