Как программно вставить текст в поле ввода 1С и почему он может не отображаться

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

В процессе разработки на платформе 1С:Предприятие 8 часто возникает задача: вывести в поле ввода определенное текстовое пояснение, если значение не заполнено или не соответствует определенным критериям. Начинающие разработчики часто сталкиваются с тем, что простой код присваивания строки не дает желаемого результата. В этой статье мы подробно разберем, почему это происходит, проанализируем взаимосвязь типов данных и интерфейсных свойств, а также рассмотрим профессиональные способы решения этой задачи.

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

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

Проанализируем типичный ошибочный код:


Если ЗначениеЗаполнено(Контрагент.ОсновноеКонтактноеЛицо) Тогда
    КонтактноеЛицо = Контрагент.ОсновноеКонтактноеЛицо;
Иначе
    КонтактноеЛицо = "Контактное лицо неизвестно"; // Здесь возникнет ошибка или значение останется пустым
КонецЕсли;

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

Решение 1: Использование свойства «Подсказка ввода» (InputHint)

Это самый простой и правильный с точки зрения UX (пользовательского опыта) способ. Если ваша цель — просто показать пользователю текст в пустом поле (например, «Введите ФИО» или «КЛ неизвестно»), не нужно пытаться записать этот текст в сам реквизит. У элементов формы типа «Поле ввода» есть стандартное свойство ПодсказкаВвода.

Рассмотрим, как установить его программно в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем статическую подсказку
    Элементы.КонтактноеЛицо.ПодсказкаВвода = "Контактное лицо неизвестно";
КонецПроцедуры

Преимущество этого метода в том, что реквизит КонтактноеЛицо остается пустым (содержит ПустуюСсылку), что важно для дальнейшей логики программы и записи в базу данных. Текст отображается серым цветом только тогда, когда поле не заполнено. Для быстрой проверки отображения и интерактивной настройки свойств элементов можно использовать обработку для редактирования свойств форм в режиме предприятия.

Решение 2: Изменение типа реквизита на «Строка»

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

Чтобы сохранить функциональность справочника и возможность вставки текста, можно использовать следующий подход в обработчике события ПриИзменении:


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    ЗаполнитьКонтактноеЛицо(Объект.Контрагент);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКонтактноеЛицо(ВыбранныйКонтрагент)
    Если ЗначениеЗаполнено(ВыбранныйКонтрагент.ОсновноеКонтактноеЛицо) Тогда
        // Если реквизит - строка, записываем Наименование
        Объект.КонтактноеЛицоСтрока = Строка(ВыбранныйКонтрагент.ОсновноеКонтактноеЛицо);
    Иначе
        Объект.КонтактноеЛицоСтрока = "Контактное лицо неизвестно";
    КонецЕсли;
КонецПроцедуры

Решение 3: Использование составного типа данных

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

В этом случае система позволит записать в одну и ту же переменную и объект, и текст. Однако будьте осторожны: при проверке заполнения ЗначениеЗаполнено() для строки будет возвращать Истина, даже если там написано «Неизвестно», что может усложнить алгоритмы проведения документов.

Решение 4: Динамическое управление «Текстом редактирования»

Для продвинутой визуализации в управляемых формах можно использовать программное управление отображаемым текстом без изменения самого значения. Это реализуется через события ПриИзменении или использование дополнительных реквизитов формы.

Посмотрим на пример, когда мы хотим динамически менять подсказку в зависимости от условий:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Объект.СрочныйЗаказ Тогда
        Элементы.Комментарий.ПодсказкаВвода = "Обязательно укажите причину срочности!";
    Иначе
        Элементы.Комментарий.ПодсказкаВвода = "Введите примечание...";
    КонецЕсли;
КонецПроцедуры

Решение 5: Механизм «Обработка получения представления»

Если задача стоит более глобально — например, вы хотите, чтобы во всей системе пустая ссылка конкретного справочника отображалась как «Данные не указаны», — следует использовать модуль менеджера справочника. Разберем этот элегантный метод.

В модуле менеджера справочника КонтактныеЛица добавим обработчик:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    // Если ссылка пустая или объект помечен на удаление, меняем текст
    Если Данные.Ссылка = Справочники.КонтактныеЛица.ПустаяСсылка() Тогда
        Представление = "Контактное лицо не назначено";
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

Этот метод позволяет централизованно управлять тем, как ссылки выглядят в полях ввода, динамических списках и отчетах, не меняя при этом тип данных Ссылка на Строка.

Решение 6: Использование декораций поверх поля ввода

Иногда стандартных средств ПодсказкаВвода недостаточно (например, нужно выделить текст красным цветом или курсивом). В таком случае профессионалы используют визуальный хак: наложение декорации типа «Надпись» поверх поля ввода.

Алгоритм реализации:

  1. Размещаем на форме Декорацию-надпись с нужным текстом.
  2. Устанавливаем для неё прозрачный фон и нужный цвет шрифта.
  3. В свойстве ГоризонтальноеПоложение выбираем «Лево».
  4. В обработчике ПриИзменении основного поля или в процедуре ОбновитьОтображениеДанных управляем видимостью:
    
    Элементы.ДекорацияПодсказка.Видимость = НЕ ЗначениеЗаполнено(Объект.КонтактноеЛицо);
    

Подведение итогов

Мы проанализировали различные подходы к вставке текста в поле ввода. Выбор конкретного метода зависит от ваших целей:

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

← На главную