Текстовое поле в 1С: добавляем через конфигуратор и кодом
Содержание
Текстовое поле в 1С почти всегда делается в два шага: добавляете реквизит нужного типа, потом выносите его на форму как элемент «Поле» с видом «Поле ввода». Для разового поля на форме это две минуты в конфигураторе, для динамических случаев то же самое делается кодом в модуле формы.
Разберёмся, когда поле хранит значение в объекте (справочнике, документе), а когда живёт только на форме как реквизит формы. Это ключевая развилка: от неё зависит и тип данных, и где вы будете добавлять поле, и сохранится ли введённый текст после закрытия формы.
Дальше — пути в конфигураторе для платформы 8.3 с интерфейсом «Такси», код для управляемых форм, разница со старыми обычными формами и типы, которыми обычно ошибаются.
Три способа добавить поле и когда какой брать
Способов, по сути, три, и выбор зависит от того, где хранится текст и меняется ли состав полей на лету.
| Способ | Когда применять | Где хранится текст |
|---|---|---|
| Реквизит объекта + поле формы | Текст сохраняется в базе (примечание в справочнике, комментарий в документе) | В реквизите объекта метаданных |
| Реквизит формы + поле формы | Текст нужен только на время работы формы (фильтр, служебный ввод) | В реквизите формы, в базу не пишется |
| Программное добавление | Состав полей зависит от данных или настроек | Задаёте сами при создании реквизита |
Если сомневаетесь — начните с реквизита объекта. Текст, введённый пользователем, в 95% задач должен сохраняться, а реквизит формы его теряет при закрытии.
Короткое правило: нужно сохранять — реквизит объекта; нужно временно — реквизит формы; состав полей заранее неизвестен — код.
Реквизит объекта и его вывод на форму через конфигуратор
Это базовый сценарий. Добавляем поле «Примечание» в справочник.
- Откройте конфигуратор, в дереве метаданных найдите нужный объект, например
Справочники → Контрагенты. - Разверните узел
Реквизиты, через контекстное меню выберитеДобавить. - В палитре свойств задайте имя латиницей (
Примечание), синоним — то, что увидит пользователь. - В свойстве
ТипвыберитеСтрока. Для короткого текста задайте длину (например, 150), для длинного — поставьтеДлина= 0, это неограниченная строка. - Обновите конфигурацию базы данных (
F7илиОбновление конфигурации базы данных).
Реквизит создан, но на форме его пока нет. Выносим:
- Раскройте узел
Формыобъекта, откройте основную форму элемента. - В левой верхней панели редактора форм (дерево реквизитов) найдите добавленный реквизит.
- Перетащите его мышью в дерево элементов формы слева. Платформа сама создаст элемент
Полес видомПоле вводаи свяжет его через свойствоПутьКДанным.
Если формы у объекта ещё нет, перетаскивать некуда — сначала создайте основную форму элемента через конструктор.
Текст из реквизита объекта сохраняется при записи элемента. Ничего дописывать в модуль не нужно: платформа сама читает значение из базы при открытии и пишет обратно при сохранении. Это главное преимущество реквизита объекта перед реквизитом формы — не нужно вручную гонять данные туда-обратно.
Многострочное поле и подсказка внутри
Однострочное поле ввода неудобно для примечаний и адресов. Переключаем на многострочный режим.
Выделите элемент поля на форме и в палитре свойств включите МногострочныйРежим. Высоту задаёт свойство Высота (в строках) либо РастягиватьПоВертикали = Истина, тогда поле займёт доступное место.
Серую подсказку внутри пустого поля задаёт свойство ПодсказкаВвода — например, «Введите комментарий». Она исчезает, как только пользователь начинает печатать, и не путается с реальным значением.
- 📝
МногострочныйРежим— перенос строк внутри поля. - 📏
РастягиватьПоВертикали— поле тянется по высоте формы. - 👁
ПодсказкаВвода— серый текст-подсказка в пустом поле. - ⌨
РежимРедактированияТекстадаёт выбор между однострочным и многострочным вводом.
Для многострочного ввода реквизит должен быть строкой неограниченной длины или достаточно длинной. В строку длиной 10 многострочный текст просто обрежется при записи.
Программное создание поля в модуле управляемой формы
Когда набор полей зависит от настроек или данных, поле добавляют кодом. На управляемой форме это делается в два приёма: сначала реквизит формы, потом элемент. Оба действия — только на сервере.
&НаСервере
Процедура ДобавитьТекстовоеПоле()
// 1. Описываем новый реквизит формы — строка неограниченной длины
ОписаниеТипа = Новый ОписаниеТипов("Строка",
Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная));
НовыйРеквизит = Новый РеквизитФормы("ТекстКомментария", ОписаниеТипа, , "Комментарий");
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// 2. Создаём элемент формы и привязываем к реквизиту
НовоеПоле = Элементы.Добавить("ТекстКомментария", Тип("ПолеФормы"));
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "ТекстКомментария";
НовоеПоле.МногострочныйРежим = Истина;
НовоеПоле.Высота = 3;
КонецПроцедуры
Разберём ключевые моменты:
- Метод
ИзменитьРеквизитыпринимает массив добавляемых реквизитов (первый параметр) и, при необходимости, массив имён удаляемых (второй). Вызывать его можно не из любого обработчика — безопаснее при создании формы. - Элемент создаётся через
Элементы.Добавить(Имя, Тип("ПолеФормы")). Третьим параметром можно передать родителя — группу, в которую положить поле. - Связь поля с данными задаёт
ПутьКДанным. Без него поле отобразится, но ввод некуда будет писать.
Чтобы положить поле в конкретную группу, а не в конец формы, передайте родителя третьим параметром:
НовоеПоле = Элементы.Добавить("ТекстКомментария", Тип("ПолеФормы"),
Элементы.ГруппаДополнительно);
Порядок полей задаёт свойство родителя или метод Элементы.Переместить(Элемент, Родитель, ПередКаким). Так новое поле встанет туда, куда нужно, а не просто внизу.
Реквизит формы в базу не сохраняется. Если введённый текст нужен в объекте, записывайте его в реквизит объекта в обработчике записи — сам по себе он исчезнет при закрытии формы.
Важная деталь: элементы и реквизиты, созданные кодом, живут только в текущем сеансе формы. Поэтому код добавления обычно ставят в обработчик ПриСозданииНаСервере — чтобы поле появлялось при каждом открытии, а не один раз.
Если полю нужна реакция на ввод, обработчик события назначают методом УстановитьДействие. Сама процедура-обработчик должна существовать в модуле формы и быть доступной на клиенте:
НовоеПоле.УстановитьДействие("ПриИзменении", "КомментарийПриИзменении");
Так программно созданное поле ведёт себя точно как добавленное в конфигураторе: при изменении текста сработает ваша процедура КомментарийПриИзменении.
Строка, ТекстовыйДокумент и форматированная строка: чем отличаются
Для «текстового поля» в 1С есть три разных типа, и путают их часто.
Строка — основной тип для обычного текста. Хранится в реквизите объекта, редактируется полем ввода. Длина фиксированная или неограниченная. Подходит для примечаний, адресов, комментариев.
ТекстовыйДокумент — объект для работы с большими текстами и текстовыми файлами. На форме показывается элементом с видом «Поле текстового документа», где есть прокрутка, нумерация строк, поиск. В реквизите объекта напрямую не хранится: обычно текст держат в строке неограниченной длины, а в документ загружают и выгружают методами объекта:
// Загрузить строку из реквизита в текстовый документ
Документ = Новый ТекстовыйДокумент;
Документ.УстановитьТекст(Объект.ТекстПримечания);
// Забрать отредактированный текст обратно в строку перед записью
Объект.ТекстПримечания = Документ.ПолучитьТекст();
Такой подход берут, когда редактор строки ввода уже тесен: нужны многострочный просмотр с прокруткой, перенос в файл методом Записать() или загрузка из файла через Прочитать().
ФорматированнаяСтрока / форматированный документ — когда нужен текст с выделением, цветом, ссылками. Элемент — «Поле форматированного документа». Избыточно для простого ввода, берут редко.
| Тип | Элемент на форме | Хранится в объекте |
|---|---|---|
| Строка | Поле ввода | Да, напрямую |
| ТекстовыйДокумент | Поле текстового документа | Нет, через строку |
| Форматированный документ | Поле форматированного документа | Через хранилище значения |
Для 9 задач из 10 верный выбор — Строка неограниченной длины с многострочным полем. К ТекстовыйДокумент переходят, когда нужны редактор побольше и работа с файлами.
Управляемая форма и обычная: разный код и разные свойства
Платформа 8.3 работает на управляемых формах, но в старых конфигурациях и расширениях встречаются обычные формы. API добавления поля у них разный, и код не переносится один в один.
На управляемой форме элементы лежат в коллекции Элементы, добавляются через Элементы.Добавить(...), реквизиты меняются методом ИзменитьРеквизиты. Весь этот код исполняется на сервере.
На обычной форме элементы управления лежат в коллекции ЭлементыФормы, у поля ввода те же по смыслу свойства (МногострочныйРежим), но добавление реквизитов на лету ограничено, и названия ряда свойств отличаются.
- Управляемая форма:
Элементы,ИзменитьРеквизиты, видВидПоляФормы.ПолеВвода. - Обычная форма:
ЭлементыФормы, добавление поля ограничено, выполнение на клиенте.
В новой разработке под 8.3 используйте только управляемые формы. Обычные оставляйте как есть — переписывать ради одного поля смысла нет, но и новые городить на них не стоит.
Ещё одно различие важно помнить: управляемая форма делится на клиентский и серверный контекст. Добавление реквизита и элемента идёт на сервере, а реакция на действия пользователя — на клиенте. У обычной формы такого разделения нет, весь код исполняется на стороне клиента. Поэтому код с обычной формы, перенесённый на управляемую без учёта контекста, выдаст ошибку компиляции.
Если ведёте разработку в расширении конфигурации, помните: добавить реквизит в заимствованный объект и вынести его на форму можно, но структуру формы меняют аккуратно, через подключение собственных элементов. Расширения появились в платформе 8.3.6 и позволяют дорабатывать типовые конфигурации, не снимая их с поддержки.
Проверка заполнения и выбор из списка
Два приёма, которые делают текстовое поле удобнее.
Обязательность. У реквизита есть свойство ПроверкаЗаполнения. Поставьте Выдавать ошибку — при записи с пустым полем платформа не даст сохранить объект и подсветит поле. Ручной проверки писать не нужно.
Когда нужна проверка сложнее, чем «поле не пустое» (формат, диапазон длины), её пишут в обработчике ОбработкаПроверкиЗаполнения модуля объекта. Там вы сами решаете, что считать ошибкой, и добавляете сообщение пользователю. Но для простой обязательности хватает свойства — не усложняйте.
Выбор из списка. Если вариантов текста немного, задайте элементу свойство СписокВыбора и режим РежимВыбораИзСписка. Пользователь выбирает готовую строку, а не печатает руками — меньше опечаток и разнобоя.
Проверить себя по развилке «где создавать поле»:
Что обычно идёт не так
Ошибки при добавлении текстового поля почти всегда повторяются.
🔴 Поле не видно на форме. Реквизит создали, но на форму не вынесли, либо у элемента не заполнен ПутьКДанным. Проверьте дерево элементов формы и связь с реквизитом.
🔴 Текст не сохраняется. Поле привязано к реквизиту формы, а не объекта. Реквизит формы в базу не пишется — переносите значение в реквизит объекта или сразу делайте поле от объекта.
🔴 Текст обрезается при записи. Длина строки меньше, чем ввёл пользователь. Для свободного текста ставьте неограниченную длину (Длина = 0).
🔴 Многострочный ввод не работает
. Не включён МногострочныйРежим у элемента, либо реквизит — короткая строка фиксированной длины.
🔴 Ошибка при программном добавлении. ИзменитьРеквизиты вызвали в неподходящий момент или на клиенте. Весь этот код должен быть в серверной процедуре.
После обновления конфигурации не забудьте про F7 — без обновления базы новый реквизит в пользовательском режиме не появится.
Частые вопросы
Можно ли добавить текстовое поле в типовую конфигурацию, не снимая её с поддержки?
Чем ограничена максимальная длина текста в строке?
Длина = 0) хранит очень большой объём текста — для примечаний и описаний предела на практике вы не достигнете. Фиксированная длина обрезает текст по заданному числу символов.Как сделать поле только для чтения?
ТолькоПросмотр = Истина. Значение будет видно, но пользователь не сможет его менять. Свойство можно переключать и кодом по условию.Нужно ли многострочное поле выносить через `ТекстовыйДокумент`?
МногострочныйРежим у поля. ТекстовыйДокумент берут, когда нужны полноценный редактор, поиск по тексту и работа с файлами.