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

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← К списку

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

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

Доступ к константам расширения из модулей самого расширения

Рассмотрим наиболее частый сценарий: у вас есть константа, созданная в расширении, и вы пытаетесь получить ее значение из кода, который также находится в этом же расширении. Например, это может быть функция или процедура, помеченная директивой &Вместо или &После, или новый общий модуль расширения.

  1. Правильный синтаксис обращения:

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

    Посмотрим на пример:

    
    // Допустим, у нас есть константа "ДополнительнаяИнформацияКвитанцийСадоводов1" в расширении
    // И этот код находится в модуле расширения, например, в обработчике &Вместо
            
    ПеременнаяДляХранения = Константы.ДополнительнаяИнформацияКвитанцийСадоводов1.Получить();
    Сообщить("Значение константы: " + ПеременнаяДляХранения);
    

    Как видим, синтаксис прямой и интуитивно понятный. Мы обращаемся к менеджеру констант и затем по имени константы.

  2. Возможные предупреждения синтаксического контроля:

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

  3. Некорректный синтаксис МОЕ.Константы...:

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

Влияние версии платформы 1С:Предприятие на работу с константами в расширениях

Давайте рассмотрим подробнее, как версия платформы влияет на возможность создания и использования констант в расширениях:

  1. Версия платформы 8.3.16 и выше:

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

  2. Более ранние версии платформы (до 8.3.16):

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

Альтернативный подход: Использование регистров сведений в расширении

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

  1. Создание регистра сведений:

    Вместо константы создайте в расширении новый регистр сведений. Этот регистр может быть независимым и иметь одно измерение (например, ИдентификаторПараметра типа Строка) и один ресурс (например, ЗначениеПараметра подходящего типа, например, Строка, Число, Булево). Это позволит вам хранить множество "констант" в одном месте.

  2. Получение значения из регистра сведений:

    Значения затем можно получать программно из этого регистра, используя стандартные методы работы с регистрами сведений.

    Посмотрим на пример:

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

    Этот подход обеспечивает гибкость и доступность данных, особенно в условиях ограничений старых платформ.

Общие принципы работы с расширениями и константами

Давайте закрепим основные принципы, которые помогут вам избежать проблем в будущем:

  1. Назначение расширений:

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

  2. Где создавать константу:

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

  3. Константы расширения только для расширения:

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

Мы подробно разобрали, как правильно обращаться к константам, созданным в расширении конфигурации. Помните о версии платформы, используйте корректный синтаксис внутри расширения и рассмотрите альтернативные подходы для более сложных сценариев. Успехов в разработке!

← К списку