Всем привет.
Такой вопрос, возможно ли создать переменное имя переменой
Допустим мне надо
Индекс1 = ФИндекс
и далее по адресу
Квартира1 = ФКвартира

Индекс2 = ПИндекс
и далее по адресу
Квартира2 = ПКвартира

Так вот как видно, разница в 1 символ там и там, можно ли этот символ как то присабачить переменной программно?

Хочу вынести заполнение в функцию
---
```1c
    Переменная1=Неопределено;
    Переменная2=Неопределено;
    Переменная3=Неопределено;

    НазваниеПеременной="Переменная"+"1";
    Выполнить(НазваниеПеременной+"=22");

    НазваниеПеременной="Переменная"+"2";
    Выполнить(НазваниеПеременной+"=555");

    Выполнить("Переменная3="СУперМегастрока"");

    Сообщить("Переменная1="+Переменная1);
    Сообщить("Переменная2="+Переменная2);
    Сообщить("Переменная3="+Переменная3);
```
---
а то что справа в равенстве какими буковками маркировать?
В цикле можно все сделать
---
А почему соответствие не использовать ?
Удобно, быстро, читабельно
---
Квартиры = запрос.выполнить().выбрать();

Счётчик = 1;

Пока квартиры.следующий() цикл
Индекс = "индекс"+счётчик;
Квартира = "квартира"+счётчик;

ОбластьМакета.Параметры[Индекс] = квартиры.индекс;
ОбластьМакета.Параметры[Квартира] = квартиры.квартира;
КонецЦикла;
ТабДок.Вывести(ОбластьМакета);
---
```1c
    Массив = Новый Массив;

    для а=1 по 10 цикл
    Массив.Добавить("Переменная"+а);
    КонецЦикла
```

потом обойти все элементы массива.
может есть способ проще - но это первое что пришло в голову.
В массиве будут (10): Переменная1, Переменная2, Переменная3, Переменная4, Переменная5, Переменная6, Переменная7, Переменная8, Переменная9, Переменная10
---
Там набор переменных, как минимум ИндексХ - КвартираХ, поэтому использовать таблицу значений.
---
```1c
    Структура=Новый Структура;
    Структура.Вставить("Индекс"+П, 0);
```

в дальнейшем

```1c
    Структура.Индекс1=1;
    Структура.Индекс2=Структура.Индекс2+1;
```

Программное формирование имени переменной.
---
(7) Структура и соответствие, только если значения два.
Индекс и номер квартиры, как-то странно звучит. А если в районе с одним индексом находится квартиры?
В соответствии значение перезатрется.
---
Соответствие {Ключ, Значение}:
Ключ - Строка типа "Адрес1", "Адрес2" ... "АдресN"
Значение - адрес структуры вида: Новый Структура("Индекс, ...., Квартира")
?
---
У него не два значения а много Индекс1 Индекс2 и т.д.

Таким образом

```1c
    Адреса=новый Соответствие;
    Адреса.Вставить("Индекс1",ФИндекс);
    Адреса.Вставить("Квартира1",ФКвартира);
    Адреса.Вставить("Индекс2",ПИндекс);
    Адреса.Вставить("Квартира2",ПКвартира);
```

Потом
Сообщить( Адреса["Индекс1"] );

А если много значений то так

```1c
    Адреса=новый Соответствие;
    Адреса.Вставить("Адрес1",новый Соответствие);
    Адреса["Адрес1"].Вставить("Индекс",ФИндекс);
    Адреса["Адрес1"].Вставить("Квартира",ФКвартира);
    Адреса.Вставить("Адрес2",новый Соответствие);
    Адреса["Адрес2"].Вставить("Индекс",ПИндекс);
    Адреса["Адрес2"].Вставить("Квартира",ПКвартира);
```

Потом

```1c
    Сообщить( Адреса["Адрес1"]["Индекс"] );
```

В циклах и через имена типа "Адрес"+Строка(Номер) все гораздо компактнее
---
Соответствие же... Для кого умные люди придумывали?
---
```1c
    Переменная1=Неопределено;
    Переменная2=Неопределено;
    Переменная3=Неопределено;

    НазваниеПеременной="Переменная"+"1";
    Выполнить(НазваниеПеременной+"=22");

    НазваниеПеременной="Переменная"+"2";
    Выполнить(НазваниеПеременной+"=555");

    Выполнить("Переменная3="СУперМегастрока"");

    Сообщить("Переменная1="+Переменная1);
    Сообщить("Переменная2="+Переменная2);
    Сообщить("Переменная3="+Переменная3);
```
---
Отличный пример, спасибо
---
Не знал про Выполнить().
Единственный выход из ситуации когда необходимо изменить значение свойства у типа ДанныеФормыЭлементДерева когда свойство называется например ЭлементДерева.ВидЦеныb4c5e5fa073011df8fce00304867779a. Этот идентификатор есть только в строковом виде.
Для примера увеличил цену на 2000 р.
ИмяКолонкиЦеныСебестоимости содержит значение "b4c5e5fa073011df8fce00304867779a"

