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