Работа с табличными частями в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как обычные пользователи, так и разработчики. Добавление новой строки кажется простой операцией, но на практике может вызвать сложности: от банального "не нажимается кнопка" до ошибок при программном заполнении. Эта инструкция покрывает все актуальные способы добавления строк — от ручного ввода через интерфейс до автоматизации через встроенный язык 1С 8.3.

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

Если вы ищете решение для конкретной конфигурации (например, 1С:Бухгалтерия 3.0, 1С:УТ 11 или 1С:ЗУП 3.1), принципы остаются теми же, но могут отличаться детали интерфейса. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.22, но подходят и для более ранних версий (начиная с 8.2).

1. Добавление строки в табличную часть через интерфейс пользователя

Самый простой способ — использовать стандартные кнопки формы. Этот метод подходит для всех типов табличных частей: в документах, справочниках, обработках и отчётах. Рассмотрим пошаговую инструкцию на примере документа "Поступление товаров" в конфигурации 1С:Управление торговлей 11.

Чтобы добавить строку:

  • 📄 Откройте документ (например, Поступление товаров и услуг) и перейдите на вкладку с табличной частью (обычно Товары или Услуги).
  • ➕ Нажмите кнопку Добавить (значок плюса) на панели инструментов табличной части. В некоторых формах кнопка может называться Создать строку.
  • 🔍 Если кнопка неактивна, проверьте:
    • 🔹 Права пользователя на редактирование документа.
    • 🔹 Статус документа (не проводён ли он).
    • 🔹 Наличие обязательных реквизитов в шапке (например, Контрагент или Склад).
  • 📝 Заполните поля новой строки. Обратите внимание, что некоторые колонки (например, Номенклатура) могут иметь подбор (F4 или кнопка с лупой).
⚠️ Внимание: В управляемых формах кнопка Добавить может быть скрыта, если табличная часть настроена как Только просмотр или если документ находится в режиме Просмотр (не редактирование). Чтобы вернуть кнопку, нажмите Изменить в командной панели документа.

Открыт ли документ в режиме редактирования?

Есть ли права на изменение?

Заполнены ли обязательные реквизиты шапки?

Активна ли кнопка "Добавить"?

-->

Если кнопка Добавить отсутствует вовсе, это может означать, что:

  • 🔧 Табличная часть заблокирована на уровне конфигурации (проверьте свойства объекта в Конфигураторе).
  • 🖥️ Используется тонкий клиент или веб-клиент с ограниченным функционалом.
  • 📋 Документ имеет статус "Удален" или "Помечен на удаление".

2. Программное добавление строки через встроенный язык 1С

Для автоматизации или массового добавления строк используется встроенный язык . Основной метод — Добавить(), но есть нюансы в зависимости от типа формы и контекста выполнения.

Базовый синтаксис для управляемых форм:

// Получаем табличную часть документа

ТабличнаяЧасть = Объект.Товары;

// Добавляем новую строку

НоваяСтрока = ТабличнаяЧасть.Добавить();

// Заполняем реквизиты строки

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор 24\"");

НоваяСтрока.Количество = 5;

НоваяСтрока.Цена = 15000;

Для обычных форм (устаревший вариант, но ещё встречается в старых конфигурациях):

ТабличнаяЧасть = Объект.Товары;

НоваяСтрока = ТабличнаяЧасть.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Клавиатура");

НоваяСтрока.Количество = 10;

Ключевые отличия:

Параметр Управляемые формы Обычные формы
Контекст выполнения Клиент или сервер (зависит от места вызова) Только клиент
Метод добавления ТабличнаяЧасть.Добавить() ТабличнаяЧасть.Добавить()
Обращение к строке Через переменную (НоваяСтрока.Реквизит) Через индекс (ТабличнаяЧасть[0].Реквизит)
Производительность Выше при серверном выполнении Ниже (клиентское выполнение)
⚠️ Внимание: При программном добавлении строк в серверных процедурах (например, в модуле объекта) не забывайте про Записать() или Провести() после изменения табличной части. Иначе изменения не сохранятся в базе данных!
💡

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

3. Добавление строки с копированием данных из другой строки

