Как предотвратить автоматическое добавление новой строки в табличную часть управляемой формы 1С при нажатии стрелки "Вниз"?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами в системе 1С:Предприятие 8.3, разработчики и пользователи часто сталкиваются с необходимостью тонкой настройки поведения табличных частей. Добавление реквизитов и элементов на управляемые формы может осуществляться разными способами, но управление стандартным поведением существующих элементов часто требует программного вмешательства. Одна из распространенных задач — это предотвращение автоматического добавления новой пустой строки при нажатии клавиши "Стрелка Вниз", когда курсор находится в последней ячейке последней строки таблицы. При этом нам важно сохранить возможность ручного редактирования существующих строк и программного добавления новых записей.

Рассмотрим эту проблему подробнее и выясним, как мы можем эффективно управлять поведением табличной части, чтобы достичь желаемого результата. Мы проанализируем различные подходы и найдем наиболее оптимальное решение, учитывая, что построение эффективных интерфейсов требует не только грамотной организации данных, но и удобных механизмов взаимодействия с ними.

Попытки решения и их ограничения

Изначально, при столкновении с подобной задачей, разработчики часто обращают внимание на свойство РежимДобавленияСтрок элемента управления "Таблица". Давайте разберем его функциональность и почему оно не всегда подходит для нашей конкретной задачи.

1. Использование свойства РежимДобавленияСтрок

Свойство РежимДобавленияСтрок (RowAddingMode) элемента "Таблица" предназначено для управления возможностью добавления новых строк в табличную часть. Оно может принимать следующие значения:

  1. Использование: Это значение по умолчанию. Оно позволяет добавлять новые строки как вручную (через кнопку "Добавить" в командной панели табличной части или нажатием "Стрелки Вниз" в последней строке таблицы), так и программно.
  2. Запрет: Это значение полностью запрещает добавление новых строк через интерфейс пользователя. В этом режиме добавлять строки в табличную часть можно только программно, используя метод Добавить() объекта табличной части.

На первый взгляд, установка значения Запрет для свойства РежимДобавленияСтрок кажется идеальным решением. Мы могли бы установить его и затем программно добавлять строки, например, по нажатию отдельной кнопки, реализованной на форме. Посмотрим, как выглядит программное добавление строки:


&НаСервере
Процедура ДобавитьСтрокуВТабличнуюЧастьНаСервере()
    Объект.ИмяВашейТабличнойЧасти.Добавить();
КонецПроцедуры

Однако, здесь возникает ключевое ограничение, которое делает этот подход неприемлемым для нашей задачи. Когда РежимДобавленияСтрок установлен в Запрет, он не только предотвращает добавление новой строки при нажатии "Стрелки Вниз", но и полностью блокирует возможность ручного ввода и редактирования данных в любую существующую ячейку табличной части. Пользователь не сможет вносить изменения в строки, если они не были добавлены программно или не существовали до установки этого режима. Это прямо противоречит нашему требованию о сохранении возможности ручного редактирования существующих строк.

2. Обработка событий ПриНажатии и ПриОкончанииРедактирования

Мы могли бы рассмотреть возможность перехвата нажатия клавиши "Стрелка Вниз" с помощью событий, подобных тем, что используются, когда реализуется программное перемещение колонки или другие динамические изменения формы. Давайте проанализируем, почему эти события не всегда подходят:

Оптимальное решение: Обработка события ПриИзменении для ключевого поля табличной части

Учитывая ограничения предыдущих подходов, мы приходим к более гибкому решению. Суть его заключается в том, чтобы позволить системе добавить новую пустую строку, а затем немедленно проверить ее. Если она окажется пустой в определенном нами ключевом поле, мы ее удалим.

Разберем этот подход по шагам:

  1. Выбор ключевого поля. Мы определяем поле, обязательное для заполнения (например, ИдентификаторСтроки или Номенклатура).
  2. Создание обработчика события ПриИзменении. Для выбранного поля табличной части создаем обработчик, который сработает при потере фокуса или завершении ввода.
  3. Логика в обработчике. Внутри мы проверяем, пусто ли поле. Если да — удаляем строку.

Пример кода для реализации решения (табличная часть Товары, поле ИдентификаторСтроки):


&НаКлиенте
Процедура ТоварыИдентификаторСтрокиПриИзменении(Элемент)
    // Проверяем, является ли текущее ключевое поле пустым или неопределенным.
    Если Элемент.ТекущиеДанные.ИдентификаторСтроки = Неопределено ИЛИ Строка(Элемент.ТекущиеДанные.ИдентификаторСтроки) = "" Тогда
        // Удаляем текущую (только что добавленную и оставшуюся пустой) строку.
        Элементы.Товары.УдалитьСтроки(Элемент.ТекущиеДанные);
    КонецЕсли;
КонецПроцедуры

Давайте разберем, почему это эффективно:

Важные моменты и преимущества данного решения:

Выводы

Наиболее практичным способом для предотвращения нежелательного автоматического добавления пустых строк в табличную часть является использование обработчика события ПриИзменении для одного из ключевых полей. Этот подход обеспечивает удобство работы, предотвращая появление "лишних" записей.

Мы рассмотрели шаги реализации и логику работы кода. Чтобы на лету анализировать поведение элементов и их свойства во время разработки, удобно использовать редактор форм в режиме предприятия, который позволяет редактировать свойства открытых форм без постоянного перезапуска конфигуратора. Надеемся, это решение поможет вам в создании качественных интерфейсов на платформе 1С:Предприятие 8.3.

← На главную