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