Частая задача — дублирование строки с небольшими изменениями. Например, в документе "Заказ клиента" может потребоваться скопировать позицию номенклатуры с другим количеством.

Алгоритм:

  1. Получите ссылку на исходную строку.
  2. Создайте новую строку методом Добавить().
  3. Скопируйте данные из исходной строки в новую.
  4. Измените необходимые реквизиты (например, Количество).

Пример кода:

// Получаем табличную часть

ТабличнаяЧасть = Объект.Товары;

// Копируем первую строку

ИсходнаяСтрока = ТабличнаяЧасть[0];

НоваяСтрока = ТабличнаяЧасть.Добавить();

// Копируем все реквизиты

НоваяСтрока.Номенклатура = ИсходнаяСтрока.Номенклатура;

НоваяСтрока.Цена = ИсходнаяСтрока.Цена;

НоваяСтрока.Склад = ИсходнаяСтрока.Склад;

// Меняем количество

НоваяСтрока.Количество = ИсходнаяСтрока.Количество * 2;

Для удобства можно написать универсальную функцию копирования:

Функция КопироватьСтрокуТабличнойЧасти(ТабличнаяЧасть, ИндексСтроки)

ИсходнаяСтрока = ТабличнаяЧасть[ИндексСтроки];

НоваяСтрока = ТабличнаяЧасть.Добавить();

// Копируем все реквизиты кроме системных

Для Каждого Реквизит Из Метаданные.Реквизиты(ТабличнаяЧасть) Цикл

Если НЕ Реквизит.Системное Тогда

НоваяСтрока[Реквизит.Имя] = ИсходнаяСтрока[Реквизит.Имя];

КонецЕсли;

КонецЦикла;

Возврат НоваяСтрока;

КонецФункции

Как скопировать строку с формулами?

Если в табличной части есть вычисляемые поля (например, Сумма = Количество * Цена), их не нужно копировать вручную — они пересчитаются автоматически после изменения базовых реквизитов (например, Количество). Однако если формула сложная и зависит от других строк, может потребоваться вызов метода ПересчитатьИтоги() после копирования.

4. Массовое добавление строк: оптимизация производительности

При добавлении большого количества строк (например, при загрузке данных из Excel или XML) важно учитывать производительность. Неоптимизированный код может работать в десятки раз медленнее.

Основные правила оптимизации:

  • 🚀 Отключите контроль транзакций на время массового добавления:
    НачатьТранзакцию();
    

    Попытка

    // Код добавления строк

    ЗафиксироватьТранзакцию();

    Исключение

    ОтменитьТранзакцию();

    ВызватьИсключение;

    КонецПопытки;

  • 🔄 Минимизируйте обращения к базе: загружайте справочники (например, Номенклатуру) заранее в коллекции.
  • 📊 Используйте серверные процедуры: клиентский код работает медленнее.
  • 🔄 Отключите автоматический пересчёт итогов:
    ТабличнаяЧасть.ОтключитьПересчетИтогов();
    

    // Добавляем строки

    ТабличнаяЧасть.ВключитьПересчетИтогов();

Пример оптимизированного кода для добавления 1000 строк:

Процедура МассовоеДобавлениеСтрок()

// Загружаем номенклатуру заранее

СписокНоменклатуры = Новый Массив;

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

СписокНоменклатуры.Добавить(Результат.Ссылка);

КонецЦикла;

// Отключаем пересчёт итогов

Объект.Товары.ОтключитьПересчетИтогов();

НачатьТранзакцию();

Попытка

Для Сч = 1 По 1000 Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = СписокНоменклатуры[Сч % 100]; // Циклично используем 100 позиций

НоваяСтрока.Количество = 1;

НоваяСтрока.Цена = 100 * Сч;

КонецЦикла;

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение;

КонецПопытки;

Объект.Товары.ВключитьПересчетИтогов();

Объект.Записать();

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

⚠️ Внимание: При массовом добавлении строк в управляемых формах может возникнуть ошибка "Превышен лимит памяти". В этом случае разбейте операцию на пакеты по 100–200 строк и фиксируйте транзакции по частям.

