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

```1c
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура(Структура);

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = Новый Структура(ФиксированнаяСтруктура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;
```

В месте, отмеченном комментарием со звездочкой, создается новый массив и указатель (ссылка) на него попадает в структуру.
В результате, после отработки алгоритма, каждый элемент массива "Результат" будет содержать в значении поля "СчетчикМассив" массив из 5 элементов.
При любой операции над значением поля "СчетчикМассив" любого элемента "Результата", это значение будет синхронно меняться у всех элементов "Результата".
Конечно, можно поправить алгоритм, заменив операцию добавления в месте с комментарием с двумя звездочками на создание каждый раз нового массива, "Новый массив()". И все будет работать, как задумано.

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

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = ИнициализироватьСтруктуру(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;
    КонецПроцедуры

    Функция ИнициализироватьСтруктуру(СтруктураШаблон)
    Результат = Новый Структура;
    Для Каждого КлючИЗначение Из СтруктураШаблон Цикл
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(ТипЗнч(КлючИЗначение.Значение));
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    Результат.Вставить(КлючИЗначение.Ключ, ОписаниеТипов.ПривестиЗначение(Неопределено));
    КонецЦикла;
    Возврат Результат
    КонецФункции
```

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

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", Тип("Строка"));
    Структура.Вставить("СчетчикМассив", Тип("Массив")); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = ИнициализироватьСтруктуру(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;
    КонецПроцедуры

    Функция ИнициализироватьСтруктуру(СтруктураШаблон)
    Результат = Новый Структура;
    Для Каждого КлючИЗначение Из СтруктураШаблон Цикл
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(КлючИЗначение.Значение);
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    Результат.Вставить(КлючИЗначение.Ключ, ОписаниеТипов.ПривестиЗначение(Неопределено));
    КонецЦикла;
    Возврат Результат
    КонецФункции
```

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

```1c
    Функция Копия(Знач ссылка)
    возврат ссылка
    КонецФункции

    ...
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = Копия(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла
```

И более философский вопрос: таблица значений ведет себя также, но у нее есть метод "Скопировать()". С чем связано отсутствие этого метода у массива?

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

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = ИнициализироватьСтруктуру(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;
    КонецПроцедуры

    Функция ИнициализироватьСтруктуру(СтруктураШаблон)
    Результат = Новый Структура;
    Для Каждого КлючИЗначение Из СтруктураШаблон Цикл
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(ТипЗнч(КлючИЗначение.Значение));
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    Результат.Вставить(КлючИЗначение.Ключ, ОписаниеТипов.ПривестиЗначение(Неопределено));
    КонецЦикла;
    Возврат Результат
    КонецФункции
```

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

```1c
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", Тип("Строка"));
    Структура.Вставить("СчетчикМассив", Тип("Массив")); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = ИнициализироватьСтруктуру(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;
    КонецПроцедуры

    Функция ИнициализироватьСтруктуру(СтруктураШаблон)
    Результат = Новый Структура;
    Для Каждого КлючИЗначение Из СтруктураШаблон Цикл
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(КлючИЗначение.Значение);
    ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
    Результат.Вставить(КлючИЗначение.Ключ, ОписаниеТипов.ПривестиЗначение(Неопределено));
    КонецЦикла;
    Возврат Результат
    КонецФункции
```

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

(4) AHDP, еще один вопрос. Когда я применяю конструкцию "Знач" перед параметром функции, параметр рекурсивно преобразуется со всеми вложенными объектами (если я например, передаю структуру структур структур, и где-то внутри массивы)?
---
еще один вопрос. Когда я применяю конструкцию "Знач" перед параметром функции, параметр рекурсивно преобразуется со всеми вложенными объектами (если я например, передаю структуру структур структур, и где-то внутри массивы)?
Знач делает "поверхностное" копирование объекта
Это значит, что вложенные объекты копироваться не будут.
---
Попробуйте так:

```1c
    Процедура Команда1НаСервере()

    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    ФиксированнаяСтруктура = ФС(Структура);

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = Новый Структура(ФиксированнаяСтруктура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла;

    КонецПроцедуры

    Функция ФС(Знач Структура)
    ФиксированнаяСтруктура = Новый ФиксированнаяСтруктура(Структура);
    Возврат ФиксированнаяСтруктура;
    КонецФункции
```
---
Не уверен, что именно это хочу спросить (и стоит ли это спрашивать), но как инициализировать новый массив в месте, отмеченном комментарием со звездочкой "по значению", а не "по ссылке"?
Никак, ибо он и так инициализируется "по значению", а вот
дальше ты оперирует уже ссылкой на него. Для работы с объектом (точнее его копией), а не ссылкой на него - предназначено свойство параметра функции/процедуры передача по значению.

```1c
    Функция Копия(Знач ссылка)
    возврат ссылка
    КонецФункции

    ...
    Структура = Новый Структура();
    Структура.Вставить("Счетчик", ");
    Структура.Вставить("СчетчикМассив", Новый Массив()); // *

    Результат = Новый Массив();

    Для Счетчик = 1 По 5 Цикл
    Врем = Копия(Структура);
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
    Врем["СчетчикМассив"].Добавить(Счетчик); // **

    Результат.Добавить(Врем);
    КонецЦикла
```

И более философский вопрос: таблица значений ведет себя также, но у нее есть метод "Скопировать()". С чем связано отсутствие этого метода у массива?

Передача ссылки на объект (не путать с ссылкой и объектом в терминологии объектной модели 1С)- принятое по умолчанию поведение.
Скопировать() введен из-за наличия параметров, позволяющих получить не только копию, но и подобную таблицу.
---
Элементы структуры в вашем коде не копируются, то есть в итоге все элементы Результата одинаковые. У вас этот код работает правильно?
---
Передача ссылки на объект ... принятое по умолчанию поведение
Чтобы окончательно быть уверенным, что понял все правильно, передача ссылки по умолчанию принята только для объектов? То есть для любого типа, кроме числа, строки, даты и булева? А эти примитивные типы всегда после инициализации передаются по значению, даже если я напишу так,

```1c
    пер1 = ";
    Структура.Вставить("Счетчик", пер1);
```

в дальнейшем

```1c
    Врем["Счетчик"] = Строка(Врем["Счетчик"]) + Строка(Счетчик);
```

будет изменять не "пер1", а непосредственно значение в структуре "Врем" (даже если не использовать предложенную функцию копии)?
---
переменная ( не путать со значением переменной) всегда передается по значению.
Если это понять, тогда все остальное становится понятным.
П1 = 5; // Значение: число 5
П2 = "строка"; //Значение: строка "строка"
П3 = Справочники.Номенклатура.ПустаяСсылка(); // Значение: Ссылка на объект

ОбработкаЗначений(П1,П2,П3);

Процедура ОбработкаЗначений(А1,А2,А3)

// А1 это новая переменная, куда передалось значение П1: число 5
// А2 это новая переменная, куда передалось значение П2: строка "строка"
// изменение примитивных данных никак не скажется на передаваемые переменные.

// А3 это новая переменная, куда передалось значение П3: Ссылка на объект
// Если изменять значение объекта ссылки, то изменения будут и в П3, так как это один и тот же объект
// Но если изменить:
А3 = А1; // то это не означает, что измениться переменная П3.

КонецПроцедуры;
---
Насколько я понимаю, П3 как раз и изменяется. При возврате из процедуры в П3 лежит 5, а на пустую ссылку номенклатуры никто не ссылается
---
действительно изменится. Рассматривал с точки зрения нормальных ЯП.
Значит тут все передается по ссылке.
---
Поведение неочевидное, но логичное.
Надо не полениться прописать в цикле Врем["СчетчикМассив"] = Новый Массив();