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