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