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