Как в 1С:Предприятии 7.7 обратиться к реквизиту формы по динамическому имени в цикле?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке интерфейсов и обработок в 1С:Предприятии 7.7 нередко возникает задача перебрать группу однотипных элементов диалога, например, с именами Текст1, Текст2, Текст3 и так далее. Часто требуется в цикле обойти эти переменные, прочитать их значения или заполнить новыми данными. Напрямую обратиться по индексу вроде Форма.Текст[К] платформа 1С 7.7 не позволяет. Разберем подробно штатные способы решения этой задачи, а также типичные ошибки, возникающие при попытке применить синтаксис из более поздних версий платформы.

Ошибочные подходы и ограничения платформы 7.7

Проанализируем распространенные заблуждения, с которыми сталкиваются разработчики:

  1. Обращение через объект ЭтаФорма и квадратные скобки: конструкции вида ЭтаФорма["Текст" + Н] поддерживаются только в платформе 1С:Предприятие 8. В версии 7.7 объекта ЭтаФорма нет, а попытка обратиться по строковому индексу к контексту формы приведет к ошибке компиляции.
  2. Использование функции Выполнить(): в платформе 1С 7.7 метод Выполнить() существует исключительно у объекта Запрос. Универсального оператора исполнения произвольной строки программного кода во встроенном языке 7.7 нет.
  3. Метод Форма.ПолучитьАтрибут(): вызов Форма.ПолучитьАтрибут("Имя") возвращает объект типа ЭлементДиалога. С его помощью можно управлять исключительно визуальными свойствами элемента (видимость, доступность, положение), но прочитать или изменить значение самого реквизита через него нельзя.

Способ 1. Чтение значения с помощью функции Вычислить()

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

Посмотрим на пример обхода реквизитов в цикле:


Для Н = 1 По 10 Цикл
    ИмяРеквизита = "Текст" + Н;
    ЗначениеРеквизита = Вычислить(ИмяРеквизита);
    Сообщить("Реквизит " + ИмяРеквизита + " = " + ЗначениеРеквизита);
КонецЦикла;

Функция Вычислить() корректно работает как с примитивными типами (числа, строки, даты), так и со ссылочными данными (справочники, документы). Обратите внимание: данный способ работает исключительно на чтение и не может использоваться для присвоения нового значения переменной.

Способ 2. Чтение значения через функцию Шаблон()

Разберем альтернативный штатный инструмент — системную функцию Шаблон(). Если имя переменной или реквизита диалога заключить в квадратные скобки внутри текстовой строки, функция подставит вычисленное значение:


Для Н = 1 По 10 Цикл
    ЗначениеСтр = Шаблон("[Текст" + Н + "]");
    Сообщить("Значение: " + ЗначениеСтр);
КонецЦикла;

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


Для Н = 1 По 10 Цикл
    ИмяРеквизита = "Текст" + Н;
    Значение = ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(" + ИмяРеквизита + ")]"));
    // Переменная Значение полностью сохраняет ссылочный тип данных
КонецЦикла;

Способ 3. Динамическая запись значения в реквизит диалога

Выясним, как поступить, если по динамически сформированному имени значение в реквизите нужно перезаписать. Поскольку оператор прямого динамического присвоения в 7.7 отсутствует, применяют вызов вспомогательной процедуры или функции через Шаблон() с передачей переменной по ссылке.

Объявим в модуле формы служебную функцию:


Функция ПрисвоитьЗначение(ПеремПриемник, Значение)
    ПеремПриемник = Значение;
    Возврат "";
КонецФункции

Теперь разберем, как в цикле динамически установить новые значения в реквизиты:


Для Н = 1 По 10 Цикл
    ИмяРеквизита = "Текст" + Н;
    НовоеЗначение = "Значение по умолчанию № " + Н;
    Шаблон("[ПрисвоитьЗначение(" + ИмяРеквизита + ", НовоеЗначение)]");
КонецЦикла;

При выполнении строки через Шаблон() переменная реквизита передается в функцию ПрисвоитьЗначение() по ссылке, в результате чего значение поля формы успешно обновляется.

Рекомендации по структуре данных

Проанализируем альтернативные способы хранения данных. Использование пронумерованных реквизитов (Текст1, Текст2 и т. д.) усложняет алгоритмы и поддержку конфигурации. Если архитектура решения позволяет, рекомендуем использовать другие подходы:

  1. Реквизиты объекта метаданных: если реквизиты принадлежат не просто экранной форме, а самому объекту (справочнику или документу), платформа 7.7 предоставляет штатные методы ПолучитьАтрибут(ИмяРеквизита) и УстановитьАтрибут(ИмяРеквизита, НовоеЗначение), работающие напрямую без обходных путей.
  2. Использование коллекций: для работы с динамическим набором полей на форме удобнее размещать объект ТаблицаЗначений или СписокЗначений, элементы которых штатно адресуются по целочисленному индексу.
← На главную