Почему не работает автоматический ввод новой строки в табличной части документа 1С?

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

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

Основные причины и их решения

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

  1. Свойство "АвтоВводНовойСтроки" элемента табличной части

    Это первое и самое главное свойство, которое мы должны проверить. Если оно не установлено, то автоматический ввод новой строки не будет работать по определению. Давайте убедимся, что оно активно:

    • Перейдите на форму документа, где находится ваша табличная часть.
    • Выделите элемент формы, который представляет собой вашу табличную часть (например, "Товары").
    • В окне "Свойства" найдите свойство АвтоВводНовойСтроки (AutomaticNewRowEntry).
    • Убедитесь, что его значение установлено в Истина (Да). Если оно равно "Ложь", система не будет пытаться автоматически добавлять новую строку.

    Это свойство является ключевым условием для желаемого поведения.

  2. Свойство "ПропускатьПриВводе" у реквизитов табличной части

    Это свойство играет очень важную роль в логике перемещения курсора и, как следствие, в активации автоматического ввода новой строки. Оно определяет, будет ли курсор автоматически переходить на следующий элемент ввода или на следующую строку после ввода значения в текущем реквизите.

    • Для реквизитов табличной части: Для того чтобы система могла понять, что ввод текущей строки завершен, и перейти к созданию новой, необходимо, чтобы после заполнения последнего заполняемого реквизита курсор имел возможность переместиться. Если у всех реквизитов текущей строки, которые не являются обязательными для заполнения (или уже заполнены), свойство ПропускатьПриВводе (SkipOnEntry) установлено в Истина, то после ввода данных в последний требуемый реквизит курсор должен автоматически переместиться на следующую строку (при условии, что АвтоВводНовойСтроки включен). Если хотя бы один реквизит, требующий ввода, имеет ПропускатьПриВводе в значении Ложь, то система будет ждать ввода в этом реквизите, прежде чем разрешить переход к следующему или создать новую строку. Мы рекомендуем установить ПропускатьПриВводе = Истина для всех реквизитов табличной части, кроме тех, где вы явно хотите остановить курсор для ручного ввода или проверки.

    • Важный нюанс: Не устанавливайте "ПропускатьПриВводе" для самой табличной части! Как было отмечено в обсуждении (сообщение 11), установка свойства ПропускатьПриВводе в Да для *самой табличной части* является ошибкой. Это означает, что по клавише Enter будет пропускаться вся табличная часть целиком, и система не будет обрабатывать переход внутри нее, блокируя автоматический ввод новых строк. Это свойство должно быть установлено только для отдельных реквизитов.

  3. Свойство формы "ПоведениеКлавишиEnter"

    Поведение клавиши Enter на форме документа также может влиять на переход фокуса. Давайте проверим его:

    • Выделите саму форму документа (обычно нажатием на пустое место формы или на элемент "Форма" в дереве элементов).
    • В окне "Свойства" найдите свойство ПоведениеКлавишиEnter (EnterKeyBehavior).
    • Убедитесь, что оно установлено в значение ПереходПоЭлементам (TransitionBetweenElements). Это значение способствует стандартному перемещению фокуса между элементами формы. Если оно установлено в другое значение, например, "ВыполнениеКомандыПоУмолчанию", это может изменить стандартное поведение Enter, заставляя его выполнять какую-либо команду вместо перехода, что может блокировать автоматический ввод новой строки.
  4. Успешное завершение редактирования текущей строки

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

  5. Свойство "РазрешитьДобавление" у табличной части

    Хотя это кажется очевидным, важно убедиться, что у табличной части установлено свойство РазрешитьДобавление (AllowAdding) в Истина. Это свойство непосредственно контролирует возможность добавления новых строк в табличную часть. Если оно установлено в "Ложь", то новые строки, конечно же, добавляться не будут ни автоматически, ни вручную.

Программное решение (обходной путь)

В некоторых случаях, когда все вышеперечисленные настройки кажутся корректными, но автоматический ввод новой строки все равно не работает, можно прибегнуть к программному обходному пути. Этот метод не является идеальным решением, поскольку он имитирует действие пользователя, а не использует встроенные механизмы, но может помочь в сложных или нестандартных ситуациях, как показано в сообщении 3.

