Как в 1С вывести в поле ввода реквизит справочника вместо наименования

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

При разработке форм в 1С часто возникает задача: необходимо выбрать элемент из справочника (например, Номенклатура), но отобразить в поле ввода не его наименование, а другой реквизит — номенклатурный номер, артикул или код. Если установить у поля ввода ссылочный тип (например, СправочникСсылка.Номенклатура), платформа визуально подставляет основное представление объекта — как правило, наименование.

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

Выясним причину: почему платформа показывает наименование

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

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

Алгоритм решения проблемы

Чтобы выводить в поле ввода произвольный реквизит справочника (номенклатурный номер, артикул и т. д.), выполним следующие шаги:

  1. Установим у поля ввода НоменклатурныйНомерПолеВвода тип Строка.
  2. Включим у данного поля ввода свойство Кнопка выбора (установим значение Истина).
  3. В обработчике события НачалоВыбора программно откроем форму выбора справочника.
  4. В обработчике события ОбработкаВыбора перехватим выбранный элемент и заполним строковое поле нужным значением из объекта.

Реализация программного кода

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

Код для события НачалоВыбора:


Процедура НоменклатурныйНомерПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Открываем форму выбора справочника Номенклатура
    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", , Элемент);
    
КонецПроцедура

Затем переопределяем событие ОбработкаВыбора. Отключаем стандартную обработку выборки, чтобы платформа не пыталась записать ссылку в строковое поле, и самостоятельно заполняем нужные реквизиты на форме:


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

Важные нюансы при работе с запросами и строками

Если в процессе обработки требуется выполнять поиск элемента через запрос по строковому реквизиту, следует учесть особенности платформы при сравнении полей:

  1. Строки неограниченной длины: Если реквизит (например, Наименование) имеет неограниченную длину, прямое сравнение в условии ГДЕ вызовет ошибку "Нельзя сравнивать поля неограниченной длины". Чтобы этого избежать, используйте функцию ВЫРАЗИТЬ() в тексте запроса:
    
    ГДЕ
        ВЫРАЗИТЬ(Номенклатура.Наименование КАК Строка(150)) = &Наименование
    
  2. Поиск по ссылке: Если в запрос передается сам выбранный объект, безопаснее и быстрее выполнять поиск непосредственно по ссылке:
    
    ГДЕ
        Номенклатура.Ссылка = &Ссылка
    

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

← На главную