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