Как вывести версию конфигурации 1С на форму: решение ошибки 'Поле объекта недоступно для записи' для элемента 'Декорация - надпись' и альтернативные подходы?

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

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

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

Понимание проблемы: почему возникает ошибка "Поле объекта недоступно для записи" при работе с Декорацией?

Наш пользователь столкнулся с затруднением при попытке вывести версию конфигурации 1С на форму, используя элемент "Декорация - надпись". В своей реализации он предпринял попытку напрямую присвоить текстовое значение программному представлению элемента формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Эта строка вызывает ошибку
    Элементы.НадписьВерсияКофигурации = "ВЕРСИЯ КОНФИГУРАЦИИ: " + Метаданные.Имя + " " + Метаданные.Версия; 
КонецПроцедуры;

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

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

Элемент "Декорация" (Decoration) — это специализированный элемент формы, основное предназначение которого заключается в оформлении пользовательского интерфейса. Он может использоваться для отображения статического текста (надпись), линий-разделителей или изображений. Ключевая особенность декорации заключается в том, что она не привязана напрямую к данным формы (то есть к реквизитам). Поэтому, когда мы пытаемся присвоить строку непосредственно объекту Элементы.НадписьВерсияКофигурации, мы по сути пытаемся записать значение в объект, который не имеет такого механизма прямого хранения текста как своего основного свойства. Вместо этого, для управления отображаемым текстом декорации, необходимо обращаться к ее специфическому свойству, предназначенному именно для этой цели.

Решение 1: Корректное использование элемента "Декорация - надпись" через свойство "Заголовок"

Правильный и наиболее прямой способ изменить текст, отображаемый элементом "Декорация - надпись", заключается в использовании его свойства "Заголовок" (Caption). Это свойство специально предназначено для программного управления текстовым содержимым декорации.

Рассмотрим подробнее пошаговую инструкцию по реализации данного подхода:

  1. Добавляем элемент "Декорация" на форму в Конфигураторе:

    Откройте форму, на которой вы хотите отобразить версию конфигурации. В редакторе формы найдите панель "Элементы" или дерево элементов формы. Добавьте новый элемент типа "Декорация". В окне свойств нового элемента:

    • Установите свойство "Имя" (Name) для элемента декорации. Выберите понятное и уникальное имя, например, ДекорацияВерсияКонфигурации. Именно по этому имени мы будем обращаться к элементу из кода.
    • Убедитесь, что свойство "Вид" (Kind) установлено в значение "Надпись" (Label). Это определит декорацию как текстовый элемент.
    • При необходимости настройте другие свойства оформления, такие как "Размер шрифта", "Цвет текста", "Выравнивание", чтобы надпись гармонично вписывалась в дизайн вашей формы.
  2. Определяем место для выполнения кода:

    Для инициализации текста при открытии формы наиболее подходящим местом является обработчик события формы "ПриСозданииНаСервере" (OnCreateAtServer). Этот обработчик выполняется на сервере один раз, когда форма создается, но до того, как она будет полностью сформирована и передана на клиент для отображения. Это идеальное место для подготовки всех необходимых данных и начальных настроек элементов формы.

  3. Получаем информацию о конфигурации:

    Внутри процедуры ПриСозданииНаСервере мы используем глобальный объект Метаданные для доступа к основной информации о текущей конфигурации:

    • Метаданные.Имя: Возвращает программное имя текущей конфигурации (например, "БухгалтерияПредприятия" или "УправлениеТорговлей").
    • Метаданные.Версия: Возвращает строковое представление номера версии конфигурации (например, "3.0.100.20").
    • Метаданные.Синоним: Возвращает более дружественное для пользователя наименование конфигурации, как оно отображается в заголовке окна (например, "Бухгалтерия предприятия, редакция 3.0").
  4. Присваиваем значение свойству "Заголовок" элемента "Декорация":

    Теперь мы можем сформировать необходимую строку и присвоить ее свойству Заголовок нашей декорации. Вот как выглядит полный и корректный пример кода:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Формируем текстовую строку с использованием Синонима и Версии конфигурации
        Перем ТекстДляДекорации;
        ТекстДляДекорации = "ВЕРСИЯ КОНФИГУРАЦИИ: " + Метаданные.Синоним + " (" + Метаданные.Версия + ")";
    
        // Обращаемся к элементу декорации по его имени и присваиваем значение свойству Заголовок
        // Предполагаем, что имя элемента декорации на форме - "ДекорацияВерсияКонфигурации"
        Если Элементы.Найти("ДекорацияВерсияКонфигурации") Тогда
            Элементы.ДекорацияВерсияКонфигурации.Заголовок = ТекстДляДекорации;
        КонецЕсли;
    КонецПроцедуры;
    

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

  5. Программное создание Декорации (расширенный вариант):

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

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Создаем новый элемент формы типа "ДекорацияФормы"
        Перем НоваяДекорация;
        НоваяДекорация = Элементы.Добавить("ДинамическаяДекорация", Тип("ДекорацияФормы"), Элементы.ГруппаДляРазмещенияДекорации);
        
        // Устанавливаем свойства декорации
        НоваяДекорация.Вид = ВидДекорацииФормы.Надпись;
        НоваяДекорация.Заголовок = "Версия (динамически): " + Метаданные.Версия;
        НоваяДекорация.ЦветТекста = Новый Цвет(255, 0, 0); // Красный цвет текста
        НоваяДекорация.РастягиватьПоГоризонтали = Истина;
        НоваяДекорация.РастягиватьПоВертикали = Ложь;
        
        // Важно: если элемент добавляется в группу, необходимо указать родителя.
        // Если добавляется непосредственно на форму, родитель не указывается или указывается как "ЭтаФорма".
        // В данном примере "Элементы.ГруппаДляРазмещенияДекорации" - это существующая группа на форме
        // или можно использовать Элементы.ГруппаФормы, если декорация не должна быть в конкретной группе.
    КонецПроцедуры;
    

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

