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