Как правильно обращаться к реквизитам справочника в расширении 1С?

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

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

Почему возникает проблема видимости?

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

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

Способы обращения к данным расширения

Разберем основные подходы, которые позволяют комфортно работать с расширенными объектами.

Метод 1: Использование универсальных механизмов получения данных

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

Воспользуемся функцией ОбщегоНазначения.ЗначениеРеквизитаОбъекта. Рассмотрим пример:


// Получаем ссылку на объект справочника
БанковскийСчетСсылка = Справочники.БанковскиеСчета.НайтиПоКоду("000000001");

// Получаем значение нашего реквизита, созданного в расширении
ЗначениеРеквизита = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(БанковскийСчетСсылка, "МойРеквизит");

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

Метод 2: Экспортные функции в расширении

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

Давайте создадим такую функцию в модуле справочника (в расширении):


// Код внутри расширения
Функция ПолучитьМойРеквизит() Экспорт
    Возврат ЭтотОбъект.МойРеквизит;
КонецФункции;

Даже если в основной конфигурации вы не увидите эту функцию в списке подсказок, вызов Объект.ПолучитьМойРеквизит() сработает корректно в режиме предприятия.

Метод 3: Работа через запросы

Так как на уровне СУБД таблица справочника (основная часть + расширение) представляет собой единое целое, вы можете смело использовать обычный запрос. Конструктор запросов может не увидеть новый реквизит в списке полей, но вы можете прописать его вручную.


ВЫБРАТЬ
    Спр.МойРеквизит КАК ЗначениеРеквизита
ИЗ
    Справочник.БанковскиеСчета КАК Спр
ГДЕ
    Спр.Ссылка = &Ссылка

Пошаговые рекомендации по отладке

  1. Убедитесь, что объект добавлен: Проверьте, что справочник действительно присутствует в расширении. Нажмите правой кнопкой мыши на справочник в дереве метаданных и убедитесь, что пункт «Добавить в расширение» выполнен корректно.
  2. Игнорируйте предупреждения конфигуратора: Если вы уверены в имени реквизита, просто допишите его код вручную. Игнорируйте тот факт, что конфигуратор подсвечивает код как ошибочный — в режиме исполнения 1С все будет работать.
  3. Очистка кэша: Если вы добавили реквизит, но система все равно выдает ошибку при исполнении, попробуйте очистить кэш 1С или перезапустить конфигуратор. Иногда метаданные «залипают» в кэше.
  4. Проверьте статус расширения: Убедитесь, что расширение находится в активном состоянии и имеет корректный режим назначения (например, «Адаптация»).

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

← На главную