Текстовое поле в 1С: добавляем через конфигуратор и кодом

· 9 мин

Содержание

Текстовое поле в 1С почти всегда делается в два шага: добавляете реквизит нужного типа, потом выносите его на форму как элемент «Поле» с видом «Поле ввода». Для разового поля на форме это две минуты в конфигураторе, для динамических случаев то же самое делается кодом в модуле формы.

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

Дальше — пути в конфигураторе для платформы 8.3 с интерфейсом «Такси», код для управляемых форм, разница со старыми обычными формами и типы, которыми обычно ошибаются.

Три способа добавить поле и когда какой брать

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

СпособКогда применятьГде хранится текст
Реквизит объекта + поле формыТекст сохраняется в базе (примечание в справочнике, комментарий в документе)В реквизите объекта метаданных
Реквизит формы + поле формыТекст нужен только на время работы формы (фильтр, служебный ввод)В реквизите формы, в базу не пишется
Программное добавлениеСостав полей зависит от данных или настроекЗадаёте сами при создании реквизита

Если сомневаетесь — начните с реквизита объекта. Текст, введённый пользователем, в 95% задач должен сохраняться, а реквизит формы его теряет при закрытии.

Короткое правило: нужно сохранять — реквизит объекта; нужно временно — реквизит формы; состав полей заранее неизвестен — код.

Реквизит объекта и его вывод на форму через конфигуратор

Это базовый сценарий. Добавляем поле «Примечание» в справочник.

  1. Откройте конфигуратор, в дереве метаданных найдите нужный объект, например Справочники → Контрагенты.
  2. Разверните узел Реквизиты, через контекстное меню выберите Добавить.
  3. В палитре свойств задайте имя латиницей (Примечание), синоним — то, что увидит пользователь.
  4. В свойстве Тип выберите Строка. Для короткого текста задайте длину (например, 150), для длинного — поставьте Длина = 0, это неограниченная строка.
  5. Обновите конфигурацию базы данных (F7 или Обновление конфигурации базы данных).

Реквизит создан, но на форме его пока нет. Выносим:

  1. Раскройте узел Формы объекта, откройте основную форму элемента.
  2. В левой верхней панели редактора форм (дерево реквизитов) найдите добавленный реквизит.
  3. Перетащите его мышью в дерево элементов формы слева. Платформа сама создаст элемент Поле с видом Поле ввода и свяжет его через свойство ПутьКДанным.

Если формы у объекта ещё нет, перетаскивать некуда — сначала создайте основную форму элемента через конструктор.

Текст из реквизита объекта сохраняется при записи элемента. Ничего дописывать в модуль не нужно: платформа сама читает значение из базы при открытии и пишет обратно при сохранении. Это главное преимущество реквизита объекта перед реквизитом формы — не нужно вручную гонять данные туда-обратно.

Многострочное поле и подсказка внутри

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

Выделите элемент поля на форме и в палитре свойств включите МногострочныйРежим. Высоту задаёт свойство Высота (в строках) либо РастягиватьПоВертикали = Истина, тогда поле займёт доступное место.

Серую подсказку внутри пустого поля задаёт свойство ПодсказкаВвода — например, «Введите комментарий». Она исчезает, как только пользователь начинает печатать, и не путается с реальным значением.

  • 📝 МногострочныйРежим — перенос строк внутри поля.
  • 📏 РастягиватьПоВертикали — поле тянется по высоте формы.
  • 👁 ПодсказкаВвода — серый текст-подсказка в пустом поле.
  • ⌨ РежимРедактированияТекста даёт выбор между однострочным и многострочным вводом.

Для многострочного ввода реквизит должен быть строкой неограниченной длины или достаточно длинной. В строку длиной 10 многострочный текст просто обрежется при записи.

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

Когда набор полей зависит от настроек или данных, поле добавляют кодом. На управляемой форме это делается в два приёма: сначала реквизит формы, потом элемент. Оба действия — только на сервере.

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

    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    // 2. Создаём элемент формы и привязываем к реквизиту
    НовоеПоле = Элементы.Добавить("ТекстКомментария", Тип("ПолеФормы"));
    НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПоле.ПутьКДанным = "ТекстКомментария";
    НовоеПоле.МногострочныйРежим = Истина;
    НовоеПоле.Высота = 3;