```1c
    Выполнить("ЭлементДереваЦен." + ИмяКолонкиЦеныСебестоимости + " = " + "ЭлементДереваЦен." + ИмяКолонкиЦеныСебестоимости + " + 2000");
```

Спасибо !
---
Ух ты. 5 лет прошло, а благодарности до сих пор приходят.
Приятно, однако.

Рад помочь.
---
Хм, пример хороший. но к сожалению не работает, если надо выполнить типизацию. Ну например ТабДок = новый ТабличныйДокумент. он так не создает переменную
---
все он создает.
Вот работающий пример:

```1c
    П3 = Неопределено;
    Выполнить("П3 = Новый ТабличныйДокумент");
    Выполнить("П3.Область("R1C1").Текст = "Нужный текст"");
    П3.Показать();
```
---
а если у меня заведомо не изветсно количество ТАбДоков? я не могу заниматься присвоение до тех пор пока не присвою сначала Неопределено. в этом проблема
---
это не говорит, что в (10) нельзя "выполнять типизацию".
Если не известно сколько будет переменных, то можно использовать коллекцию.

```1c
    НесколькоТД = Новый Массив;
    Выполнить("П = Новый ТабличныйДокумент; НесколькоТД.Добавить(П);");
```
---
ты ее так не сделаешь. Сначала ты должен присвоить значение Неопределено вне команды Выполнить я же написал выше эту проблему
---
код смотрели? Не нужно переменной присваивать Неопределено вне команды Выполнить. Достаточно инициализировать коллекцию. И уже внутри Выполнить можно в нее добавлять нужные данные. Они будут доступны и при выходе из Выполнить.
---
хорошо я тебя понял. я попробую так сам сейчас. правда я понять не могу , почему это должно сработать, если перед этим присвоение типа не работало, если перед этим переменную не объявить
---
Просто дело в области видимости. Когда объявляем и инициализируем переменную в блоке кода Выполнить, время жизни у нее ограниченно этим блоком. Переменная стоящая выше блока Выполнить продолжает жить.
---
да твоя мысль верна, только синтаксис не много другой как я понял. у меня сработало вот так:

Выполнить(НаименованиеТабДока + " = Новый ТабличныйДокумент; ТабличныеДокументы.Добавить(Вычислить(НаименованиеТабДока))");
---
Мне же не видно что делаете с этими данными. Вариантов много.
Можно и так:

```1c
    ТабличныеДокументы.Добавить(Вычислить("Новый ТабличныйДокумент"));
```

И далее обращаться к нужному элементу массива.
---
можно использовать другую коллекцию - структуру:

```1c
    ТабличныеДокументы = Новый Структура;
    Выполнить("ТабличныеДокументы.Вставить(НаименованиеТабДока, Новый ТабличныйДокумент)");

    // обращаться к ТД можно так:
    ТабличныеДокументы[НаименованиеТабДока].Показать();
```
---
Интересна практическая задача где не выкрутиться через коллекции и надо именно так.
---
я создаю и вывожу на печать массив документов. проблема в том, что коллекции ссылочно хранят эту переменную )) и тупо троят мне печать копией последнего записанного в массив или список или ТЗ, по-этому мне нужен отдельный Таб Док на каждую запись. да я уверен есть решения другие, но это проще мне кажется и я его понимаю лучше
---
Т.е. табличный документ (объект) только один и в нем вносятся изменения для каждого экземпляра печати?
---
да, только у коллекций ссылка на объект
---
Для объектов там чуть позамороченнее чем для примитивных типов. Можно грязный хак с ЗначениеВСтрокуВнутр()/ЗначениеИзСтрокиВнутр() использовать чтоб копию объекта получить "в одну строку", но табличные документы я через них не гонял.
---
Мне надо примерное такое, как в PHP например

function foo (){};
$A = "fo";
$A += "o";
$$A(); //вызов вункции Foo

Мне нужен подобный механизм
---
```1c
    Процедура foo()
    КонецПроцедуры

    A = "fo";
    A = A + "o";
    Выполнить(A+"()");
```
---
Выполнить
т.е. в моем примере это будет так
префикс = "П";
постфикс = "1";
выполнить ("Строка.Индекс+"постфикс "+ = Сотрудник.+"префикс "+Индекс");

и это отработает как

Строка.Индекс1 = Сотрудник.ПИндекс;

???
---
нет. Это просто набор символов с точки зрения 1С.
Что есть Строка.Индекс1?
Если Строка это что-то вроде структуры и заполнена названиями Индекс,то проще так:

```1c
    Строка["Индекс"+постфикс] = Сотрудник[префикс+"Индекс"]
```

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