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

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

Как добавить элемент в табличную часть справочника 1С

Программное и интерактивное добавление строк в табличную часть справочника 1С: методы Добавить, Записать, работа с объектом и формой, типичные ошибки и проверка результата.

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

Ключевой принцип, который нужно понять сразу: табличная часть не существует отдельно от элемента справочника. Строка «живёт» внутри объекта, поэтому любое программное изменение требует получения объекта, добавления строки и последующей записи объекта целиком. Если записать объект забыть, изменения останутся только в памяти и потеряются.

Что такое табличная часть справочника и когда она нужна

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

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

Интерактивное добавление строки через форму элемента

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

Нажатие «Добавить» создаёт пустую строку, курсор встаёт в первое редактируемое поле. Заполните обязательные колонки — они обычно отмечены красным подчёркиванием пустого значения — и нажмите «Записать» или «Записать и закрыть». Пока элемент не записан, новая строка существует только в открытой форме.

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

Программное добавление: базовый сценарий на сервере

Стандартная последовательность на сервере состоит из четырёх шагов: получить объект по ссылке, добавить строку в табличную часть, заполнить её реквизиты, записать объект. Пример для справочника «Номенклатура» с табличной частью «ДополнительныеРеквизиты»:

Объект = СсылкаНаЭлемент.ПолучитьОбъект();
НоваяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = НужноеСвойство;
НоваяСтрока.Значение = НужноеЗначение;
Объект.Записать();

Метод Добавить() возвращает новую строку, через которую сразу доступны все реквизиты табличной части. Обращаться к колонкам можно по имени, как в примере. Если табличная часть содержит числовые или булевы реквизиты, незаполненные поля получат значения по умолчанию (ноль, Ложь, пустая ссылка).

После Записать() изменения фиксируются в базе. До записи можно добавить сколько угодно строк — они сохранятся одним вызовом. Это важно для производительности при массовом заполнении: не записывайте объект после каждой строки в цикле.

Порядок действий
  1. 1
    Получите объект элемента: Объект = Ссылка.ПолучитьОбъект()
  2. 2
    Добавьте строку: Строка = Объект.ИмяТабличнойЧасти.Добавить()
  3. 3
    Заполните реквизиты строки по именам колонок
  4. 4
    Вызовите Объект.Записать() один раз после добавления всех строк
  5. 5
    Проверьте результат, открыв элемент в пользовательском режиме

Добавление строки из формы элемента

Управляемая форма

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

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

Обычная форма

В обычных формах (режим совместимости) доступ тот же, но табличное поле обновляется автоматически при изменении данных. Метод Добавить() работает идентично, а для позиционирования используется ЭлементыФормы.ИмяТаблицы.ТекущаяСтрока = НоваяСтрока;.

Массовое добавление и заполнение из других данных

Частая задача — заполнить табличную часть по данным запроса, таблицы значений или другого объекта. Паттерн одинаковый: цикл по источнику, внутри — Добавить() и присвоение реквизитов. Для таблиц значений удобно использовать ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника), если имена колонок совпадают.

Пример заполнения из таблицы значений:

Для Каждого СтрокаИсточника Из ТаблицаДанных Цикл
  НоваяСтрока = Объект.Состав.Добавить();
  ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
КонецЦикла;
Объект.Записать();

Перед массовым заполнением решите, нужно ли очищать существующие строки. Метод Объект.Состав.Очистить() удаляет все строки табличной части. Если требуется дописать новые строки к существующим без дублей, проверяйте наличие через Найти() или НайтиСтроки() с отбором по ключевым колонкам.

Типичные ошибки
01
Вызов Добавить() у ссылки вместо объекта — у ссылки табличная часть доступна только для чтения, попытка изменить вызовет ошибку
02
Запись объекта внутри цикла добавления строк — резкое падение производительности при массовом заполнении
03
Отсутствие Записать() после добавления — строки теряются при закрытии сеанса
04
Обращение к реквизиту строки по несуществующему имени колонки — ошибка выполнения, проверяйте имена в конфигураторе

Работа в транзакции и обмен данными

Если добавление строк — часть более крупной операции (например, синхронизации с внешней системой), оборачивайте запись в транзакцию: НачатьТранзакцию() … ЗафиксироватьТранзакцию() с обработкой исключения через ОтменитьТранзакцию(). Тогда при ошибке в середине цикла база не останется в частично изменённом состоянии.

При загрузке через планы обмена или фоновые задания полезно установить Объект.ОбменДанными.Загрузка = Истина; перед записью — это отключает бизнес-логику проверок и ускоряет запись. Но используйте режим осознанно: контроль заполнения и обработчики событий не сработают, и ответственность за корректность данных ложится на ваш код.

Проверка результата и контроль корректности

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

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

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

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

Количество строк в табличной части
Норма

Совпадает с числом добавленных строк

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

Строк меньше — часть не записалась или была удалена обработчиками

Заполнение обязательных колонок
Норма

ПроверитьЗаполнение() возвращает Истина

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

Сообщения о незаполненных реквизитах при записи

Отсутствие дублей
Норма

НайтиСтроки() по ключевому отбору возвращает одну строку

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

Несколько одинаковых строк после повторного запуска обработки

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

Можно ли добавить строку в табличную часть, не записывая элемент?

Программно — нет, изменения фиксируются только методом Записать(). В открытой форме строка существует в памяти до записи или закрытия формы без сохранения. Если нужно подготовить данные без записи, работайте с объектом, но не вызывайте Записать() — однако при завершении сеанса изменения пропадут.

Как добавить строку в конкретную позицию, а не в конец?

Используйте метод Вставить(Индекс) вместо Добавить(): он создаёт строку в указанной позиции, сдвигая остальные вниз. Индексация начинается с нуля. Также доступны методы Сдвинуть() для перемещения существующих строк.

Почему возникает ошибка «Поле объекта недоступно для записи»?

Чаще всего код обращается к ссылке, а не к объекту: у ссылки табличная часть доступна только для чтения. Вызовите Ссылка.ПолучитьОбъект() и работайте с полученным объектом. Вторая причина — попытка изменить данные в клиентской процедуре управляемой формы через серверные методы.

Как удалить все строки табличной части перед заполнением?

Вызовите метод Очистить(): Объект.ИмяТабличнойЧасти.Очистить(). Для удаления отдельных строк используйте Удалить(Строка) или Удалить(Индекс). После любых удалений не забудьте записать объект.

Можно ли заполнить табличную часть запросом напрямую?

Запросом изменить данные нельзя — он только читает. Но можно выполнить запрос к источнику данных, обойти результат в цикле и добавить строки методом Добавить(). Для чтения самой табличной части в запросах используется таблица вида Справочник.Имя.ИмяТабличнойЧасти.

Что делать, если табличной части нет на форме элемента?

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

Итог

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

Строка добавляется методом Добавить() у табличной части объекта, а не ссылки. Изменения сохраняются только после Записать(). При массовом заполнении записывайте объект один раз, очищайте старые строки осознанно и проверяйте результат по количеству строк и обязательным колонкам.