Новый реквизит в табличной части документа 1С 8.3: метаданные, форма, код

· 9 мин

Содержание

Чтобы добавить колонку в табличную часть документа 1С, откройте Конфигуратор, найдите документ в дереве Документы → <Документ> → Табличные части → <ТабличнаяЧасть> и добавьте туда новый реквизит с нужным типом. Затем перетащите его на форму документа и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Для типовой конфигурации на поддержке удобнее сделать то же самое в расширении — так обновления не затрут доработку.

Колонка в табличной части — это и есть реквизит табличной части. Он хранится в базе, попадает в запросы и отчёты, его можно заполнять кодом. Порядок действий одинаков для 1С:Бухгалтерии, УТ, ЗУП и любой другой конфигурации на платформе 8.3: меняется только имя документа и табличной части.

Что проверить до изменения структуры метаданных

Сначала убедитесь, что колонку вообще нужно создавать. Часто она уже есть в метаданных, но скрыта на форме.

👀 Проверка без Конфигуратора. Откройте документ в режиме Предприятия, нажмите Ещё → Изменить форму и раскройте в дереве элементов табличную часть. Если нужное поле там есть со снятой галочкой — просто включите его. Это пользовательская настройка, она не трогает конфигурацию.

Если поля нет, переходим к доработке. До неё проверьте четыре вещи:

  • 💾 Резервная копия. Выгрузите базу через Администрирование → Выгрузить информационную базу в Конфигураторе или сделайте копию средствами СУБД.
  • 🔒 Режим поддержки. Откройте Конфигурация → Поддержка → Настройка поддержки. Если там написано, что изменение конфигурации недоступно, объекты типовой заблокированы.
  • 🧩 Способ доработки. Для типовой на поддержке выбирайте расширение. Прямая правка основной конфигурации усложняет каждое следующее обновление.
  • 👥 Окно для обновления. Новый реквизит меняет структуру таблиц в базе. Обновление структуры требует монопольного доступа, поэтому планируйте его на время, когда в базе никто не работает .

Сначала отработайте изменение на копии базы. Создать копию проще всего загрузкой выгруженного .dt в новую пустую базу.

Как добавить колонку в табличную часть в Конфигураторе

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

Шаг 1. Откройте конфигурацию на редактирование

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

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

Шаг 2. Создайте реквизит табличной части

  1. В дереве раскройте Документы, затем нужный документ, например ЗаказКлиента.
  2. Раскройте ветку Табличные части и выделите табличную часть, например Товары.
  3. Нажмите кнопку добавления на панели дерева или клавишу Insert. Появится новый реквизит и откроется палитра свойств.

Шаг 3. Задайте имя, синоним и тип

СвойствоЧто указатьПример
ИмяБуквы, цифры и _, без пробелов, начинается с буквыКоэффициентНаценки
СинонимЗаголовок колонки, который увидит пользователь«Коэфф. наценки»
ТипЧисло, Строка, Дата, Булево или ссылка на справочникЧисло, длина 10, точность 3
Проверка заполнения«Выдавать ошибку», если колонка обязательна—

Для строки задавайте конкретную длину, например 150 символов. Строка неограниченной длины хранится иначе: по ней нельзя полноценно сравнивать и группировать в запросах.

Имя не должно совпадать со стандартными реквизитами табличной части. У каждой строки уже есть НомерСтроки и Ссылка — такие имена занять нельзя.

Шаг 4. Обновите конфигурацию базы данных

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

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

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

Если база подключена к хранилищу конфигурации

При групповой разработке конфигурация лежит в хранилище, и править объект без захвата нельзя.

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

Пока документ захвачен, коллеги не смогут его изменить. Не держите захват дольше, чем нужно для доработки.

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

После шага 4 реквизит уже есть в базе, но на форме его нет. Управляемая форма не подтягивает новые реквизиты сама.

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

Свойства колонки на форме

Выделите новое поле и откройте его свойства (Alt+Enter). Чаще всего настраивают:

  • 📏 Ширина — чтобы длинная строка не растягивала таблицу.
  • 🔒 Только просмотр — если колонку заполняет программа, а не пользователь.
  • 🔢 Формат — например, ЧДЦ=2 для двух знаков после запятой.
  • 👁 Видимость — можно скрыть колонку по умолчанию и дать включить её через настройку формы.

