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

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

Как добавить колонку в таблицу значений на форме в 1С

Как программно добавить колонку в таблицу значений на форме 1С: работа через Добавить(), изменение реквизитов формы, типизация, отображение и типичные ошибки.

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

Есть два принципиально разных сценария. Первый — таблица создаётся целиком в коде на сервере и потом выводится на форму: здесь колонки добавляются методом Колонки.Добавить(). Второй — таблица уже объявлена как реквизит формы, и колонку нужно добавить динамически в ходе работы: тогда используется метод ИзменитьРеквизиты() объекта формы. Смешивание этих подходов — самая частая причина ситуации, когда колонка в данных есть, а на экране её не видно.

Добавление колонки в обычную таблицу значений в коде

Если таблица значений создаётся программно и не привязана к реквизиту формы, достаточно метода Добавить() коллекции колонок. Синтаксис: Таблица.Колонки.Добавить(ИмяКолонки, ОписаниеТипа, Заголовок, Ширина). Все параметры, кроме имени, необязательны, но тип лучше указывать всегда — без него колонка получит произвольный тип, что усложнит сортировку, итоги и ввод данных.

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

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

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

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

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

Добавление колонки в реквизит формы через ИзменитьРеквизиты

Когда таблица объявлена как реквизит формы, её состав колонок — это часть структуры формы, а не просто данные. Изменять структуру формы можно только на сервере методом ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты). Каждый добавляемый реквизит описывается объектом РеквизитФормы с указанием имени, типа и пути — в данном случае путь совпадает с именем таблицы.

&НаСервере

Процедура ДобавитьКолонкуНаСервере()

МассивДобавляемых = Новый Массив;

ОписаниеТипа = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

НовыйРеквизит = Новый РеквизитФормы("Сумма", ОписаниеТипа, "Товары", "Сумма");

МассивДобавляемых.Добавить(НовыйРеквизит);

ИзменитьРеквизиты(МассивДобавляемых);

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

Здесь «Товары» — имя реквизита формы с таблицей значений, «Сумма» — имя новой колонки. После вызова ИзменитьРеквизиты() колонка существует в данных формы, но на экране её ещё нет: элемент формы создаётся отдельным шагом. Это ключевой момент, который часто упускают.

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

Создание элемента формы для новой колонки

После изменения реквизитов нужно программно добавить элемент формы типа «ПолеФормы» и связать его с данными через свойство ПутьКДанным. Родителем элемента указывается таблица формы, в которую добавляется колонка.

Элемент = Элементы.Добавить("ТоварыСумма", Тип("ПолеФормы"), Элементы.Товары);

Элемент.ПутьКДанным = "Товары.Сумма";

Элемент.Вид = ВидПоляФормы.ПолеВвода;

Элемент.Заголовок = "Сумма";

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

Путь к данным строится строго по шаблону «ИмяРеквизитаТаблицы.ИмяКолонки». Ошибка в одной букве не всегда вызывает исключение сразу — иногда колонка просто отображается пустой, что затрудняет поиск причины. Проверяйте путь первым делом, если колонка видна, но данные в ней не появляются.

Выбор подхода: статические колонки, динамические или запрос

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

Сравнение вариантов

Колонка в конфигураторе

Подходит при фиксированной структуре таблицы. Простая настройка, нет кода, но нельзя менять состав в runtime

ИзменитьРеквизиты + элемент формы

Для динамических колонок на управляемой форме. Гибко, но требует серверного вызова и аккуратного управления жизненным циклом

Динамический список или СКД

Когда колонки определяются запросом или настройками отчёта. Платформа сама строит колонки, но таблица доступна только на чтение

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

Типизация колонки и её влияние на поведение

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

КвалификаторыСтроки = Новый КвалификаторыСтроки(100);

ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка", , КвалификаторыСтроки);

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

Составной тип (например, «Число» или «Строка» одновременно) допустим, но затрудняет сортировку и итоги. Используйте его только когда это действительно требуется логикой — например, колонка универсального значения в настройках.

Частые ошибки и их признаки

Типичные ошибки
01
Вызов ИзменитьРеквизиты на клиенте — метод недоступен, код падает с ошибкой; переносите логику в серверную процедуру
02
Добавление колонки с именем, которое уже существует, — исключение; перед добавлением проверяйте наличие через поиск реквизита
03
Элемент формы создан, но ПутьКДанным не совпадает с именем колонки — колонка отображается пустой без сообщений об ошибке
04
Повторное добавление колонок при каждом открытии или обновлении формы — дубли элементов и ошибки; выполняйте добавление один раз, например в ПриСозданииНаСервере, или проверяйте существование
05
Попытка изменить колонки таблицы, полученной через РеквизитФормыВЗначение, с ожиданием, что форма обновится сама, — объект отсоединён от формы, изменения нужно возвращать через ЗначениеВРеквизитФормы

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

Проверка результата и ограничения

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

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

Колонка в данных
Норма

Таблица.Колонки.Найти(Имя) возвращает колонку с нужным типом

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

Метод возвращает Неопределено — реквизит не добавлен

Отображение на форме
Норма

В шапке таблицы виден заголовок, значения строк отображаются

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

Колонки нет визуально — элемент формы не создан или неверный родитель

Редактирование
Норма

Значение вводится и сохраняется в строке

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

Поле недоступно — проверьте Вид поля и свойство ТолькоПросмотр

Повторное открытие формы
Норма

Колонки создаются один раз, без дублей

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

Ошибка о существующем имени — добавление выполняется повторно

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

Итог

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

Новая колонка на форме — это два шага: добавить реквизит-колонку через ИзменитьРеквизиты() на сервере и создать элемент ПолеФормы с корректным ПутьКДанным. Тип задавайте явно, добавление выполняйте один раз и одним вызовом.

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

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

Только если это автономный объект «ТаблицаЗначений», созданный в коде и не связанный с реквизитом формы. Для реквизита формы изменение структуры возможно исключительно в серверном контексте через ИзменитьРеквизиты(), поэтому без серверного вызова обойтись нельзя.

Почему колонка добавилась, но на форме не видна?

Изменение реквизитов меняет только данные формы. Чтобы колонка появилась визуально, нужно отдельно создать элемент формы типа ПолеФормы, указать таблицу как родителя и задать ПутьКДанным в формате «ИмяТаблицы.ИмяКолонки».

Как добавить колонку с типом «Булево» и флажком?

В описании типов укажите «Булево», а при создании элемента формы задайте Вид = ВидПоляФормы.ПолеФлажка. Платформа отобразит колонку как флажки, доступные для интерактивного переключения.

Как избежать ошибки при повторном добавлении колонки?

Перед вызовом ИзменитьРеквизиты проверьте, существует ли колонка: например, получите таблицу через РеквизитФормыВЗначение и выполните Колонки.Найти(Имя). Альтернатива — выполнять добавление строго один раз в обработчике ПриСозданииНаСервере.

Чем добавление колонки в таблицу значений отличается от динамического списка?

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