Через интерфейс (кнопка "Добавить")|Программно (встроенный язык)|Массовая загрузка из Excel/XML|Другой вариант-->

5. Типичные ошибки и их решения

Даже опытные пользователи и разработчики сталкиваются с ошибками при работе с табличными частями. Рассмотрим самые распространённые проблемы и способы их устранения.

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

Особое внимание заслуживает ошибка "Объект не найден (ТабличнаяЧасть)". Она возникает, если:

  • 🔹 Вы обращаетесь к табличной части до её инициализации (например, в конструкторе формы).
  • 🔹 Имя табличной части указано неверно (проверьте регистр и синтаксис).
  • 🔹 Табличная часть динамическая и не создана (например, в обработках с условным формированием таблиц).
💡

Всегда проверяйте существование табличной части перед работой с ней. Используйте конструкцию Если НЕ ТабличнаяЧасть = Неопределено Тогда.

6. Работа с табличными частями в мобильном приложении 1С

В 1С:Мобильная платформа добавление строк в табличные части имеет свои особенности из-за ограничений интерфейса и производительности устройств. Основные отличия:

Способы добавления:

  • 📱 Через интерфейс: в мобильном клиенте кнопка Добавить обычно скрыта за длинным тапом или вынесена в меню ().
  • 🤖 Голосовой ввод: в некоторых конфигурациях поддерживается добавление строк через голосовые команды (например, "Добавить строку: Монитор, 2 штуки").
  • 🔄 Шаблоны строк: для ускорения ввода часто используются заранее сохранённые шаблоны (например, "Набор канцтоваров").

Пример кода для мобильного клиента (с учётом ограничений):

Процедура ДобавитьСтрокуНаМобильномУстройстве()

// Проверяем поддержку функций

Если НЕ МобильноеПриложениеКлиент.Функциональность().ТабличныеЧасти Тогда

Предупреждение("Добавление строк не поддерживается в этой версии приложения");

Возврат;

КонецЕсли;

// Добавляем строку с минимальным набором данных

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();

НоваяСтрока.Количество = 1;

// Открываем форму редактирования строки (опционально)

ПараметрыФормы = Новый Структура("Объект, ТекущаяСтрока", Объект, НоваяСтрока);

ОткрытьФорму("Документ.ПоступлениеТоваров.Форма.ФормаСтроки", ПараметрыФормы);

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

⚠️ Внимание: В мобильных приложениях некоторые реквизиты табличных частей могут быть скрыты для экономии места на экране. Чтобы их отобразить, используйте горизонтальную прокрутку или настройте отображение в конфигураторе (раздел Мобильное приложение → Настройки интерфейса).

Ограничения мобильной платформы:

  • 🚫 Нет поддержки динамических табличных частей (колонки фиксированы).
  • 📵 Офлайн-режим: добавленные строки синхронизируются с сервером только при подключении.
  • Производительность: при добавлении более 50 строк рекомендуется использовать пакетную обработку.

7. Альтернативные способы: обмен данными и внешние обработки

Иногда добавление строк в табличную часть удобнее выполнять через внешние инструменты:

Способы импорта данных:

  • 📑 Загрузка из Excel: с помощью обработки "Универсальный обмен данными" или "Загрузка данных из табличного документа".
  • 🔄 Обмен через XML/JSON: для интеграции с другими системами (например, CRM или WMS).
  • 🖥️ COM-соединение: автоматизация через VBA или Python (например, для массового создания документов).
  • 🔌 REST API: в современных конфигурациях (например, 1С:ERP) поддерживается добавление строк через HTTP-запросы.

Пример загрузки из Excel с помощью встроенной обработки:

  1. Откройте обработку ЗагрузкаДанныхИзТабличногоДокумента.epf (поставляется с платформой).
  2. Выберите файл Excel и лист с данными.
  3. Сопоставьте колонки файла с реквизитами табличной части.
  4. Запустите загрузку. Обработка автоматически добавит строки в документ.

Для программистов полезен пример обмена через JSON:

// Пример структуры JSON для добавления строк в табличную часть "Товары"