Суть метода заключается в имитации нажатия клавиши "Стрелка Вниз" после окончания редактирования строки. Клавиша "Вниз" является стандартным способом для перехода на новую строку после завершения редактирования текущей (особенно если Enter вместо этого переводит в режим редактирования текущей строки).

Рассмотрим пример кода, который можно разместить в обработчике события ПриОкончанииРедактирования (OnEndEdit) для вашей табличной части:


Процедура ТоварыПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    // Создаем объект Shell для имитации нажатия клавиш
    Shell = Новый COMОбъект("WScript.Shell");
    // Имитируем нажатие клавиши "Стрелка Вниз"
    Shell.SendKeys("{DOWN}");
КонецПроцедуры

Пояснения к коду:

Мы должны помнить, что это обходной путь. Использование WScript.Shell может быть небезопасным в некоторых средах (например, на сервере) или может иметь непредсказуемое поведение, если фокус окна внезапно изменится. Всегда предпочтительнее найти и устранить коренную причину, но в качестве временного решения или для особых случаев этот метод может быть полезен.

Дополнительные проверки и нюансы

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

  1. Программный код в обработчиках событий

    Иногда причиной блокировки могут быть существующие программные обработчики событий, которые перехватывают поведение окончания редактирования строки или нажатия клавиш. Если в обработчиках событий, таких как ПриОкончанииРедактирования, ПриИзменении (OnValueChange) для реквизитов, или ОбработкаНажатияКлавиш (KeyProcessing) для табличной части или формы, присутствует код, который явно устанавливает фокус на какой-либо другой элемент, отменяет переход или вызывает модальное окно, это может блокировать или изменять стандартный механизм автоматического ввода новой строки. Внимательно проанализируйте эти обработчики, особенно те, которые были написаны вами или вашими предшественниками.

  2. Корректность данных и проверки при изменении

    Если данные, введенные в реквизиты строки, некорректны или не проходят какие-либо программные проверки при изменении (например, в обработчиках ПриИзменении реквизита), система может не позволить перейти к новой строке, оставляя фокус на текущей до тех пор, пока ошибки не будут исправлены.

  3. Удаление и повторное добавление табличной части на форму

    В редких случаях, особенно при длительных модификациях формы, могут возникать внутренние ошибки или "глюки" в конфигурации формы. Как было предложено в сообщении 6, мы можем попробовать удалить элемент табличной части с формы и добавить его заново. Это может "сбросить" некорректные внутренние настройки элемента формы. После повторного добавления, конечно же, необходимо заново установить все свойства, такие как АвтоВводНовойСтроки, Высота, Ширина, и т.д.

  4. Стандартное поведение клавиши Enter и стрелки "Вниз"

    Мы должны помнить, что стандартное поведение системы 1С для клавиши Enter может отличаться от автоматического добавления новой строки. Часто Enter используется для завершения редактирования текущей ячейки или строки, при этом курсор остается на текущей строке, но переходит в режим ожидания. Для явного создания новой строки или перехода на нее, обычно используются клавиши Стрелка "Вниз" или Insert (сообщение 15). Если АвтоВводНовойСтроки не работает, но клавиша "Вниз" или "Insert" добавляют новую строку, это подтверждает, что система готова к добавлению, но автоматический триггер по Enter почему-то не срабатывает.

  5. Ограничения для первой строки

    Как было указано в сообщении 17, Автоввод новой строки работает только при окончании редактирования предыдущей новой строки. То есть, если табличная часть абсолютно пуста, первая строка не будет введена автоматически. Вам нужно будет начать ввод вручную (например, нажав Enter в пустой табличной части, чтобы создать первую строку, или ввести что-то в нее), и только после этого при завершении редактирования первой строки будет срабатывать автоматический ввод второй и последующих строк.

Мы рассмотрели множество причин и решений проблемы с автоматическим вводом новой строки в табличной части документов 1С. Обычно, внимательная проверка и корректировка свойств АвтоВводНовойСтроки, ПропускатьПриВводе и ПоведениеКлавишиEnter, а также анализ программного кода, решают эту проблему. Мы рекомендуем подходить к решению комплексно, проверяя все перечисленные пункты поочередно. Это позволит нам не только устранить текущую неполадку, но и глубже понять механизмы работы платформы 1С:Предприятие.

← На главную