При разработке на 1С:Предприятии часто возникает необходимость хранить в одной ячейке ТаблицаЗначений сложный тип данных, например, Массив. В процессе такой работы многие разработчики сталкиваются с неожиданным поведением системы: при очистке массива, который был ранее записан в строку таблицы, данные пропадают во всех строках. Рассмотрим, почему это происходит и как правильно организовать алгоритм заполнения.
В платформе 1С типы данных, такие как Массив, Структура или Соответствие, являются ссылочными объектами. Когда мы создаем массив один раз и в цикле присваиваем его в разные строки ТаблицаЗначений, мы записываем не «копию» данных, а ссылку на одну и ту же область памяти. В результате, когда на следующей итерации цикла мы вызываем метод Очистить(), этот массив меняется «на корню» для всех строк, где он был сохранен.
Чтобы избежать этой проблемы, необходимо в каждой итерации цикла создавать новый объект массива. Это гарантирует, что каждая строка таблицы будет ссылаться на независимую область памяти.
Рассмотрим пример правильной реализации заполнения таблицы значений:
ТестТз = Новый ТаблицаЗначений;
ТестТз.Колонки.Добавить("ТестМассив", Новый ОписаниеТипов("Массив"));
// Заполняем таблицу в цикле
Для Индекс = 1 По 2 Цикл
ТестТзСтрока = ТестТз.Добавить();
// ВАЖНО: Создаем новый массив для каждой строки
ТестТзСтрока.ТестМассив = Новый Массив;
// Добавляем данные в текущий массив
ТестТзСтрока.ТестМассив.Добавить("Данные №" + Индекс);
ТестТзСтрока.ТестМассив.Добавить(Индекс * 100);
КонецЦикла;
Массив через ОписаниеТипов. Хотя это не является обязательным, это повышает надежность кода.Новый Массив. Это ключевое действие, предотвращающее перезапись предыдущих данных.Неопределено. Перед вызовом метода Добавить() обязательно проверяйте, инициализирован ли массив.Для безопасного обращения к данным в строке таблицы можно использовать следующую конструкцию:
Если СтрокаТЗ.КолонкаМассив = Неопределено Тогда
СтрокаТЗ.КолонкаМассив = Новый Массив;
КонецЕсли;
СтрокаТЗ.КолонкаМассив.Добавить(НовоеЗначение);
Хотя хранение массивов внутри ТаблицаЗначений технически допустимо, стоит помнить об архитектурных особенностях:
Структура или Соответствие — они работают по той же логике ссылочных типов, но могут быть более удобны для доступа по ключу.Таким образом, основной секрет корректной работы — это всегда создавать новый объект для каждой новой строки. Соблюдение этого правила позволит избежать трудноуловимых ошибок с данными и сделает ваш код предсказуемым.