Почему удаляется последняя строка в табличной части при клике мышью и как это исправить?

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

При работе с документами в управляемых формах 1С:Предприятие 8 (особенно в отраслевых решениях, таких как ITIL) пользователи часто сталкиваются с неприятным поведением системы: после добавления новой строки в табличную часть и ввода данных, стоит только кликнуть мышкой в любое другое место формы, как эта строка бесследно исчезает. Разберем детально, почему это происходит и как настроить систему так, чтобы данные сохранялись корректно.

Выясним причину: механизм «пустой строки» платформы 1С

Первым делом проанализируем логику работы платформы. В «1С:Предприятие 8» реализован механизм защиты базы данных от мусорных записей. Если пользователь нажимает кнопку «Добавить», создается временный объект в памяти. Если в процессе редактирования в строку не было внесено изменений, которые платформа считает «существенными», или если фокус был потерян до момента фиксации строки, система считает эту строку пустой и автоматически удаляет ее.

Проблема часто усугубляется тем, что пользователь может заполнить несколько полей, но не заполнить те, которые платформа или программный код считают обязательными. В этом случае при клике мышкой вне таблицы срабатывает триггер окончания редактирования, и если валидация не пройдена или данные не «помечены» как измененные, строка аннулируется без предупреждения.

Решение 1: Сброс свойства «АвтоВводНовойСтроки»

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

Для исправления выполним следующие шаги:

  1. Откроем конфигуратор и найдем нужную управляемую форму документа.
  2. В дереве элементов формы выберем соответствующую табличную часть (например, Активы).
  3. В окне свойств найдем параметр АвтоВводНовойСтроки.
  4. Установим значение этого свойства в Ложь (снимем флажок).

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

Решение 2: Программная инициализация в событии ПриНачалеРедактирования

Если отключение автоматического ввода не помогло, проанализируем ситуацию глубже. Платформа должна точно «знать», что строка не пуста. Лучший способ гарантировать это — программно заполнить хотя бы один реквизит сразу в момент создания строки. Это заставит систему считать строку измененной.

Посмотрим на пример кода, который следует разместить в модуле формы:


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

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

Решение 3: Изменение режима редактирования таблицы

Разберем влияние свойства РежимРедактирования у таблицы формы. В управляемых формах доступно несколько вариантов: Вход в панель, Непосредственно и В списке.

Зачастую в сложных конфигурациях типа ITIL установлен режим Вход в панель, что может приводить к конфликтам фокуса при работе мышью. Попробуем изменить режим на В списке. Это заставляет платформу более жестко фиксировать данные строки при переходе между ячейками и при потере фокуса всей таблицы. Это делается в свойствах элемента формы Таблица.

Решение 4: Проверка свойства «Проверка заполнения»

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

Если пользователь кликает мышкой по форме, не заполнив такое поле, возможны два сценария:

  1. Система выдает предупреждение (красный пунктир или сообщение).
  2. Если в программном коде в обработчике ПередОкончаниемРедактирования стоит «тихий» отказ (параметр Отказ = Истина без вывода сообщений), строка просто исчезнет.

Проверьте обработчик ПередОкончаниемРедактирования. Если там есть условия, которые не выполняются для новой строки, их нужно скорректировать.

Решение 5: Особенности релизов платформы

Нельзя исключать и технологические ошибки самой платформы 1С:Предприятие 8.3. В некоторых релизах (особенно в диапазоне 8.3.15.ххх – 8.3.17.ххх) наблюдались баги, связанные с некорректной передачей фокуса в управляемых формах при использовании командных панелей. Если вы используете старый релиз, рекомендуется обновиться до актуальных стабильных версий, таких как 8.3.21 и выше.

Резюме по исправлению ситуации

Для гарантированного решения проблемы рекомендуется комбинированный подход:

  1. Отключите АвтоВводНовойСтроки в свойствах таблицы на форме.
  2. Используйте обработчик ПриНачалеРедактирования для заполнения обязательных полей значениями по умолчанию (например, Количество = 1 или Дата = ТекущаяДата()).
  3. Убедитесь, что в коде события ПередОкончаниемРедактирования нет логики, которая устанавливает Отказ = Истина без уведомления пользователя.

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

← На главную