Решение 2: Альтернативный подход через реквизит формы типа "Строка"

Несмотря на то, что использование свойства "Заголовок" для "Декорации" решает исходную проблему, во многих случаях более предпочтительным и гибким подходом является использование реквизита формы типа "Строка", связанного с элементом формы. Этот метод обеспечивает лучшую управляемость данными и упрощает дальнейшие изменения, так как элемент формы становится связанным с "данными" (реквизитом).

Разберем процесс реализации этого подхода:

  1. Создаем реквизит формы:

    В дереве реквизитов формы (обычно расположено в левой части окна конфигуратора при редактировании формы), нажмите кнопку "Добавить" (+). Создайте новый реквизит с именем, например, ТекстВерсииКонфигурации. Самое главное — установите тип данных для этого реквизита как "Строка" (String).

    Этот реквизит будет хранить текстовую информацию, которую мы хотим отобразить.

  2. Размещаем элемент формы и связываем его с реквизитом:

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

    • "Поле надписи" (LabelField): Это наиболее подходящий вид для отображения нередактируемого текста, который связан с реквизитом.
    • Если оставить "Поле ввода" (InputField), обязательно установите свойство "Только просмотр" (ReadOnly) в значение Истина, чтобы пользователь не мог изменить текст.

    Убедитесь, что свойство "ПутьКДанным" (DataPath) элемента формы указывает на ваш вновь созданный реквизит (например, ТекстВерсииКонфигурации).

  3. Присваиваем значение реквизиту формы:

    Теперь, когда реквизит формы создан и связан с элементом на форме, мы можем легко присвоить ему нужное значение. Это делается в процедуре ПриСозданииНаСервере:

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Формируем текстовую строку
        Перем ТекстДляОтображения;
        ТекстДляОтображения = "ВЕРСИЯ КОНФИГУРАЦИИ: " + Метаданные.Синоним + ", редакция " + Метаданные.Версия;
    
        // Присваиваем сформированную строку реквизиту формы
        ЭтаФорма.ТекстВерсииКонфигурации = ТекстДляОтображения;
    КонецПроцедуры;
    

    Ключевое отличие здесь в том, что мы присваиваем значение не напрямую элементу формы, а реквизиту формы (ЭтаФорма.ТекстВерсииКонфигурации). Благодаря связи между реквизитом и элементом формы, изменение значения реквизита автоматически обновит текст, отображаемый на форме. Этот подход обеспечивает чистоту кода, лучшую читаемость и более соответствует парадигме работы с данными на управляемых формах.

