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