К статье
Практический материал

Разработка и Конфигурация · 11 мин

Список значений 1С: как добавить колонку и что использовать вместо

Разбираем, почему у списка значений в 1С нет колонок и как обойти ограничение: таблица значений, представления, дерево значений. Примеры кода и типичные ошибки.

Вопрос «как добавить колонку в список значений» возникает у большинства разработчиков 1С, которые пытаются хранить в списке не одно значение, а несколько связанных параметров — например, номенклатуру, количество и цену одновременно. Важно понять ключевой факт: у объекта СписокЗначений встроенной поддержки колонок нет. Каждый элемент списка содержит только четыре свойства: Значение, Представление, Пометка и Картинка.

Это ограничение заложено в архитектуру платформы и не снимается никакими настройками. Однако задача «хранить несколько полей на строку» решается несколькими штатными способами: заменой списка на таблицу значений, упаковкой данных в структуру или массив, использованием представления с разделителями. Выбор зависит от того, где список используется — в реквизите формы, в обработке выбора или в промежуточных вычислениях.

Ниже разобраны все рабочие варианты с примерами кода, критериями выбора и типичными ошибками, которые приводят к потере данных или ошибкам при сериализации формы.

Почему у списка значений нет колонок

Объект СписокЗначений проектировался как простой одномерный контейнер для выбора и отметки значений: типичный сценарий — выпадающий список, диалог отметки элементов, список отбора. Платформа жёстко фиксирует состав свойств элемента, и расширить его средствами конфигуратора нельзя.

Из этого следует практический вывод: любые попытки обратиться к несуществующей колонке, например Список[0].Количество, завершатся ошибкой «Поле объекта не обнаружено». Платформа не создаёт свойства динамически для элементов списка.

Ещё одно ограничение касается реквизитов формы. Если реквизит формы имеет тип СписокЗначений и связан с элементом формы, отобразить в нём табличную структуру с несколькими колонками не получится — элемент формы покажет только представление (или значение) каждой строки.

Способ 1. Заменить список на таблицу значений

Если требуется хранить несколько полей на строку, штатное и самый надёжное решение — объект ТаблицаЗначений. Он поддерживает произвольное количество колонок с типами, индексы, сортировку, свёртку и поиск.

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));

Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));

Строка = Таблица.Добавить();

Строка.Номенклатура = ТекущаяНоменклатура;

Строка.Количество = 5;

Строка.Цена = 1200;

Для реквизита формы таблица значений добавляется программно: сначала создаются реквизиты-колонки, затем сам реквизит таблицы, после чего данные загружаются через ЗначениеВРеквизитФормы. Именно этот путь нужен, если цель — вывести на форму табличное поле с несколькими колонками.

Порядок действий для реквизита формы
  1. 1
    Создайте массив реквизитов: для каждой колонки — Новый РеквизитФормы(Имя, ОписаниеТипов, ИмяТаблицы)
  2. 2
    Добавьте реквизит самой таблицы типа ТаблицаЗначений
  3. 3
    Вызовите ИзменитьРеквизиты(МассивДобавляемых)
  4. 4
    Создайте элемент формы Таблица и колонки, привязанные к реквизитам
  5. 5
    Заполните таблицу данными и проверьте отображение на форме

Способ 2. Хранить структуру или массив в свойстве Значение

Свойство Значение элемента списка принимает данные произвольного типа — в том числе структуру, массив или соответствие. Это позволяет «эмулировать» колонки без замены типа коллекции.

Список = Новый СписокЗначений;

ПараметрыСтроки = Новый Структура;

ПараметрыСтроки.Вставить("Номенклатура", ТекущаяНоменклатура);

ПараметрыСтроки.Вставить("Количество", 5);

ПараметрыСтроки.Вставить("Цена", 1200);

Список.Добавить(ПараметрыСтроки, "Товар, 5 шт.");

Обращение к данным выглядит так: Список[0].Значение.Количество. Способ удобен для внутренних вычислений в модуле, где список не выводится на форму и не передаётся между клиентом и сервером в сложных сценариях.

Ограничения существенные: структуры не сериализуются в некоторых контекстах (например, при передаче через параметры определённых механизмов), поиск по списку работает только по целому значению, а не по полям структуры. Метод НайтиПоЗначению для структуры фактически бесполезен — сравнение структур идёт по ссылке, а не по содержимому.

Способ 3. Составное представление с разделителями

Когда дополнительные данные нужны только для отображения пользователю, а обрабатывать их программно не требуется, достаточно сформировать составное представление:

Представление = Строка(Номенклатура) + " | " + Формат(Количество, "ЧГ=") + " | " + Формат(Цена, "ЧДЦ=2");

Список.Добавить(Номенклатура, Представление);

В свойстве Значение при этом остаётся ссылка или иной ключевой объект, а всё вспомогательное живёт в тексте представления. Это стандартный приём для списков выбора, где пользователь должен видеть, например, артикул и остаток рядом с наименованием.

Обратный разбор представления (парсинг строки по разделителю) применять не стоит: это хрупкое решение, которое ломается, если в данных встретится символ-разделитель. Для машинной обработки храните данные в структуре или таблице, а представление используйте только как «витрину».

Сравнение подходов и критерии выбора

Каждый из трёх способов занимает свою нишу. Неверный выбор обычно обнаруживается поздно — когда список уже встроен в логику обработки и его приходится переделывать.

