Как получить данные реквизита справочника, добавленного в расширение конфигурации?

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

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

Использование прямого обращения в запросе

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

Рассмотрим пример простого запроса:


ВЫБРАТЬ
    Контрагенты.апи_База
ИЗ
    Справочник.Контрагенты КАК Контрагенты

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

Реализация через абстрактные методы и аннотацию &Вместо

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

Шаг 1: Создание метода-заглушки в основном модуле

В общем модуле основной конфигурации создайте функцию, которая будет возвращать пустое значение:


Функция ЗапросВРасширениеАПИ(пСсылка) Экспорт
    Возврат Неопределено;
КонецФункции

Шаг 2: Переопределение через &Вместо

В модуле вашего расширения переопределите эту функцию с использованием аннотации &Вместо. Это позволит «подменить» пустую реализацию на логику, которая имеет доступ к метаданным расширения:


&Вместо("ЗапросВРасширениеАПИ")
Функция апи_ЗапросВРасширениеАПИ(пСсылка) Экспорт
    
    // Вызываем оригинальный метод, если необходимо сохранить цепочку вызовов
    Результат = ПродолжитьВызов();
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Контрагенты.апи_Сервер КАК апи_Сервер,
        |    Контрагенты.апи_База КАК апи_База
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", пСсылка);
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    Если РезультатЗапроса.Следующий() Тогда
        Возврат РезультатЗапроса.апи_База;    
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

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

Другие способы получения данных

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

Важные рекомендации по разработке

При работе с расширениями всегда учитывайте следующие моменты:

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

← На главную