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