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