Получение расширенной информации о конфигурации 1С и платформе

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

Дополнительные рекомендации и лучшие практики при работе с элементами форм

Чтобы ваша работа с управляемыми формами была эффективной и безошибочной, рекомендуем придерживаться следующих практических советов:

  1. Активное использование отладчика: Отладчик — ваш лучший друг при разработке на 1С. Если вы столкнулись с ошибкой "Поле объекта недоступно для записи" или любой другой, всегда начинайте с отладчика. Установите точку останова непосредственно перед строкой, вызывающей ошибку. Затем, в режиме отладки, внимательно изучите объект (в нашем случае Элементы.НадписьВерсияКонфигурации). Отладчик покажет вам все доступные свойства и методы этого объекта, и вы легко сможете найти нужное свойство, например, Заголовок. Это позволит не только исправить текущую ошибку, но и глубже понять структуру объектов 1С.

  2. Осознанный выбор между "Декорацией" и реквизитом формы:

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

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

  3. Использование форматированной строки для сложного оформления: Если вы хотите вывести текст версии конфигурации с различными стилями (например, часть текста жирным шрифтом, часть другим цветом), стандартного присвоения строки будет недостаточно. В таких случаях мы используем объект "ФорматированнаяСтрока". Для этого элемент формы (будь то "Декорация" или "Поле надписи") должен поддерживать отображение форматированного текста, а его свойству Заголовок (для декорации) или связанному реквизиту (для поля) необходимо присваивать объект типа ФорматированнаяСтрока.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Перем ФорматированнаяИнформация;
        ФорматированнаяИнформация = Новый ФорматированнаяСтрока();
    
        // Добавляем часть текста с обычным стилем
        ФорматированнаяИнформация.Добавить("Конфигурация: ");
    
        // Добавляем имя конфигурации жирным шрифтом
        ФорматированнаяИнформация.Добавить(Метаданные.Синоним, Новый СтильТекста(Шрифт.Полужирный));
    
        // Добавляем версию конфигурации другим цветом
        ФорматированнаяИнформация.Добавить(", Версия: " + Метаданные.Версия, Новый СтильТекста(ЦветТекста.Серый));
        
        // Присваиваем форматированную строку реквизиту формы
        ЭтаФорма.ТекстВерсииКонфигурации = ФорматированнаяИнформация;
        // Или для Декорации: Элементы.ДекорацияВерсияКонфигурации.Заголовок = ФорматированнаяИнформация;
    КонецПроцедуры;
    

    Этот подход значительно расширяет возможности по представлению информации на форме, делая ее более наглядной и эстетичной.

  4. Аккуратное именование элементов и реквизитов: Всегда используйте осмысленные и уникальные имена для элементов формы и реквизитов. Это значительно упрощает чтение кода, его поддержку и совместную разработку. Избегайте общих имен типа "Декорация1", если только это не временный элемент.

  5. Учитывайте контекст выполнения: Помните, что код на управляемых формах может выполняться как на клиенте, так и на сервере. Для получения информации о метаданных конфигурации, как правило, требуется серверный контекст (например, &НаСервере). Если вам нужно обновить элемент формы на клиенте после получения данных с сервера, используйте вызовы клиентских процедур после получения данных или передавайте их через параметры.

Таким образом, мы детально рассмотрели проблему вывода динамической информации, такой как версия конфигурации, на форму 1С:Предприятия. Мы проанализировали ошибку "Поле объекта недоступно для записи" при работе с элементом "Декорация - надпись" и предложили два основных, корректных пути решения: через свойство "Заголовок" декорации и через связку "реквизит формы + элемент поля надписи". Каждый из этих подходов имеет свои преимущества и области применения. Применяя изложенные рекомендации и лучшие практики, вы сможете создавать более функциональные, информативные и удобные пользовательские интерфейсы в своих решениях на платформе 1С:Предприятие.

← На главную