Разработка и Конфигурация · 10 мин
Как добавить элемент в табличную часть справочника 1С
Программное и интерактивное добавление строк в табличную часть справочника 1С: методы Добавить, Записать, работа с объектом и формой, типичные ошибки и проверка результата.
Табличная часть справочника в 1С — это коллекция строк, привязанная к элементу справочника: например, состав набора у номенклатуры, контактные телефоны у контрагента или график работы у подразделения. Добавить строку в табличную часть можно двумя путями: интерактивно через форму элемента или программно через встроенный язык. Оба способа описаны ниже с примерами кода для управляемых и обычных форм.
Ключевой принцип, который нужно понять сразу: табличная часть не существует отдельно от элемента справочника. Строка «живёт» внутри объекта, поэтому любое программное изменение требует получения объекта, добавления строки и последующей записи объекта целиком. Если записать объект забыть, изменения останутся только в памяти и потеряются.
Что такое табличная часть справочника и когда она нужна
Табличная часть — это подчинённый набор данных с фиксированным набором колонок (реквизитов), которые задаются в конфигураторе. Типовые примеры из стандартных конфигураций: табличная часть «Дополнительные реквизиты» почти во всех справочниках, «Состав набора» у номенклатуры в УТ, «Контактная информация» у контрагентов, «Этапы производства» в спецификациях.
Важно отличать табличную часть от регистра сведений. Если данные должны храниться с отбором по нескольким измерениям, меняться независимо от элемента или использоваться в запросах без чтения всего объекта — правильнее регистр сведений. Табличная часть оправдана, когда строки логически неотделимы от элемента и редактируются всегда вместе с ним.
Интерактивное добавление строки через форму элемента
В пользовательском режиме достаточно открыть нужный элемент справочника двойным щелчком. Табличная часть обычно расположена на отдельной вкладке формы или в нижней её части. Над таблицей находится командная панель с кнопками «Добавить», «Скопировать», «Удалить», а иногда «Подбор» и «Заполнить».
Нажатие «Добавить» создаёт пустую строку, курсор встаёт в первое редактируемое поле. Заполните обязательные колонки — они обычно отмечены красным подчёркиванием пустого значения — и нажмите «Записать» или «Записать и закрыть». Пока элемент не записан, новая строка существует только в открытой форме.
Если кнопка «Добавить» недоступна (серая), проверьте права доступа пользователя к справочнику и не открыта ли форма в режиме просмотра. Также в некоторых конфигурациях табличная часть заполняется только автоматически — тогда редактирование заблокировано настройками формы, и менять данные нужно через предусмотренный механизм (обработку, документ или команду «Заполнить»).
Программное добавление: базовый сценарий на сервере
Стандартная последовательность на сервере состоит из четырёх шагов: получить объект по ссылке, добавить строку в табличную часть, заполнить её реквизиты, записать объект. Пример для справочника «Номенклатура» с табличной частью «ДополнительныеРеквизиты»:
Объект = СсылкаНаЭлемент.ПолучитьОбъект();НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();НоваяСтрока.Свойство = НужноеСвойство;НоваяСтрока.Значение = НужноеЗначение;Объект.Записать();
Метод Добавить() возвращает новую строку, через которую сразу доступны все реквизиты табличной части. Обращаться к колонкам можно по имени, как в примере. Если табличная часть содержит числовые или булевы реквизиты, незаполненные поля получат значения по умолчанию (ноль, Ложь, пустая ссылка).
После Записать() изменения фиксируются в базе. До записи можно добавить сколько угодно строк — они сохранятся одним вызовом. Это важно для производительности при массовом заполнении: не записывайте объект после каждой строки в цикле.
- 1Получите объект элемента: Объект = Ссылка.ПолучитьОбъект()
- 2Добавьте строку: Строка = Объект.ИмяТабличнойЧасти.Добавить()
- 3Заполните реквизиты строки по именам колонок
- 4Вызовите Объект.Записать() один раз после добавления всех строк
- 5Проверьте результат, открыв элемент в пользовательском режиме
Добавление строки из формы элемента
Управляемая форма
В управляемой форме табличная часть доступна через свойство Объект формы: Объект.ИмяТабличнойЧасти.Добавить(). Если код выполняется в модуле формы, объект записывать не нужно — пользователь сам решит, сохранять изменения или нет. Достаточно установить признак модифицированности, чтобы форма предложила запись при закрытии.
Чтобы пользователь увидел новую строку и она получила фокус, после добавления установите текущую строку таблицы: Элементы.ИмяТаблицы.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();. Это особенно удобно в командах «Заполнить по шаблону» — пользователь сразу видит добавленное.
Обычная форма
В обычных формах (режим совместимости) доступ тот же, но табличное поле обновляется автоматически при изменении данных. Метод Добавить() работает идентично, а для позиционирования используется ЭлементыФормы.ИмяТаблицы.ТекущаяСтрока = НоваяСтрока;.
Массовое добавление и заполнение из других данных
Частая задача — заполнить табличную часть по данным запроса, таблицы значений или другого объекта. Паттерн одинаковый: цикл по источнику, внутри — Добавить() и присвоение реквизитов. Для таблиц значений удобно использовать ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника), если имена колонок совпадают.
Пример заполнения из таблицы значений:
Для Каждого СтрокаИсточника Из ТаблицаДанных Цикл НоваяСтрока = Объект.Состав.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);КонецЦикла;Объект.Записать();
Перед массовым заполнением решите, нужно ли очищать существующие строки. Метод Объект.Состав.Очистить() удаляет все строки табличной части. Если требуется дописать новые строки к существующим без дублей, проверяйте наличие через Найти() или НайтиСтроки() с отбором по ключевым колонкам.
Работа в транзакции и обмен данными
Если добавление строк — часть более крупной операции (например, синхронизации с внешней системой), оборачивайте запись в транзакцию: НачатьТранзакцию() … ЗафиксироватьТранзакцию() с обработкой исключения через ОтменитьТранзакцию(). Тогда при ошибке в середине цикла база не останется в частично изменённом состоянии.
При загрузке через планы обмена или фоновые задания полезно установить Объект.ОбменДанными.Загрузка = Истина; перед записью — это отключает бизнес-логику проверок и ускоряет запись. Но используйте режим осознанно: контроль заполнения и обработчики событий не сработают, и ответственность за корректность данных ложится на ваш код.
Проверка результата и контроль корректности
После записи убедитесь, что строки действительно сохранились. Самый простой способ — открыть элемент справочника в пользовательском режиме и посмотреть табличную часть. Программно проверка выполняется запросом к табличной части: у табличных частей справочников есть виртуальные таблицы вида Справочник.Номенклатура.ДополнительныеРеквизиты, к которым можно обращаться в запросах.
Полезные контрольные точки: количество строк после записи совпадает с ожидаемым (Объект.Состав.Количество()), обязательные колонки заполнены, нет нежелательных дублей. Для проверки заполнения перед записью можно вызвать Объект.ПроверитьЗаполнение() — метод вернёт Ложь и выведет сообщения, если конфигурация требует обязательных данных.
Как проверить результат
Совпадает с числом добавленных строк
Строк меньше — часть не записалась или была удалена обработчиками
ПроверитьЗаполнение() возвращает Истина
Сообщения о незаполненных реквизитах при записи
НайтиСтроки() по ключевому отбору возвращает одну строку
Несколько одинаковых строк после повторного запуска обработки
Частые вопросы
Можно ли добавить строку в табличную часть, не записывая элемент?
Программно — нет, изменения фиксируются только методом Записать(). В открытой форме строка существует в памяти до записи или закрытия формы без сохранения. Если нужно подготовить данные без записи, работайте с объектом, но не вызывайте Записать() — однако при завершении сеанса изменения пропадут.
Как добавить строку в конкретную позицию, а не в конец?
Используйте метод Вставить(Индекс) вместо Добавить(): он создаёт строку в указанной позиции, сдвигая остальные вниз. Индексация начинается с нуля. Также доступны методы Сдвинуть() для перемещения существующих строк.
Почему возникает ошибка «Поле объекта недоступно для записи»?
Чаще всего код обращается к ссылке, а не к объекту: у ссылки табличная часть доступна только для чтения. Вызовите Ссылка.ПолучитьОбъект() и работайте с полученным объектом. Вторая причина — попытка изменить данные в клиентской процедуре управляемой формы через серверные методы.
Как удалить все строки табличной части перед заполнением?
Вызовите метод Очистить(): Объект.ИмяТабличнойЧасти.Очистить(). Для удаления отдельных строк используйте Удалить(Строка) или Удалить(Индекс). После любых удалений не забудьте записать объект.
Можно ли заполнить табличную часть запросом напрямую?
Запросом изменить данные нельзя — он только читает. Но можно выполнить запрос к источнику данных, обойти результат в цикле и добавить строки методом Добавить(). Для чтения самой табличной части в запросах используется таблица вида Справочник.Имя.ИмяТабличнойЧасти.
Что делать, если табличной части нет на форме элемента?
Проверьте в конфигураторе, существует ли табличная часть у объекта и выведена ли она на форму. В типовых конфигурациях часть вкладок может скрываться функциональными опциями — включите соответствующую опцию в настройках программы. Если табличную часть добавили в расширении, убедитесь, что расширение подключено и форма обновлена.
Что важно запомнить
Строка добавляется методом Добавить() у табличной части объекта, а не ссылки. Изменения сохраняются только после Записать(). При массовом заполнении записывайте объект один раз, очищайте старые строки осознанно и проверяйте результат по количеству строк и обязательным колонкам.