КонецПроцедуры

Разберём ключевые моменты:

  • Метод ИзменитьРеквизиты принимает массив добавляемых реквизитов (первый параметр) и, при необходимости, массив имён удаляемых (второй). Вызывать его можно не из любого обработчика — безопаснее при создании формы.
  • Элемент создаётся через Элементы.Добавить(Имя, Тип("ПолеФормы")). Третьим параметром можно передать родителя — группу, в которую положить поле.
  • Связь поля с данными задаёт ПутьКДанным. Без него поле отобразится, но ввод некуда будет писать.

Чтобы положить поле в конкретную группу, а не в конец формы, передайте родителя третьим параметром:

НовоеПоле = Элементы.Добавить("ТекстКомментария", Тип("ПолеФормы"),
    Элементы.ГруппаДополнительно);

Порядок полей задаёт свойство родителя или метод Элементы.Переместить(Элемент, Родитель, ПередКаким). Так новое поле встанет туда, куда нужно, а не просто внизу.

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

Важная деталь: элементы и реквизиты, созданные кодом, живут только в текущем сеансе формы. Поэтому код добавления обычно ставят в обработчик ПриСозданииНаСервере — чтобы поле появлялось при каждом открытии, а не один раз.

Если полю нужна реакция на ввод, обработчик события назначают методом УстановитьДействие. Сама процедура-обработчик должна существовать в модуле формы и быть доступной на клиенте:

НовоеПоле.УстановитьДействие("ПриИзменении", "КомментарийПриИзменении");

Так программно созданное поле ведёт себя точно как добавленное в конфигураторе: при изменении текста сработает ваша процедура КомментарийПриИзменении.

Строка, ТекстовыйДокумент и форматированная строка: чем отличаются

Для «текстового поля» в 1С есть три разных типа, и путают их часто.

Строка — основной тип для обычного текста. Хранится в реквизите объекта, редактируется полем ввода. Длина фиксированная или неограниченная. Подходит для примечаний, адресов, комментариев.

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

// Загрузить строку из реквизита в текстовый документ
Документ = Новый ТекстовыйДокумент;
Документ.УстановитьТекст(Объект.ТекстПримечания);

// Забрать отредактированный текст обратно в строку перед записью
Объект.ТекстПримечания = Документ.ПолучитьТекст();

Такой подход берут, когда редактор строки ввода уже тесен: нужны многострочный просмотр с прокруткой, перенос в файл методом Записать() или загрузка из файла через Прочитать().

ФорматированнаяСтрока / форматированный документ — когда нужен текст с выделением, цветом, ссылками. Элемент — «Поле форматированного документа». Избыточно для простого ввода, берут редко.

ТипЭлемент на формеХранится в объекте
СтрокаПоле вводаДа, напрямую
ТекстовыйДокументПоле текстового документаНет, через строку
Форматированный документПоле форматированного документаЧерез хранилище значения

Для 9 задач из 10 верный выбор — Строка неограниченной длины с многострочным полем. К ТекстовыйДокумент переходят, когда нужны редактор побольше и работа с файлами.

Управляемая форма и обычная: разный код и разные свойства

Платформа 8.3 работает на управляемых формах, но в старых конфигурациях и расширениях встречаются обычные формы. API добавления поля у них разный, и код не переносится один в один.

На управляемой форме элементы лежат в коллекции Элементы, добавляются через Элементы.Добавить(...), реквизиты меняются методом ИзменитьРеквизиты. Весь этот код исполняется на сервере.

На обычной форме элементы управления лежат в коллекции ЭлементыФормы, у поля ввода те же по смыслу свойства (МногострочныйРежим), но добавление реквизитов на лету ограничено, и названия ряда свойств отличаются.

  • Управляемая форма: Элементы, ИзменитьРеквизиты, вид ВидПоляФормы.ПолеВвода.
  • Обычная форма: ЭлементыФормы, добавление поля ограничено, выполнение на клиенте.

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

