Новая колонка в табличной части документа или справочника: Конфигуратор, форма, код

· 9 мин

Содержание

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

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

Какой способ выбрать

ЗадачаГде делаетсяНужен ли Конфигуратор
Новое хранимое поле в строках документа или справочникаРеквизит табличной части в дереве конфигурацииДа
Показать уже существующую колонку, которая скрыта в формеРежим Предприятие, настройка формыНет
Добавить поле в список (динамический список)Запрос списка и форма спискаДа, если поля нет в источнике
Временная таблица в обработке или отчётеКод: таблица значенийНет
Типовая конфигурация на поддержкеРасширение конфигурацииДа, но без правки типовых объектов

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

Добавляем реквизит табличной части в Конфигураторе

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

Пошагово:

  1. Откройте дерево метаданных: Конфигурация → Открыть конфигурацию.
  2. Найдите нужный объект, например документ ПоступлениеТоваровУслуг, и откройте его двойным щелчком.
  3. Перейдите на закладку Данные. В списке табличных частей выберите нужную, например Товары.
  4. В нижней части найдите список реквизитов табличной части. Нажмите правой кнопкой и выберите Добавить (или кнопку со знаком «плюс»).
  5. В палитре свойств задайте Имя без пробелов, например НомерПартииПоставщика, Синоним для людей («Номер партии поставщика») и Тип.
  6. Закройте окно объекта.

Дальше сразу сохраняйте изменения в базу, об этом следующий раздел.

Имя реквизита — часть кода: на него ссылаются обработки, запросы, права. Переименовывать его после запуска в работу неприятно. Придумывайте имя сразу окончательным: короткое, понятное, без сокращений, которые знаете только вы.

Обновляем конфигурацию базы данных

Правка в дереве метаданных меняет только конфигурацию. Таблица в самой базе остаётся прежней, пока вы не примените изменения. Нажмите F7 или откройте меню Конфигурация → Обновить конфигурацию базы данных. Платформа покажет список изменений структуры, согласитесь с ним.

Когда в базе работают пользователи, платформа попросит монопольный доступ. Поэтому делайте это вне рабочего времени или предварительно попросите людей выйти из базы. Сеансы тех, кто остался, оборвутся.

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

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

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

Выводим колонку в форме документа

В управляемом приложении новый реквизит сам в форме не появляется. Платформа его знает, а форма ещё нет.

Как добавить:

  1. В дереве метаданных раскройте объект, затем ветку Формы, откройте форму документа.
  2. В правой верхней панели Элементы найдите таблицу с нужной табличной частью, например Товары.
  3. В правой нижней панели Реквизиты раскройте Объект и табличную часть. Новая колонка там уже есть.
  4. Перетащите её мышью в таблицу на панели Элементы. Появится поле формы, привязанное к данным.
  5. Задайте у поля Вид (поле ввода, флажок и так далее) и при необходимости ширину и заголовок.

Если колонка не нужна всем, пользователь управляет видимостью сам. В режиме 1С:Предприятие откройте форму, выберите в меню Еще команду Изменить форму и включите в списке нужное поле. В этом окне можно только скрывать и показывать то, что разработчик уже положил в форму, новых полей оно не создаёт. Поэтому, если колонки нет и в списке доступных полей, значит, её не вывели в форму в Конфигураторе.

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

Колонки в списках и в таблицах, созданных кодом

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

Динамический список строится по запросу. Колонку, которой нет в таблице-источнике, в нём не создать: сначала поле должно появиться в запросе. Откройте в форме списка реквизит с типом ДинамическийСписок, перейдите к его свойствам и включите настройку запроса. Добавьте поле в запрос и сохраните. Затем в панели Реквизиты у списка появится новая колонка, которую можно перетащить в таблицу формы.

Когда запрос нужно менять на лету (например, добавлять поле только для определённых ролей), используйте свойство ТекстЗапроса у динамического списка в обработчике формы, обычно ПриСозданииНаСервере. Не подменяйте запрос строкой, не проверив результат: ошибка в тексте запроса проявляется только при открытии списка.

Таблица значений

В обработках и отчётах таблицу собирают сами. Колонки задаются методом Колонки.Добавить:

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

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

Колонки таблицы значений живут только в памяти. В базу они не пишутся, и реквизитом табличной части не становятся.

Таблица на форме, созданная программно

Если таблица формы целиком динамическая, колонки можно создать в коде: массив РеквизитФормы передаётся в метод ИзменитьРеквизиты, а для вывода на форму создаются поля через Элементы.Добавить. Колонке нужен путь к данным вида ТаблицаДинамика.Колонка. Метод работает на сервере, а изменяются реквизиты формы, а не объекта. Такой приём годится для разовых отчётных форм, а не для хранения данных документа.

