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