{

"Документ": "ПоступлениеТоваров123",

"ТабличнаяЧасть": "Товары",

"Строки": [

{

"Номенклатура": {"Ссылка": "Справочник.Номенклатура.Key1"},

"Количество": 5,

"Цена": 1000

},

{

"Номенклатура": {"Ссылка": "Справочник.Номенклатура.Key2"},

"Количество": 3,

"Цена": 2000

}

]

}

// Код обработки JSON на сервере 1С

Процедура ОбработатьJSON(ДанныеJSON) Экспорт

Данные = JSON.Прочитать(ДанныеJSON);

Документ = Данные.Документ.Получить();

ТабличнаяЧасть = Документ[Данные.ТабличнаяЧасть];

Для Каждого СтрокаДанных Из Данные.Строки Цикл

НоваяСтрока = ТабличнаяЧасть.Добавить();

НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура.Ссылка.Получить();

НоваяСтрока.Количество = СтрокаДанных.Количество;

НоваяСтрока.Цена = СтрокаДанных.Цена;

КонецЦикла;

Документ.Записать();

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

⚠️ Внимание: При загрузке данных из внешних источников всегда проверяйте уникальность строк (например, по сочетанию Номенклатура + Характеристика). Иначе могут возникнуть дубли, которые приведут к ошибкам при проведении документа.

FAQ: Частые вопросы по работе с табличными частями

Как добавить строку в табличную часть, если кнопка "Добавить" отсутствует?

Причины отсутствия кнопки:

  • Документ проведён или заблокирован. Решение: сделайте его непроводённым (Объект.СделатьНеПроведенным()).
  • Отсутствуют права. Решение: проверьте роль пользователя в Администрирование → Пользователи.
  • Табличная часть скрыта или отключена в конфигураторе. Решение: откройте объект в конфигураторе и проверьте свойство Видимость.

Если кнопка скрыта программно, можно добавить строку через код (см. раздел 2).

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

Да, но с оговорками:

  • В регистрах накопления строки добавляются не напрямую, а через документы-регистраторы (например, "Поступление товаров").
  • Для регистров сведений можно использовать метод Записать() с указанием измерений и ресурсов.
  • Пример для регистра сведений:
    Регистр = РегистрыСведений.ЦеныНоменклатуры;
    

    НоваяЗапись = Регистр.СоздатьМенеджерЗаписи();

    НоваяЗапись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор");

    НоваяЗапись.Цена = 15000;

    НоваяЗапись.Записать();

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

Используйте следующий алгоритм:

  1. Получите табличные части обоих документов.
  2. Очистите целевую табличную часть (ЦелеваяТаблица.Очистить()).
  3. Пройдите по строкам исходной таблицы и скопируйте их в целевую:
    Для Каждого Строка Из Источник.Товары Цикл
    

    НоваяСтрока = ЦелеваяТаблица.Добавить();

    НоваяСтрока.Номенклатура = Строка.Номенклатура;

    НоваяСтрока.Количество = Строка.Количество;

    // Копируем другие реквизиты

    КонецЦикла;

Для оптимизации используйте ЗагрузитьКолонку() и ВыгрузитьКолонку().

Почему при добавлении строки вылетает ошибка "Объект заблокирован"?

Эта ошибка возникает, если:

  • Документ проводится другим пользователем (проверьте в Активные пользователи).
  • Включён режим эксклюзивной блокировки (например, при регламентных заданиях).
  • Табличная часть изменяется в другом сеансе (например, через RGS или COM-соединение).

Решения:

  • Дождитесь завершения операции другим пользователем.
  • Используйте ПовторитьAttempt для повторной попытки через 5–10 секунд.
  • Проверьте настройки блокировок в Администрирование → Настройки программы → Блокировки.
Как добавить строку в динамическую табличную часть?

Динамические табличные части (создаваемые в модуле формы) требуют особого подхода:

  1. Получите коллекцию строк через ЭлементыФормы.ИмяТаблицы.
  2. Добавьте новую строку:
    НоваяСтрока = ЭлементыФормы.Товары.Добавить();
    

    НоваяСтрока.Номенклатура = ...;

  3. Обновите форму:
    ЭлементыФормы.Товары.Обновить();

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