Реквизит самой табличной части документа из кода добавить нельзя. Метаданные меняются только в Конфигураторе.

Типы данных и ограничения при выборе

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

  • 🔢 Число: задайте длину и точность. Для количества часто хватает 15 знаков и 3 после запятой, для суммы обычно 15 и 2. Слишком короткое поле «режет» большие значения.
  • 🔤 Строка: длина фиксированная или неограниченная. Неограниченную строку нельзя использовать в отборах и индексах так же свободно, как строку с длиной, поэтому для коротких кодов задавайте разумный предел.
  • 🔗 Ссылка: выбирайте конкретный справочник или документ. Составной тип делайте только когда без него нельзя: с ним сложнее отборы, отчёты и проверка значений.
  • 📅 Дата: выберите состав (дата или дата и время), от этого зависит поле ввода.
  • ☑️ Булево: флажок в таблице, значение по умолчанию «Ложь».

Пример выбора. Колонка «Номер партии поставщика» хранит значения вроде ПП-2026/0457. Это короткий код, поэтому тип Строка длиной 25 знаков закроет его с запасом. Колонка «Вес брутто, кг» принимает значения вроде 12,345: хватит числа длиной 10 и точностью 3, максимум тогда 9 999 999,999. Колонку «Страна происхождения» делайте ссылкой на справочник, а не строкой: так не будет опечаток, и по ней удобно отбирать.

Реквизит табличной части может быть проиндексирован для ускорения выборок, но это нужно не всем колонкам. Включайте индекс, если по колонке часто отбирают в запросах, и не ставьте на все подряд: индексы замедляют запись.

Когда меняете тип на другой при заполненных данных, платформа при обновлении базы предупредит о потере данных. Читайте это предупреждение внимательно. Укорочение строки или уменьшение разрядности числа часть значений обрежет.

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

Типовая конфигурация и поддержка

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

Есть два рабочих пути:

  • ✅ Расширение конфигурации . Объект заимствуется в расширение, а в нём уже добавляются новые реквизиты и колонки табличной части. Типовая конфигурация остаётся нетронутой. Расширения появились в платформе 8.3.6, нужна платформа не ниже этого номера. Загрузка файла расширения (.cfe) и команда Обновить конфигурацию базы данных — отдельные шаги, не пропускайте второй.
  • ⚠️ Снятие объекта с поддержки. Быстро, но с этого момента вы сами отвечаете за слияние при каждом обновлении. Оправдано, когда типовой документ вы правите постоянно.

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

Типичные ошибки и что с ними делать

СимптомВероятная причинаЧто проверить
Колонки нет в формеРеквизит не перетащили в таблицуПанель Реквизиты формы, раздел Объект
В режиме 1С:Предприятие поля нет, в Конфигураторе естьНе обновлена конфигурация БДПовторить F7
Платформа просит монопольный доступ и не продолжаетВ базе открыты сеансыЗавершить сеансы, затем повторить
При записи «Поле не заполнено»Включена проверка заполненияСвойство реквизита, значение по умолчанию
Значения в старых строках пустыеНовое поле всегда пустое для старых данныхОбработка перезаполнения
Правка пропала после обновления релизаОбъект на поддержке, правка не сохраненаРасширение или объединение
Число в колонке обрезаетсяМала разрядностьДлина и точность в свойствах типа

Если после обновления структуры база ведёт себя странно: не открывается форма, пишет об ошибке структуры, проверьте, что обновление завершилось. Не прерывайте окно обновления закрытием Конфигуратора. При сомнениях откатитесь на выгрузку .dt, сделанную перед работой.

Перед тем как закрыть задачу , пройдитесь по списку:

Колонка добавлена до конца
Выполнено: 0 / 6

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

Можно ли добавить колонку в табличную часть без Конфигуратора?
Нет. Реквизит табличной части — элемент метаданных, он создаётся в дереве конфигурации. Без Конфигуратора можно только показать уже существующую колонку или собрать временную таблицу в коде.
Нужно ли обновлять конфигурацию базы данных после добавления колонки?
Да. Пока вы не примените изменения, например клавишей F7, таблицы в базе остаются прежними, а пользователи колонку не увидят.
Что будет в старых документах после добавления колонки?
Поле создастся, но будет пустым: пустая строка, ноль или пустая ссылка. Заполнить его можно отдельной обработкой.
Можно ли добавить колонку в типовую конфигурацию, не ломая обновления?
Да, через расширение конфигурации. Прямая правка типового объекта усложняет каждое последующее обновление.
Колонка есть в Конфигураторе, но в форме её нет. Почему?
Форма хранит свой набор элементов. Откройте форму, найдите колонку в панели Реквизиты и перетащите её в таблицу.
Как добавить колонку в таблицу значений?
Методом Колонки.Добавить с именем и описанием типов. Такая колонка существует только в памяти и в базу не записывается.