Пересчёт при изменении значения

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

&НаКлиенте
Процедура ТоварыКоэффициентНаценкиПриИзменении(Элемент)

	ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекущиеДанные.Сумма = ТекущиеДанные.Цена * ТекущиеДанные.Количество
		* ТекущиеДанные.КоэффициентНаценки;

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

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

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

Колонка в табличной части через расширение конфигурации

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

Расширения появились в платформе 8.3.6. Добавлять собственные реквизиты в заимствованные объекты можно только в более поздних версиях, поэтому работайте на актуальной платформе 8.3.2x.

Как это сделать

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

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

После обновления типовой

Расширение привязано к именам объектов основной конфигурации. Если в новом релизе поставщик переименует документ, табличную часть или форму, расширение перестанет применяться, и колонка исчезнет.

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

Когда что выбрать

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

Программное добавление колонки через код

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

Поле на форме для существующего реквизита

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

&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

	НовоеПоле = Элементы.Добавить("ТоварыКоэффициентНаценки", Тип("ПолеФормы"), Элементы.Товары);
	НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
	НовоеПоле.ПутьКДанным = "Объект.Товары.КоэффициентНаценки";
	НовоеПоле.Заголовок = "Коэфф. наценки";

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

Аннотация &После выполняет процедуру после типового обработчика. В основной конфигурации тот же код пишут прямо в ПриСозданииНаСервере, без аннотации.

Колонка в таблице значений на форме

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

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

	Добавляемые = Новый Массив;
	Добавляемые.Добавить(Новый РеквизитФормы("Примечание",
		Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)),
		"ТаблицаДанных", "Примечание"));
	ИзменитьРеквизиты(Добавляемые);

	Поле = Элементы.Добавить("ТаблицаДанныхПримечание", Тип("ПолеФормы"), Элементы.ТаблицаДанных);
	Поле.Вид = ВидПоляФормы.ПолеВвода;
	Поле.ПутьКДанным = "ТаблицаДанных.Примечание";

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

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

Заполнение колонки в уже созданных документах

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

&НаСервере
Процедура ЗаполнитьКоэффициентВСтарыхДокументах()

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Док.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ЗаказКлиента КАК Док
	|ГДЕ
	|	Док.Дата >= &НачалоПериода";
	Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДатаСеанса()));

	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
		Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
			Если СтрокаТЧ.КоэффициентНаценки = 0 Тогда
				СтрокаТЧ.КоэффициентНаценки = 1;
			КонецЕсли;
		КонецЦикла;
		ДокументОбъект.ОбменДанными.Загрузка = Истина;
		ДокументОбъект.Записать();
	КонецЦикла;

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

ОбменДанными.Загрузка = Истина записывает документ без проверок и обработчиков. Движения при этом не перепроводятся, поэтому учёт не меняется. Перед запуском на рабочей базе проверьте обработку на копии.

Ошибки после добавления колонки и как их убрать

Диагностика: выберите симптом

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

Появится ли новая колонка в отчётах?
В конструкторе запросов и в отчётах на СКД — да, как обычное поле табличной части. В готовых типовых отчётах — только если их доработать: они берут фиксированный набор полей.
Попадёт ли колонка в печатную форму?
Нет. Макет печатной формы нужно доработать отдельно: добавить область в макет и заполнить её в процедуре печати.
Можно ли потом удалить колонку?
Да. Удалите реквизит в Конфигураторе и обновите базу. Данные колонки удалятся без возможности восстановления, поэтому сначала проверьте поиском ссылок, что реквизит больше нигде не используется в коде.
Передаётся ли новая колонка при обмене с другими базами?
Нет, пока не изменены правила обмена. В базе-приёмнике колонку тоже надо создать, иначе передавать значения некуда.
Сколько колонок можно добавить в табличную часть?
Жёсткого практического предела для обычного документа нет. Но каждая колонка утяжеляет форму и таблицу в базе: десятки служебных полей лучше вынести в отдельную табличную часть или регистр сведений.