Ещё одно различие важно помнить: управляемая форма делится на клиентский и серверный контекст. Добавление реквизита и элемента идёт на сервере, а реакция на действия пользователя — на клиенте. У обычной формы такого разделения нет, весь код исполняется на стороне клиента. Поэтому код с обычной формы, перенесённый на управляемую без учёта контекста, выдаст ошибку компиляции.

Если ведёте разработку в расширении конфигурации, помните: добавить реквизит в заимствованный объект и вынести его на форму можно, но структуру формы меняют аккуратно, через подключение собственных элементов. Расширения появились в платформе 8.3.6 и позволяют дорабатывать типовые конфигурации, не снимая их с поддержки.

Проверка заполнения и выбор из списка

Два приёма, которые делают текстовое поле удобнее.

Обязательность. У реквизита есть свойство ПроверкаЗаполнения. Поставьте Выдавать ошибку — при записи с пустым полем платформа не даст сохранить объект и подсветит поле. Ручной проверки писать не нужно.

Когда нужна проверка сложнее, чем «поле не пустое» (формат, диапазон длины), её пишут в обработчике ОбработкаПроверкиЗаполнения модуля объекта. Там вы сами решаете, что считать ошибкой, и добавляете сообщение пользователю. Но для простой обязательности хватает свойства — не усложняйте.

Выбор из списка. Если вариантов текста немного, задайте элементу свойство СписокВыбора и режим РежимВыбораИзСписка. Пользователь выбирает готовую строку, а не печатает руками — меньше опечаток и разнобоя.

Проверить себя по развилке «где создавать поле»:

Проверьте себя
Пользователь ввёл текст, закрыл форму, снова открыл — текста нет. В чём причина?
Какой тип выбрать для примечания на 2-3 строки, которое надо хранить в справочнике?
Чем на управляемой форме добавляют реквизит в коде?

Что обычно идёт не так

Ошибки при добавлении текстового поля почти всегда повторяются.

🔴 Поле не видно на форме. Реквизит создали, но на форму не вынесли, либо у элемента не заполнен ПутьКДанным. Проверьте дерево элементов формы и связь с реквизитом.

🔴 Текст не сохраняется. Поле привязано к реквизиту формы, а не объекта. Реквизит формы в базу не пишется — переносите значение в реквизит объекта или сразу делайте поле от объекта.

🔴 Текст обрезается при записи. Длина строки меньше, чем ввёл пользователь. Для свободного текста ставьте неограниченную длину (Длина = 0).

🔴 Многострочный ввод не работает . Не включён МногострочныйРежим у элемента, либо реквизит — короткая строка фиксированной длины.

🔴 Ошибка при программном добавлении. ИзменитьРеквизиты вызвали в неподходящий момент или на клиенте. Весь этот код должен быть в серверной процедуре.

После обновления конфигурации не забудьте про F7 — без обновления базы новый реквизит в пользовательском режиме не появится.

Частые вопросы

Можно ли добавить текстовое поле в типовую конфигурацию, не снимая её с поддержки?
Да, через расширение конфигурации. Вы добавляете свой реквизит и элемент формы в расширении, типовая конфигурация остаётся на полной поддержке и нормально обновляется.
Чем ограничена максимальная длина текста в строке?
Неограниченная строка (Длина = 0) хранит очень большой объём текста — для примечаний и описаний предела на практике вы не достигнете. Фиксированная длина обрезает текст по заданному числу символов.
Как сделать поле только для чтения?
Задайте элементу свойство ТолькоПросмотр = Истина. Значение будет видно, но пользователь не сможет его менять. Свойство можно переключать и кодом по условию.
Нужно ли многострочное поле выносить через `ТекстовыйДокумент`?
Нет. Для многострочного текста достаточно строки неограниченной длины и свойства МногострочныйРежим у поля. ТекстовыйДокумент берут, когда нужны полноценный редактор, поиск по тексту и работа с файлами.
Почему программно добавленное поле пропадает при повторном открытии формы?
Так и должно быть: элементы и реквизиты, добавленные кодом, существуют только в текущем сеансе формы. При каждом открытии их нужно создавать заново в обработчике создания формы.