КритерийТаблица значенийСтруктура в ЗначенииСоставное представление
Несколько типизированных полейДаДа, без контроля типовНет, только текст
Вывод на форму с колонкамиДа, штатноНетНет, одна строка
Поиск и сортировка по полямДа (Найти, НайтиСтроки, Сортировать)Только переборомНет
Безопасная передача клиент–серверДаОграниченноДа
Трудоёмкость внедренияСредняяНизкаяМинимальная
Маршрут решения

Как выбрать действие

Нужно табличное поле на форме с несколькими колонкамиСоздавайте реквизит формы типа ТаблицаЗначений с колонками и элемент Таблица
Данные обрабатываются только внутри серверной процедурыДопустимо хранить структуру в свойстве Значение списка
Нужно только красиво показать строки для выбораФормируйте составное Представление, в Значении держите ключ
Требуется поиск, отбор или сортировка по дополнительным полямПереходите на ТаблицуЗначений — список этого не умеет

Дерево значений как вариант для иерархии

Если помимо нескольких полей нужна иерархия (группы и подчинённые строки), подходит ДеревоЗначений — оно поддерживает колонки так же, как таблица значений, плюс коллекцию Строки у каждой строки.

Дерево = Новый ДеревоЗначений;

Дерево.Колонки.Добавить("Наименование");

Дерево.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Группа = Дерево.Строки.Добавить();

Группа.Наименование = "Материалы";

Подстрока = Группа.Строки.Добавить();

Подстрока.Наименование = "Краска";

Подстрока.Сумма = 3500;

Дерево оправдано, когда данные действительно многоуровневые. Для плоского списка оно добавляет лишнюю сложность без выигрыша.

Типичные ошибки и их последствия

Большинство проблем при «добавлении колонок» к списку значений связано с непониманием устройства объекта. Разберём самые частые.

Типичные ошибки
01
Попытка обратиться к произвольному свойству элемента списка (Список[0].Цена) — ошибка «Поле объекта не обнаружено», так как свойство не существует
02
Хранение структуры в реквизите формы типа СписокЗначений — потеря данных или ошибки сериализации между серверными вызовами
03
Поиск по списку методом НайтиПоЗначению, когда в Значении лежит структура — поиск не находит элементы, потому что структуры сравниваются по ссылке
04
Парсинг составного представления для извлечения данных — ломается при попадании разделителя в сами данные
05
Использование списка значений там, где нужна таблица, с последующей переработкой всей логики обработки

Отдельная группа ошибок — при работе с реквизитами формы. Если таблицу значений добавили как реквизит, но забыли создать реквизиты-колонки с точно совпадающими именами, данные при загрузке через ЗначениеВРеквизитФормы будут обрезаны до существующих колонок без какого-либо сообщения об ошибке.

Контрольные точки

Как проверить результат

Состав колонок таблицы на форме
Норма

Все добавленные колонки видны и заполнены данными

Тревожный признак

Часть колонок пустая или отсутствует — проверьте совпадение имён реквизитов

Поведение между серверными вызовами
Норма

Данные в реквизите сохраняются после любого серверного вызова

Тревожный признак

Вложенные структуры пропадают — замените на ТаблицуЗначений

Поиск по данным
Норма

НайтиСтроки или Найти возвращают нужные строки

Тревожный признак

Поиск по структуре в списке ничего не находит — это ожидаемо, меняйте подход

Практические замечания по производительности и поддержке

Для больших объёмов данных (тысячи строк) таблица значений с индексами работает заметно быстрее любых обходных схем на списке значений. Метод Колонки.Добавить с указанием типа и последующее создание индекса через Индексы.Добавить дают предсказуемую скорость поиска.

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

Если список значений уже используется в типовом механизме (например, в списке выбора поля ввода), не расширяйте его структурами — дополнительные данные держите в отдельной таблице значений или соответствии, связав их с элементами списка по значению-ключу. Так типовой механизм продолжит работать, а данные останутся доступны.
ПЗ
Практическое замечание
Итог

Что важно запомнить

Колонок у СписокЗначений нет и не будет — это ограничение платформы. Для формы и типизированных данных берите ТаблицуЗначений, для локальных вычислений допустимы структуры в Значении, для отображения — составное Представление. Выбор способа определяется местом использования данных, а не привычкой.

Частые вопросы

Можно ли добавить колонку в список значений через расширение конфигурации?

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

Почему НайтиПоЗначению не находит элемент, если в Значении лежит структура?

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

Что выбрать для динамического списка на управляемой форме?

Для табличного отображения с колонками — реквизит формы типа ТаблицаЗначений с реквизитами-колонками и элемент формы «Таблица». Если данные должны обновляться запросом к базе с отборами и сортировкой «из коробки», рассмотрите динамический список с произвольным запросом вместо программной таблицы.

Можно ли отсортировать список значений по данным из структуры?

Штатной сортировки по полям вложенных структур нет — метод СортироватьПоЗначению и СортироватьПоПредставлению работают только со встроенными свойствами. Варианты обхода: перенести данные в таблицу значений и отсортировать её, либо выгрузить элементы в массив, отсортировать собственным алгоритмом и заполнить список заново.

Сохранится ли структура в списке значений при передаче в фоновое задание?

Параметры фоновых заданий сериализуются, и вложенные универсальные коллекции ведут себя не всегда предсказуемо. Надёжный вариант — передать таблицу значений (она сериализуется корректно) либо простые типы, а структуру собрать заново уже внутри фонового задания.