В практике разработки на обычных формах 1С встречается специфическая проблема: пользователь может войти в режим редактирования поля, изменить значение, но при попытке перейти к другому элементу или нажать «Enter», введенные данные исчезают, и поле возвращает свой прежний вид. При этом свойства ТолькоПросмотр и Доступность настроены корректно. Проанализируем причины такого поведения и разберем способы их устранения.
Наиболее распространенная причина — наличие кода в модуле формы, который принудительно пересчитывает или обнуляет значение реквизита при изменении строки или самого поля. Рассмотрим ситуацию: при редактировании строки табличной части срабатывает событие, которое по определенной логике обновляет данные всей строки. Если в этой логике не учтено новое значение, платформа «откатит» его к результату вычислений.
Разберем, на какие процедуры стоит обратить внимание в первую очередь:
ПриИзменении — обработчик самого элемента управления или колонки табличной части.ПриОкончанииРедактирования — событие табличного поля, которое срабатывает при завершении ввода в строку.Проверьте, нет ли в коде конструкций, подобных этой:
Процедура ТабличнаяЧастьПриИзмененииСостава(Элемент)
ТекущаяСтрока = ЭлементыФормы.ТабличнаяЧасть.ТекущиеДанные;
// Ошибка: принудительное переопределение значения без учета ввода пользователя
ТекущаяСтрока.Сумма = ТекущаяСтрока.Цена * ТекущаяСтрока.Количество;
КонецПроцедуры
Выясним причину, связанную с настройками элемента управления. Если в свойстве Данные (Data Path) указан путь не к конкретному реквизиту табличной части, а к связанному значению через точку, поле будет вести себя некорректно. Например, если вы указали ТекущаяСтрока.Номенклатура.Наименование, поле позволит ввести текст, но не сможет записать его обратно в базу, так как запись в свойства связанных объектов через поля ввода напрямую не поддерживается. После потери фокуса платформа просто вернет актуальное значение из связанного справочника.
В обычных формах существуют события ПриПолученииДанных и ПриВыводеСтроки. Они вызываются при каждом обновлении интерфейса, прокрутке или перерисовке формы. Если внутри этих процедур прописан код, который считывает данные из базы данных или пересчитывает значения «на лету», любые изменения, внесенные пользователем, будут мгновенно перезаписаны. Важно помнить: данные события предназначены исключительно для оформления (цвет, шрифт, отображение текста), а не для изменения самих данных объекта.
Проанализируем ситуацию с типами данных. Если тип элемента управления «Поле ввода» не совпадает с типом колонки в метаданных, платформа попытается привести введенное значение к нужному типу. Если это невозможно (например, попытка ввести текст в числовое поле), значение будет сброшено. Аналогично работают ограничения прав доступа на уровне записей (RLS): если у пользователя есть право на чтение поля, но нет права на его изменение, платформа может позволить активировать поле, но откатит изменения при попытке фиксации.
Для выявления конкретного места, где происходит сброс, выполним следующие шаги:
=).ПриИзменении реквизита на уровне метаданных). Платформа сначала выполняет код формы, а затем код объекта.Как показывает практика, чаще всего проблема заключается в «избыточной автоматизации», когда программист создает механизмы автозаполнения полей, которые срабатывают слишком агрессивно и не дают пользователю внести ручные правки.