Как разрешить редактирование и сохранение произвольного текста в поле ввода 1С?

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

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

Разберем подробно причины такого поведения платформы 1С и проанализируем варианты решения этой задачи.

Причина 1: Поле ввода связано с реквизитом формы, а не объекта

Выясним главную причину, по которой данные очищаются после записи. В платформах 1С данные формы разделены на две группы:

  1. Реквизиты объекта — элементы структуры Объект (например, Объект.Комментарий). Они напрямую связаны с таблицами базы данных и автоматически сохраняются при записи документа или справочника.
  2. Реквизиты формы — локальные переменные самой формы, созданные для временного хранения значений в интерфейсе. Значения этих реквизитов не записываются в базу данных стандартными механизмами.

Если поле ввода на форме привязано к реквизиту формы (например, СодержаниеТекста), то внесенные пользователем правки живут только в рамках текущей сессии формы. При нажатии кнопки «Записать» платформа сохраняет сам документ, а реквизит формы сбрасывается или перезаполняется первоначальным значением.

Рассмотрим два пути решения этой ситуации.

Вариант А. Перепривязка элемента к реквизиту объекта (без кода)

  1. Откроем Конфигуратор и найдем требуемый объект метаданных (документ или справочник).
  2. Убедимся, что у объекта есть реквизит с типом Строка достаточной длины. Если такого реквизита нет, создадим его.
  3. Откроем форму объекта.
  4. Выделим элемент управления (поле ввода) и в палитре свойств найдем параметр Данные.
  5. Укажем в поле Данные путь к реквизиту объекта, например: Объект.ДополнительныйТекст.
  6. Сохраним и обновим конфигурацию. Теперь любые изменения текста будут автоматически сохраняться вместе с документом.

Вариант Б. Программный перенос данных между формой и объектом

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Заполняем реквизит формы сохраненным значением из объекта
    РеквизитФормыТекст = Объект.ДополнительныйТекст;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    // Переносим измененный текст из реквизита формы в записываемый объект
    ТекущийОбъект.ДополнительныйТекст = РеквизитФормыТекст;
КонецПроцедуры

Причина 2: Несоответствие типа данных реквизита

Проанализируем еще одну распространенную ошибку. Поле ввода может быть привязано к реквизиту объекта, но сам реквизит имеет ссылочный тип (например, СправочникСсылка.Номенклатура или ДокументСсылка.ЗаказПокупателя).

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

Для исправления необходимо изменить тип реквизита в Конфигураторе:

  1. Установить тип Строка (неограниченной длины или с фиксированной длиной).
  2. Если необходимо совместить выбор ссылочного объекта и ввод произвольной строки, установить Составной тип данных, включив в него требуемый справочник/документ и тип Строка.
  3. У элемента формы убедиться, что свойство ВыбиратьТип установлено в значение Истина.

Причина 3: Перехват окончания ввода текста в коде

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

Разберем пример кода для элемента формы:


&НаКлиенте
Процедура ПолеВводаОкончаниеВводаТекста(Элемент, ТекстРазмещения, СтандартнаяОбработка)
    // Отключаем стандартный поиск объекта по введенной строке
    СтандартнаяОбработка = Ложь;
    
    // Записываем введенный произвольный текст напрямую в строковый реквизит
    Объект.Комментарий = ТекстРазмещения;
КонецПроцедуры

Дополнительные настройки элемента формы

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

← На главную