При работе с документами в управляемых формах 1С:Предприятие 8 (особенно в отраслевых решениях, таких как ITIL) пользователи часто сталкиваются с неприятным поведением системы: после добавления новой строки в табличную часть и ввода данных, стоит только кликнуть мышкой в любое другое место формы, как эта строка бесследно исчезает. Разберем детально, почему это происходит и как настроить систему так, чтобы данные сохранялись корректно.
Первым делом проанализируем логику работы платформы. В «1С:Предприятие 8» реализован механизм защиты базы данных от мусорных записей. Если пользователь нажимает кнопку «Добавить», создается временный объект в памяти. Если в процессе редактирования в строку не было внесено изменений, которые платформа считает «существенными», или если фокус был потерян до момента фиксации строки, система считает эту строку пустой и автоматически удаляет ее.
Проблема часто усугубляется тем, что пользователь может заполнить несколько полей, но не заполнить те, которые платформа или программный код считают обязательными. В этом случае при клике мышкой вне таблицы срабатывает триггер окончания редактирования, и если валидация не пройдена или данные не «помечены» как измененные, строка аннулируется без предупреждения.
Рассмотрим самое простое решение, которое помогает в большинстве случаев. У элемента формы Таблица есть специфическое свойство, которое управляет поведением при окончании редактирования текущей строки.
Для исправления выполним следующие шаги:
Активы).АвтоВводНовойСтроки.Ложь (снимем флажок).Когда это свойство включено, платформа после завершения редактирования одной строки автоматически пытается инициировать ввод следующей. Если этот процесс прерывается кликом мыши в другую область экрана, механизм может «запутаться» в состояниях и удалить текущую незафиксированную строку.
Если отключение автоматического ввода не помогло, проанализируем ситуацию глубже. Платформа должна точно «знать», что строка не пуста. Лучший способ гарантировать это — программно заполнить хотя бы один реквизит сразу в момент создания строки. Это заставит систему считать строку измененной.
Посмотрим на пример кода, который следует разместить в модуле формы:
&НаКлиенте
Процедура АктивыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
// Заполняем значения по умолчанию, чтобы строка считалась "грязной" (измененной)
ТекущиеДанные = Элементы.Активы.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Например, установим количество по умолчанию или статус
ТекущиеДанные.Количество = 1;
// Если есть служебные реквизиты, можно заполнить их
ТекущиеДанные.КлючСвязи = Новый УникальныйИдентификатор();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование этого метода гарантирует, что даже если пользователь не успел ничего ввести и случайно кликнул мимо, в строке уже будут данные, и платформа сохранит её в составе коллекции табличной части.
Разберем влияние свойства РежимРедактирования у таблицы формы. В управляемых формах доступно несколько вариантов: Вход в панель, Непосредственно и В списке.
Зачастую в сложных конфигурациях типа ITIL установлен режим Вход в панель, что может приводить к конфликтам фокуса при работе мышью. Попробуем изменить режим на В списке. Это заставляет платформу более жестко фиксировать данные строки при переходе между ячейками и при потере фокуса всей таблицы. Это делается в свойствах элемента формы Таблица.
Проанализируем свойства реквизитов самой табличной части в дереве метаданных. Если у какого-то реквизита установлено свойство Проверка заполнения в значение Выдавать ошибку, платформа ожидает обязательного ввода данных в это поле.
Если пользователь кликает мышкой по форме, не заполнив такое поле, возможны два сценария:
ПередОкончаниемРедактирования стоит «тихий» отказ (параметр Отказ = Истина без вывода сообщений), строка просто исчезнет.Проверьте обработчик ПередОкончаниемРедактирования. Если там есть условия, которые не выполняются для новой строки, их нужно скорректировать.
Нельзя исключать и технологические ошибки самой платформы 1С:Предприятие 8.3. В некоторых релизах (особенно в диапазоне 8.3.15.ххх – 8.3.17.ххх) наблюдались баги, связанные с некорректной передачей фокуса в управляемых формах при использовании командных панелей. Если вы используете старый релиз, рекомендуется обновиться до актуальных стабильных версий, таких как 8.3.21 и выше.
Для гарантированного решения проблемы рекомендуется комбинированный подход:
АвтоВводНовойСтроки в свойствах таблицы на форме.ПриНачалеРедактирования для заполнения обязательных полей значениями по умолчанию (например, Количество = 1 или Дата = ТекущаяДата()).ПередОкончаниемРедактирования нет логики, которая устанавливает Отказ = Истина без уведомления пользователя.Следуя этим шагам, мы обеспечим стабильную работу табличных частей и исключим потерю данных при случайных действиях пользователя мышью.