Новый реквизит в табличной части документа 1С 8.3: метаданные, форма, код
Содержание
Чтобы добавить колонку в табличную часть документа 1С, откройте Конфигуратор, найдите документ в дереве Документы → <Документ> → Табличные части → <ТабличнаяЧасть> и добавьте туда новый реквизит с нужным типом. Затем перетащите его на форму документа и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Для типовой конфигурации на поддержке удобнее сделать то же самое в расширении — так обновления не затрут доработку.
Колонка в табличной части — это и есть реквизит табличной части. Он хранится в базе, попадает в запросы и отчёты, его можно заполнять кодом. Порядок действий одинаков для 1С:Бухгалтерии, УТ, ЗУП и любой другой конфигурации на платформе 8.3: меняется только имя документа и табличной части.
Что проверить до изменения структуры метаданных
Сначала убедитесь, что колонку вообще нужно создавать. Часто она уже есть в метаданных, но скрыта на форме.
👀 Проверка без Конфигуратора. Откройте документ в режиме Предприятия, нажмите Ещё → Изменить форму и раскройте в дереве элементов табличную часть. Если нужное поле там есть со снятой галочкой — просто включите его. Это пользовательская настройка, она не трогает конфигурацию.
Если поля нет, переходим к доработке. До неё проверьте четыре вещи:
- 💾 Резервная копия. Выгрузите базу через
Администрирование → Выгрузить информационную базув Конфигураторе или сделайте копию средствами СУБД. - 🔒 Режим поддержки. Откройте
Конфигурация → Поддержка → Настройка поддержки. Если там написано, что изменение конфигурации недоступно, объекты типовой заблокированы. - 🧩 Способ доработки. Для типовой на поддержке выбирайте расширение. Прямая правка основной конфигурации усложняет каждое следующее обновление.
- 👥 Окно для обновления. Новый реквизит меняет структуру таблиц в базе. Обновление структуры требует монопольного доступа, поэтому планируйте его на время, когда в базе никто не работает .
Сначала отработайте изменение на копии базы. Создать копию проще всего загрузкой выгруженного .dt в новую пустую базу.
Как добавить колонку в табличную часть в Конфигураторе
Этот способ подходит для собственной или снятой с поддержки конфигурации, а также для типовой, если вы осознанно правите её напрямую.
Шаг 1. Откройте конфигурацию на редактирование
- Запустите 1С в режиме Конфигуратора.
- Выберите
Конфигурация → Открыть конфигурацию. - Для типовой: в
Конфигурация → Поддержка → Настройка поддержкинажмитеВключить возможность изменения. Затем для нужного документа установите правило «Объект поставщика редактируется с сохранением поддержки».
После включения возможности изменения вернуть конфигурацию в исходное состояние без загрузки чистой поставки нельзя. Делайте это только при наличии резервной копии.
Шаг 2. Создайте реквизит табличной части
- В дереве раскройте
Документы, затем нужный документ, напримерЗаказКлиента. - Раскройте ветку
Табличные частии выделите табличную часть, напримерТовары. - Нажмите кнопку добавления на панели дерева или клавишу
Insert. Появится новый реквизит и откроется палитра свойств.
Шаг 3. Задайте имя, синоним и тип
| Свойство | Что указать | Пример |
|---|---|---|
| Имя | Буквы, цифры и _, без пробелов, начинается с буквы | КоэффициентНаценки |
| Синоним | Заголовок колонки, который увидит пользователь | «Коэфф. наценки» |
| Тип | Число, Строка, Дата, Булево или ссылка на справочник | Число, длина 10, точность 3 |
| Проверка заполнения | «Выдавать ошибку», если колонка обязательна | — |
Для строки задавайте конкретную длину, например 150 символов. Строка неограниченной длины хранится иначе: по ней нельзя полноценно сравнивать и группировать в запросах.
Имя не должно совпадать со стандартными реквизитами табличной части. У каждой строки уже есть НомерСтроки и Ссылка — такие имена занять нельзя.
Шаг 4. Обновите конфигурацию базы данных
Нажмите F7 или выберите Конфигурация → Обновить конфигурацию базы данных. Платформа покажет список изменений: в нём будет новый реквизит. Подтвердите реструктуризацию.
Если в базе работают пользователи, платформа сообщит, что установить монопольный режим не удалось. Дождитесь, пока все выйдут, или завершите их сеансы.
Принудительное завершение сеансов обрывает работу пользователей: несохранённые документы пропадут. Предупредите коллег и выполняйте обновление в нерабочее время.
Если база подключена к хранилищу конфигурации
При групповой разработке конфигурация лежит в хранилище, и править объект без захвата нельзя.
- Откройте
Конфигурация → Хранилище конфигурации → Захватить в хранилище. - Отметьте документ. Табличная часть и её реквизиты захватываются вместе с ним. Если будете менять форму, отметьте и её.
- Добавьте реквизит и выведите его на форму, как описано выше и ниже.
- Верните объекты командой
Поместить в хранилищес комментарием, что и зачем добавлено. - Обновите конфигурацию базы данных в каждой рабочей базе, подключённой к хранилищу.
Пока документ захвачен, коллеги не смогут его изменить. Не держите захват дольше, чем нужно для доработки.
Вывод новой колонки на форму документа
После шага 4 реквизит уже есть в базе, но на форме его нет. Управляемая форма не подтягивает новые реквизиты сама.
- В дереве документа раскройте
Формыи откройте форму документа (обычноФормаДокумента). - В правой верхней части редактора формы перейдите на вкладку
Реквизиты. - Раскройте
Объект → Товары. В конце списка будет новый реквизит. - Перетащите его мышью в левую часть, на элемент таблицы
Товарыво вкладкеЭлементы. Появится новая колонка. - Перетащите колонку выше или ниже, чтобы поставить её в нужное место среди других.
Свойства колонки на форме
Выделите новое поле и откройте его свойства (Alt+Enter). Чаще всего настраивают:
- 📏 Ширина — чтобы длинная строка не растягивала таблицу.
- 🔒 Только просмотр — если колонку заполняет программа, а не пользователь.
- 🔢 Формат — например,
ЧДЦ=2для двух знаков после запятой. - 👁 Видимость — можно скрыть колонку по умолчанию и дать включить её через настройку формы.
Пересчёт при изменении значения
Если колонка участвует в расчёте, задайте обработчик события. В свойствах поля найдите группу События, у события ПриИзменении нажмите кнопку с лупой. Конфигуратор создаст процедуру в модуле формы:
&НаКлиенте
Процедура ТоварыКоэффициентНаценкиПриИзменении(Элемент)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные.Сумма = ТекущиеДанные.Цена * ТекущиеДанные.Количество
* ТекущиеДанные.КоэффициентНаценки;
КонецПроцедуры
Пример условный: в реальном документе сумма может пересчитываться общими процедурами конфигурации вместе с НДС и скидками. Вызовите их вместо прямого умножения, иначе итоги разойдутся.
Если пользователь не видит колонку после обновления, виновата его сохранённая настройка формы. Пусть нажмёт Ещё → Изменить форму → Ещё → Установить стандартные настройки.
Колонка в табличной части через расширение конфигурации
Расширение позволяет добавить колонку, не снимая типовую с поддержки. Обновления конфигурации ставятся как обычно, а доработка живёт отдельно и подключается поверх.
Расширения появились в платформе 8.3.6. Добавлять собственные реквизиты в заимствованные объекты можно только в более поздних версиях, поэтому работайте на актуальной платформе 8.3.2x.
Как это сделать
- В Конфигураторе откройте
Конфигурация → Расширения конфигурациии создайте новое расширение. - В дереве основной конфигурации найдите документ, кликните правой кнопкой по нужной табличной части и выберите
Добавить в расширение. Документ и табличная часть появятся в дереве расширения как заимствованные. - В дереве расширения выделите заимствованную табличную часть и добавьте в неё реквизит так же, как в основной конфигурации.
- Позаимствуйте форму документа тем же способом. В заимствованной форме перетащите новый реквизит из
Объект → Товарына таблицу. - Сохраните расширение и обновите конфигурацию базы данных.
Новые данные расширения хранятся в отдельных таблицах. Если расширение отключить, колонка пропадёт с формы, а её значения перестанут быть доступны до повторного подключения.
После обновления типовой
Расширение привязано к именам объектов основной конфигурации. Если в новом релизе поставщик переименует документ, табличную часть или форму, расширение перестанет применяться, и колонка исчезнет.
После каждого обновления откройте базу в режиме Предприятия и проверьте форму документа. Если расширение не подключилось, платформа покажет сообщение о причине при запуске или в списке расширений. Исправьте заимствование под новое имя объекта и обновите базу ещё раз.
Когда что выбрать
| Способ | Когда подходит | Чем рискуете |
|---|---|---|
| Реквизит в основной конфигурации | Своя конфигурация или уже снятая с поддержки | Усложняется обновление типовой |
| Реквизит в расширении | Типовая на поддержке, доработок немного | Расширение надо проверять после каждого обновления |
| Колонка только на форме (кодом) | Нужен вывод расчётных данных без хранения | Значения не сохраняются в документе |
| Настройка формы пользователем | Реквизит уже есть, просто скрыт | Никакого, это личная настройка |
Программное добавление колонки через код
Сразу важная граница: кодом нельзя создать реквизит в метаданных. Структура базы меняется только в Конфигураторе или через расширение. Программно добавляют колонки на форму и в таблицы значений.
Поле на форме для существующего реквизита
Пригодится в расширении, когда не хочется менять заимствованную форму в редакторе. Поле создаётся при открытии формы:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
НовоеПоле = Элементы.Добавить("ТоварыКоэффициентНаценки", Тип("ПолеФормы"), Элементы.Товары);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Объект.Товары.КоэффициентНаценки";
НовоеПоле.Заголовок = "Коэфф. наценки";
КонецПроцедуры
Аннотация &После выполняет процедуру после типового обработчика. В основной конфигурации тот же код пишут прямо в ПриСозданииНаСервере, без аннотации.
Колонка в таблице значений на форме
Для обработок и отчётов, где таблица — реквизит формы типа ТаблицаЗначений, колонку можно создать на лету:
&НаСервере
Процедура ДобавитьКолонкуПримечание()
Добавляемые = Новый Массив;
Добавляемые.Добавить(Новый РеквизитФормы("Примечание",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)),
"ТаблицаДанных", "Примечание"));
ИзменитьРеквизиты(Добавляемые);
Поле = Элементы.Добавить("ТаблицаДанныхПримечание", Тип("ПолеФормы"), Элементы.ТаблицаДанных);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "ТаблицаДанных.Примечание";
КонецПроцедуры
Третий параметр "ТаблицаДанных" — путь к реквизиту, внутри которого появится колонка. Для обычной таблицы значений в коде без формы достаточно ТЗ.Колонки.Добавить("Примечание", Новый ОписаниеТипов("Строка")).
Заполнение колонки в уже созданных документах
В старых документах новая колонка пустая: 0 для чисел, пустая строка, пустая ссылка. Если нужно значение по умолчанию, пройдите документы обработкой:
&НаСервере
Процедура ЗаполнитьКоэффициентВСтарыхДокументах()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК Док
|ГДЕ
| Док.Дата >= &НачалоПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДатаСеанса()));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
Если СтрокаТЧ.КоэффициентНаценки = 0 Тогда
СтрокаТЧ.КоэффициентНаценки = 1;
КонецЕсли;
КонецЦикла;
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.Записать();
КонецЦикла;
КонецПроцедуры
ОбменДанными.Загрузка = Истина записывает документ без проверок и обработчиков. Движения при этом не перепроводятся, поэтому учёт не меняется. Перед запуском на рабочей базе проверьте обработку на копии.
Ошибки после добавления колонки и как их убрать
ВЫРАЗИТЬ(Поле КАК СТРОКА(150)).