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