Как вывести комментарий партнера на форму документа без добавления реквизита в сам документ?

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

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

Разберем детально, как решить данную задачу несколькими способами: силами пользовательского интерфейса в режиме «1С:Предприятие», средствами визуального редактора конфигуратора без написания программного кода, а также с помощью процедур на встроенном языке 1С, если требуется интерактивное изменение данных.

Способ 1. Пользовательская настройка формы без изменения конфигурации

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

Выполним следующие шаги непосредственно в режиме «1С:Предприятие»:

  1. Откроем нужный документ и перейдем в меню Еще в правой верхней части окна.
  2. Выберем пункт Изменить форму.
  3. В открывшемся дереве элементов найдем поле, отвечающее за выбор партнера (например, Партнер или Клиент).
  4. Выделим это поле, нажмем по нему правой кнопкой мыши или используем кнопку Добавить поля на панели инструментов окна настройки.
  5. В появившемся списке реквизитов найдем и отметим флажком Комментарий, после чего нажмем ОК.
  6. Настроим визуальные свойства добавленного элемента (положение, заголовок, ширину и высоту поля).
  7. Нажмем Применить и сохраним форму по кнопке ОК.

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

Способ 2. Вывод реквизита «через точку» в конфигураторе для всех пользователей

Если требуется закрепить отображение реквизита для всех пользователей конфигурации по умолчанию, реализуем привязку в конфигураторе. Механизм управляемых форм позволяет обращаться к реквизитам ссылочных объектов «через точку» без серверных вызовов на клиенте.

Разберем порядок действий в конфигураторе:

  1. Откроем форму документа и перейдем в правое верхнее окно (вкладка Реквизиты).
  2. Раскроем основной реквизит Объект, найдем внутри реквизит Партнер и раскроем его внутреннюю структуру.
  3. Найдем в списке реквизит Комментарий и перетащим его в левое окно структуры элементов формы, расположив рядом с полем выбора партнера.
  4. Альтернативный вариант: добавим элемент Поле ввода вручную и в окне свойств в параметре ПутьКДанным укажем значение Объект.Партнер.Комментарий.

Важная особенность: поле, связанное через точку со ссылочным объектом базы данных, на форме всегда функционирует в режиме «Только для чтения» (ТолькоПросмотр = Истина). Отредактировать этот текст прямо в документе нельзя, так как он физически принадлежит объекту справочника Партнеры, а не текущему документу.

Способ 3. Использование реквизита формы и кода при необходимости редактирования

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

Для такой реализации создадим реквизит на уровне самой формы:

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

Посмотрим на пример программного кода, реализующего эту логику:


&НаКлиенте
Процедура ПартнерПриИзменении(Элемент)
    ЗаполнитьКомментарийПартнераНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКомментарийПартнераНаСервере()
    Если ЗначениеЗаполнено(Объект.Партнер) Тогда
        // Получаем значение без считывания тяжелого объекта в память
        КомментарийПартнера = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Партнер, "Комментарий");
    Иначе
        КомментарийПартнера = "";
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Восстанавливаем отображение комментария при открытии документа
    Если ЗначениеЗаполнено(Объект.Партнер) Тогда
        КомментарийПартнера = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Партнер, "Комментарий");
    КонецЕсли;
КонецПроцедуры

Оптимизация производительности и контекст вызовов

Обратим внимание на частые ошибки при работе со ссылочными данными:

  1. Клиентский контекст: в тонком клиенте нельзя обращаться к реквизитам через точку вида Объект.Партнер.Комментарий в процедурах с директивой &НаКлиенте. Это вызовет исключение платформы, так как ссылочный объект целиком недоступен на клиенте. Чтение должно выполняться только на сервере.
  2. Избыточное чтение данных: прямое обращение на сервере Объект.Партнер.Комментарий приводит к неявному считыванию всего объекта базы данных в память со всеми его табличными частями. Если справочник Партнеры содержит много реквизитов и таблиц, это создает лишнюю нагрузку. Рекомендуется использовать функцию ОбщегоНазначения.ЗначениеРеквизитаОбъекта() из состава БСП либо легковесный Запрос.

Реализация в обычных (неуправляемых) формах

Если разработка ведется в обычном приложении, механизм привязки данных через точку в элементах управления недоступен. В этом случае добавим на форму несвязанное поле ввода или элемент Надпись (например, с именем ПолеКомментарийПартнера) и пропишем код в модуле формы:


Процедура ПартнерПриИзменении(Элемент)
    ОбновитьКомментарий();
КонецПроцедуры

Процедура ПриОткрытии()
    ОбновитьКомментарий();
КонецПроцедуры

Процедура ОбновитьКомментарий()
    Если ЗначениеЗаполнено(Партнер) Тогда
        ЭлементыФормы.ПолеКомментарийПартнера.Значение = Партнер.Комментарий;
    Иначе
        ЭлементыФормы.ПолеКомментарийПартнера.Значение = "";
    КонецЕсли;
КонецПроцедуры

Таким образом, для быстрого просмотра информации без изменения данных наиболее простым и эффективным решением остается путь через точку (пользовательский или в конфигураторе), а при необходимости интерактивного редактирования — использование независимого реквизита формы с серверным получением данных.

← На главную