Разработка и Конфигурация · 11 мин
Как добавить столбец в массив в 1С
Как добавить столбец в массив в 1С: методы Добавить() коллекции Колонки для таблицы значений, работа с массивом структур, примеры кода и типичные ошибки разработчика.
Под фразой «добавить столбец в массив» в 1С обычно скрываются три разные задачи: добавить колонку в таблицу значений, дополнить массив структур новым полем или расширить колонки динамического списка и табличного поля формы. У каждого сценария свой синтаксис и свои подводные камни, и путаница между ними — самая частая причина ошибок у начинающих разработчиков.
Классический массив в 1С (объект типа «Массив») не имеет столбцов — это одномерная упорядоченная коллекция элементов. Столбцы существуют у таблицы значений, дерева значений и табличных частей. Поэтому первый шаг — понять, с какой именно структурой данных вы работаете, и только потом выбирать метод.
Ниже разобраны все рабочие способы: от простого вызова Колонки.Добавить() до динамического изменения реквизитов формы. Примеры кода проверяемы на любой актуальной версии платформы 1С:Предприятие 8.3.
Почему у массива нет столбцов и что использовать вместо него
Массив в 1С создаётся конструктором Новый Массив и хранит элементы с числовыми индексами от нуля. У него есть методы Добавить(), Вставить(), Удалить(), Найти(), но нет понятия колонок. Если вам нужна двумерная структура «строки × столбцы», правильный инструмент — таблица значений.
Таблица значений создаётся конструктором Новый ТаблицаЗначений и содержит коллекцию Колонки. Именно с ней работают запросы (метод Выгрузить() результата запроса возвращает таблицу значений), именно её удобно выводить в отчёты и на формы. Если вы получили от коллеги «массив со столбцами» — почти наверняка это таблица значений или массив структур.
Как добавить колонку в таблицу значений
Основной метод — Колонки.Добавить(). Минимальный вызов принимает только имя колонки, но на практике почти всегда стоит сразу задать тип, иначе колонка будет хранить произвольные значения, что усложнит сортировку и сравнение.
ТЗ = Новый ТаблицаЗначений;
// Простое добавление колонки без типа
ТЗ.Колонки.Добавить("Номенклатура");
// Колонка с типом Строка длиной 100
ОписаниеСтроки = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100));
ТЗ.Колонки.Добавить("Наименование", ОписаниеСтроки);
// Колонка с числовым типом: 15 знаков, 2 после запятой
ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
ТЗ.Колонки.Добавить("Сумма", ОписаниеЧисла);
// Колонка со ссылочным типом
ОписаниеСсылки = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ТЗ.Колонки.Добавить("Товар", ОписаниеСсылки);
Полный синтаксис метода: Колонки.Добавить(Имя, ОписаниеТипов, Заголовок, Ширина). Заголовок используется при выводе таблицы на форму, ширина задаётся в символах. Оба параметра необязательны.
После добавления колонки заполняйте её через обход строк: для каждой строки таблицы присваивайте значение по имени колонки — СтрокаТЗ.Сумма = ИтоговаяСумма. Если колонка добавлена после заполнения строк, во всех существующих строках она получит пустое значение соответствующего типа (или Неопределено, если тип не задан).
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "Сумма документа", 15);Как добавить колонку в таблицу, полученную из запроса
Частая задача: результат запроса выгружен в таблицу значений, и нужно дополнить её вычисляемым полем — например, суммой с НДС или признаком проверки. Запрос возвращает таблицу с уже заполненными строками, поэтому колонка добавляется после выгрузки, а затем заполняется в цикле.
РезультатЗапроса = Запрос.Выполнить();
ТЗ = РезультатЗапроса.Выгрузить();
ТЗ.Колонки.Добавить("СуммаСНДС", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));
Для Каждого СтрокаТЗ Из ТЗ Цикл
СтрокаТЗ.СуммаСНДС = СтрокаТЗ.Сумма * 1.2;
КонецЦикла;
Обратите внимание: если имя новой колонки совпадёт с уже существующей, платформа вызовет исключение «Колонка с таким именем уже существует». Перед добавлением полезно проверять наличие: Если ТЗ.Колонки.Найти("СуммаСНДС") = Неопределено Тогда ... КонецЕсли.
Как добавить поле в массив структур
Массив структур — популярная альтернатива таблице значений, когда данные передаются между процедурами или сериализуются. «Столбец» здесь — это ключ структуры. Чтобы добавить его всем элементам массива, нужно пройти по массиву циклом и вызвать Вставить() для каждой структуры.
МассивДанных = Новый Массив;
// Пример заполнения
Строка = Новый Структура("Номенклатура, Количество", "Стул", 5);
МассивДанных.Добавить(Строка);
// Добавляем новое "поле-столбец" всем элементам
Для Каждого Элемент Из МассивДанных Цикл
Элемент.Вставить("Цена", 0);
КонецЦикла;
Метод Вставить() перезаписывает значение, если ключ уже существует, — исключения не будет. Это удобно, но опасно: можно молча затереть данные. Если нужно добавить ключ только при его отсутствии, используйте проверку Элемент.Свойство("Цена"), которая возвращает Истина или Ложь.
Учтите ограничение: структура с фиксированным набором ключей, созданная через конструктор Новый Структура("Ключ1, Ключ2"), допускает добавление новых ключей — это не фиксированная структура. А вот объект типа ФиксированнаяСтруктура изменить нельзя вообще: попытка вызвать Вставить() вызовет ошибку. Такие структуры возвращают, например, некоторые методы формы.
Добавление колонки в таблицу значений на форме
Если таблица значений размещена на управляемой форме как реквизит, простого вызова Колонки.Добавить() недостаточно — новая колонка не появится визуально, пока вы не создадите для неё элемент формы. Для полноценного динамического добавления используется метод ИзменитьРеквизиты() в серверной процедуре.
&НаСервере
Процедура ДобавитьКолонкуНаСервере()
Добавляемые = Новый Массив;
Добавляемые.Добавить(Новый РеквизитФормы("Комментарий",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200)),
"ТаблицаДанных", "Комментарий", Ложь));
ИзменитьРеквизиты(Добавляемые);
НовыйЭлемент = Элементы.Добавить("ТаблицаДанныхКомментарий", Тип("ПолеФормы"), Элементы.ТаблицаДанных);
НовыйЭлемент.ПутьКДанным = "ТаблицаДанных.Комментарий";
КонецПроцедуры
Порядок важен: сначала ИзменитьРеквизиты(), затем создание элемента формы. Если сделать наоборот и указать ПутьКДанным к ещё не существующему реквизиту, платформа выдаст ошибку. Вызов ИзменитьРеквизиты() доступен только на сервере и приводит к пересозданию формы — не вызывайте его в цикле по многим колонкам, добавляйте все реквизиты одним массивом за один вызов.
- 1Сформируйте массив объектов РеквизитФормы с именем, типом, путём к таблице и заголовком
- 2Вызовите ИзменитьРеквизиты(Добавляемые) в серверной процедуре
- 3Создайте элемент ПолеФормы через Элементы.Добавить() и задайте ПутьКДанным
- 4Заполните значения новой колонки в строках таблицы
- 5Проверьте отображение колонки на форме и типизацию значений
Преобразование массива в таблицу значений со столбцами
Когда исходные данные уже лежат в массиве и нужно представить их в виде таблицы, создайте таблицу значений и перенесите данные. Если элементы массива — структуры с одинаковым набором ключей, колонки создаются по ключам первой структуры.
Функция МассивСтруктурВТаблицу(МассивДанных)
ТЗ = Новый ТаблицаЗначений;
Если МассивДанных.Количество() = 0 Тогда
Возврат ТЗ;
КонецЕсли;
Для Каждого КлючЗначение Из МассивДанных[0] Цикл
ТЗ.Колонки.Добавить(КлючЗначение.Ключ);
КонецЦикла;
Для Каждого Элемент Из МассивДанных Цикл
НоваяСтрока = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Элемент);
КонецЦикла;
Возврат ТЗ;
КонецФункции
Здесь типы колонок не задаются, поэтому колонки получают произвольный тип. Для последующей сортировки или итогов дополните создание колонок описанием типов, определяя тип по значению первого элемента через ТипЗнч().
Сравнение подходов и проверка результата
Выбор инструмента зависит от того, где живут данные и что с ними нужно делать дальше. Таблица значений выигрывает у массива структур по возможностям: сортировка, свёртка, поиск по нескольким колонкам, выгрузка в СКД. Массив структур легче сериализуется и дешевле по памяти при передаче небольших наборов данных.
Сравнение вариантов
Подходит для обработки, сортировки, свёртки и вывода на форму. Ограничение: требует описания типов для корректной сортировки.
Подходит для передачи данных между процедурами и сериализации. Ограничение: нет сортировки и поиска по полям из коробки.
Единственный способ динамически добавить видимую колонку на управляемой форме. Ограничение: только на сервере, пересоздаёт форму.
После добавления колонки проверьте результат до передачи таблицы дальше: убедитесь, что колонка существует, тип соответствует ожиданиям и значения заполнены.
Как проверить результат
ТЗ.Колонки.Найти("Имя") возвращает объект колонки
Возвращается Неопределено — колонка не добавлена или имя с опечаткой
ТипЗнч(ТЗ[0].ИмяКолонки) даёт ожидаемый тип после заполнения
Все значения Неопределено — тип не задан и значения не присвоены
Колонка видна, значения редактируются
Колонки нет — не создан элемент формы или неверный ПутьКДанным
Часто задаваемые вопросы
Можно ли добавить столбец непосредственно в объект «Массив»?
Нет. Массив в 1С — одномерная коллекция с числовыми индексами. Для двумерных данных используйте таблицу значений, массив структур или массив массивов (в последнем случае «столбец» — это фиксированный индекс во вложенных массивах, и добавить его придётся вставкой элемента в каждый вложенный массив).
Как вставить колонку в середину таблицы, а не в конец?
Метод Колонки.Добавить() всегда добавляет колонку в конец. Чтобы изменить порядок, используйте Колонки.Сдвинуть(Колонка, Смещение) — например, ТЗ.Колонки.Сдвинуть(ТЗ.Колонки.НоваяКолонка, -2) переместит её на две позиции влево. Можно также вставить колонку сразу по индексу через Колонки.Вставить(Индекс, Имя, Тип).
Что произойдёт со строками при добавлении новой колонки?
Существующие строки сохранятся. В новой колонке они получат пустое значение заданного типа (ноль для числа, пустая строка для строки) или Неопределено, если тип не указан. Данные других колонок не затрагиваются.
Как добавить колонку в табличную часть документа?
Табличная часть — это метаданные конфигурации, и добавить в неё колонку программно в режиме предприятия нельзя. Реквизит табличной части создаётся в конфигураторе. Если нужны дополнительные данные без изменения конфигурации, используйте дополнительные реквизиты и сведения или храните данные в отдельном регистре сведений.
Почему ИзменитьРеквизиты() выдаёт ошибку?
Частые причины: вызов в клиентской процедуре (метод доступен только на сервере), реквизит с таким именем уже существует, неверно указан путь к родительскому реквизиту-таблице или попытка изменить реквизит, созданный в конфигураторе. Проверьте контекст вызова и уникальность имён.
Как удалить ошибочно добавленную колонку?
Используйте ТЗ.Колонки.Удалить(ТЗ.Колонки.Найти("ИмяКолонки")) или по индексу. Для динамических реквизитов формы передайте массив имён удаляемых реквизитов вторым параметром в ИзменитьРеквизиты(Добавляемые, Удаляемые) и дополнительно удалите связанный элемент формы через Элементы.Удалить().
Что важно запомнить
Столбцы добавляются не в массив, а в таблицу значений — методом Колонки.Добавить() с описанием типов. Для массива структур используйте Вставить() в цикле. Для отображения новой колонки на управляемой форме обязателен вызов ИзменитьРеквизиты() на сервере с последующим созданием элемента формы. Перед добавлением проверяйте, нет ли колонки с таким именем.