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

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

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

1. Что такое табличная часть в 1С и где она используется

Табличная часть — это структурный элемент объекта метаданных (справочника, документа, плана обмена и др.), который позволяет хранить набор однотипных данных в виде строк. Каждая строка табличной части представляет собой запись с фиксированным набором реквизитов (колонок). Например, в документе РеализацияТоваровУслуг табличная часть Товары содержит информацию о номенклатуре, количестве, цене и сумме по каждой позиции.

Основные объекты, где применяются табличные части:

  • 📄 Документы — товары в накладных, услуги в актах, материалы в требованиях.
  • 📚 Справочники — например, список контактных лиц в справочнике Контрагенты или адреса доставки.
  • 📊 Регистры сведений — для хранения истории изменений (например, курсы валют).
  • 🔄 Планы обмена — правила преобразования данных при обмене между базами.

Отличие табличной части от отдельного справочника или регистра заключается в том, что она всегда привязана к родительскому объекту. Например, строки табличной части Товары не могут существовать отдельно от документа ПоступлениеТоваров. Это обеспечивает целостность данных, но накладывает ограничения на манипуляции — например, нельзя просто так перенести строку из одного документа в другой.

📊 С какой табличной частью вы работаете чаще всего?
Товары в документах
Контактные лица в справочниках
Строки в регистрах сведений
Другое

2. Ручная запись данных через интерфейс 1С

Самый простой способ добавить строку в табличную часть — использовать стандартные формы ввода. Рассмотрим процесс на примере документа РеализацияТоваровУслуг в конфигурации Управление торговлей 11:

  1. Откройте документ (создайте новый или выберите существующий).
  2. Перейдите на закладку с табличной частью (например, Товары).
  3. Нажмите кнопку Добавить (или Insert на клавиатуре).
  4. Заполните реквизиты строки: выберите номенклатуру из справочника, укажите количество, цену и т.д.
  5. Сохраните документ кнопкой Записать или ОК.

В некоторых конфигурациях (например, Бухгалтерия предприятия 3.0) для ускорения ввода предусмотрены механизмы подбора:

  • 🔍 Подбор из справочника — кнопка Подбор открывает форму со списком номенклатуры, где можно отфильтровать товары по группам, остаткам или другим критериям.
  • 📑 Копирование строк — кнопка Скопировать строку дублирует текущую строку с сохранением всех реквизитов.
  • 🔄 Заполнение по остаткам — автоматически добавляет строки на основе доступного количества товара на складе.
💡

Если в табличной части много колонок, но вам нужны только несколько, настройте видимость реквизитов через меню Ещё → Настроить список. Это ускорит работу и снизит риск ошибок при заполнении.

Обратите внимание на особенности ручного ввода:

  • При добавлении строки в документ она не сохраняется в базе до тех пор, пока вы не нажмете Записать или Провести.
  • В некоторых конфигурациях (например, ЗУП 3.1) табличные части могут иметь иерархическую структуру — например, строки с начислениями и удержаниями в документе Начисление зарплаты.
  • Если табличная часть привязана к регистру (например, Товары в документе Инвентаризация), изменения могут автоматически отражаться в регистрах накопления.

3. Программная запись в табличную часть на встроенном языке

Для автоматизации или массового заполнения табличных частей используется встроенный язык . Основные методы работы:

3.1. Добавление новой строки

Чтобы добавить строку в табличную часть документа или справочника, используйте метод Добавить():

// Пример для документа "ПоступлениеТоваровУслуг"

Док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();

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

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

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

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

НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

Важные нюансы:

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

3.2. Изменение существующей строки

Чтобы редактировать строку, сначала нужно получить к ней доступ по индексу или условию:

// Изменяем первую строку в табличной части

ПерваяСтрока = Док.Товары[0];

ПерваяСтрока.Количество = 10; // Увеличиваем количество

// Или находим строку по условию

Для Каждого Строка Из Док.Товары Цикл

Если Строка.Номенклатура.Наименование = "Стол письменный" Тогда

Строка.Цена = 3200;

КонецЕсли;

КонецЦикла;

☑️ Проверка перед программной записью

Выполнено: 0 / 4

3.3. Удаление строк

Для удаления строки используйте метод Удалить():

// Удаляем строку по индексу

Док.Товары.Удалить(2); // Удалит третью строку (индексация с 0)

// Удаляем все строки, соответствующие условию

Пока Док.Товары.Количество() > 0 Цикл

Если Док.Товары[0].Количество = 0 Тогда

Док.Товары.Удалить(0);

Иначе

Прервать;

КонецЕсли;

КонецЦикла;

Что будет, если удалить строку в проведенном документе?

Если документ уже проведен, удаление строки из табличной части может привести к расхождению данных в регистрах. Например, в документе РеализацияТоваровУслуг после удаления строки сумма документа не будет совпадать с суммой по строкам, а движения по регистрам ТоварыНаСкладах останутся неизменными. Чтобы избежать ошибок, сначала сделайте документ непроведенным (Док.ОтменитьПроведение()), внесите изменения, а затем проведите заново.

3.4. Массовая запись данных

Для заполнения табличной части большим количеством строк эффективнее использовать цикл:

ТаблицаТоваров = Новый ТаблицаЗначений;

ТаблицаТоваров.Колонки.Добавить("Номенклатура");

ТаблицаТоваров.Колонки.Добавить("Количество");

ТаблицаТоваров.Колонки.Добавить("Цена");

// Заполняем таблицу значениями (например, из файла или запроса)

Для Инд = 1 По 10 Цикл

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

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

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

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

КонецЦикла;

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

Для Каждого Строка Из ТаблицаТоваров Цикл

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

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

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

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

КонецЦикла;

💡

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

4. Распространенные ошибки и их решения

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

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

Одна из самых коварных ошибок — несовпадение итогов. Например, в документе РеализацияТоваровУслуг сумма по строкам не сходится с общей суммой документа. Это происходит, если:

  • 🔢 В коде не пересчитывается реквизит СуммаДокумента после изменения строк.
  • 📉 В табличной части есть скрытые строки с нулевым количеством, которые не учитываются в итогах.
  • 🔄 Используется ручное округление сумм, что приводит к расхождениям на копейки.

Чтобы избежать таких проблем, используйте встроенные механизмы пересчета:

Док.ПересчитатьИтоги(); // Пересчитывает все итоговые реквизиты

Док.Товары.Итоги(); // Пересчитывает только итоги табличной части

💡

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

5. Особенности работы с табличными частями в разных конфигурациях

Хотя принципы работы с табличными частями универсальны, в типовых конфигурациях есть специфические нюансы. Рассмотрим самые распространенные:

5.1. Управление торговлей (УТ 11)

В УТ 11 табличные части документов часто связаны с бизнес-процессами. Например:

  • 📦 В документе ЗаказПокупателя табличная часть Товары может автоматически резервировать товары на складе при проведении.
  • 💰 В РеализацияТоваровУслуг строки табличной части влияют на формирование счетов-фактур и книг продаж.
  • 📊 В отчетах (например, Ведомость по товарам) данные из табличных частей агрегируются с учетом дополнительных аналитик (серии, характеристики).

В УТ 11 при программной записи в табличную часть Товары обязательно заполняйте реквизит ХарактеристикаНоменклатуры, даже если он не обязательный в интерфейсе. Иначе могут возникнуть ошибки при резервировании или отгрузке.

5.2. Бухгалтерия предприятия (БП 3.0)

В БП 3.0 табличные части часто используются для:

  • 💼 Расшифровки проводок — в документах типа ПоступлениеНаРасчетныйСчет табличная часть Поступления детализирует платежи по договорам.
  • 📎 Вложений файлов — в справочниках (например, ДоговорыКонтрагентов) табличная часть Файлы хранит прикрепленные документы.
  • 📅 Графиков платежей — в документе КредитныйДоговор табличная часть ГрафикПогашения содержит даты и суммы платежей.

В БП 3.0 особое внимание уделите:

  • 🔗 Связи с планом счетов — при добавлении строк в табличную часть, формирующую проводки (например, в Операция), проверяйте соответствие счетов дебет/кредит.
  • 💰 Валютным реквизитам — если табличная часть содержит суммы в валюте, не забывайте заполнять Валюта и Курс.
  • 📑 Печатным формам — некоторые табличные части (например, в АвансовыйОтчет) влияют на формирование печатных форм (авансовые отчеты, командировочные удостоверения).

5.3. Зарплата и управление персоналом (ЗУП 3.1)

В ЗУП 3.1 табличные части часто имеют иерархическую структуру. Например:

  • 👥 В документе НачислениеЗарплаты табличная часть Начисления может содержать вложенные табличные части для детализации (например, РасчетПоДням).
  • 📅 В справочнике Сотрудники табличная часть ТрудовыеДоговоры хранит историю трудовых отношений.
  • 💸 В документе ВызплатаЗарплаты табличная часть Вызплаты связана с ведомостями и банковскими реквизитами.

При работе с ЗУП 3.1 помните:

  • 🔄 Перерасчеты — изменение строк в табличной части может инициировать перерасчет зарплаты за прошлые периоды.
  • 📈 Налоги и взносы — некоторые табличные части (например, Удержания) влияют на расчет НДФЛ и страховых взносов.
  • 📋 Кадровые документы — в табличных частях документов типа ПриемНаРаботу хранятся данные о графиках работы, окладах и надбавках.
💡

В ЗУП 3.1 перед массовым изменением табличных частей (например, при индексации зарплат) всегда делайте резервную копию базы или используйте механизм Откат транзакции, чтобы избежать ошибок в расчетах.

6. Оптимизация работы с табличными частями

При большом объеме данных или частых операциях с табличными частями важно оптимизировать код, чтобы избежать замедления работы системы. Вот ключевые рекомендации:

6.1. Использование транзакций

Если вы добавляете или изменяете большое количество строк, оберните операции в транзакцию:

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

Попытка

Для Каждого Товар Из СписокТоваров Цикл

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

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

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

КонецЦикла;

Док.Записать();

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

Исключение

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

Сообщить("Ошибка при записи: " + ОписаниеОшибки());

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

6.2. Массовое заполнение через Загрузить()

Для ускорения загрузки данных из внешних источников (Excel, XML) используйте метод Загрузить():

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Загрузить(ПутьКФайлуExcel);

// Преобразуем данные и загружаем в табличную часть

Док.Товары.Загрузить(ТаблицаДанных);

6.3. Кэширование часто используемых данных

Если в цикле многократно обращаетесь к одним и тем же справочникам (например, к Номенклатуре), кэшируйте ссылки:

СправочникНоменклатуры = Справочники.Номенклатура.СоздатьМенеджерВыбора();

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

Если НЕ КэшНоменклатуры.СодержитКлюч(Строка.Артикул) Тогда

КэшНоменклатуры.Вставить(Строка.Артикул, СправочникНоменклатуры.НайтиПоРеквизиту("Артикул", Строка.Артикул));

КонецЕсли;

НоваяСтрока.Номенклатура = КэшНоменклатуры[Строка.Артикул];

КонецЦикла;

6.4. Отключение проверок при массовых операциях

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

Док.ОтключитьПроверкуЗаполнения(Истина);

Для Инд = 1 По 1000 Цикл

Док.Товары.Добавить();

КонецЦикла;

Док.ВключитьПроверкуЗаполнения(Истина);

💡

Отключение проверок ускоряет работу, но может привести к некорректным данным. Используйте этот прием только для массовых операций с последующей валидацией.

7. Примеры реальных задач с табличными частями

Рассмотрим практические сценарии, с которыми часто сталкиваются пользователи и разработчики.

7.1. Перенос строк между документами

Задача: скопировать строки из документа ЗаказПокупателя в РеализацияТоваровУслуг.

Заказ = Документы.ЗаказПокупателя.НайтиПоНомеру("ЗП-000123");

Реализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

Для Каждого СтрокаЗаказа Из Заказ.Товары Цикл

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

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

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

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

КонецЦикла;

Реализация.Записать();

7.2. Заполнение табличной части данными из запроса

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ТоварыОстатки.Номенклатура КАК Номенклатура,

| ТоварыОстатки.КоличествоОстаток КАК Количество

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыОстатки

|ГДЕ

| ТоварыОстатки.Склад = &Склад";

Запрос.УстановитьПараметр("Дата", ТекущаяДата());

Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("Основной склад"));

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

Выборка = Результат.Выбрать();

Док = Документы.ИнвентаризацияТоваровНаСкладах.СоздатьДокумент();

Пока Выборка.Следующий() Цикл

Строка = Док.Товары.Добавить();

Строка.Номенклатура = Выборка.Номенклатура;

Строка.КоличествоФактическое = Выборка.Количество;

КонецЦикла;

7.3. Поиск и замена значений в табличной части

Задача: заменить цену на все товары определенной группы в документе ПоступлениеТоваровУслуг.

Для Каждого Строка Из Док.Товары Цикл

Если Строка.Номенклатура.Родитель.Наименование = "Мебель" Тогда

Строка.Цена = Строка.Цена * 1.1; // Увеличиваем цену на 10%

КонецЕсли;

КонецЦикла;

7.4. Экспорт табличной части в Excel

Задача: выгрузить табличную часть Товары в файл Excel.

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Номенклатура");

Таблица.Колонки.Добавить("Количество");

Таблица.Колонки.Добавить("Сумма");

Для Каждого Строка Из Док.Товары Цикл

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

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

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

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

КонецЦикла;

Экспорт = Новый ЭкспортВExcel;

Экспорт.Экспортировать(Таблица, "C:\Export\Товары.xlsx");

8. Часто задаваемые вопросы

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

Используйте метод Количество():

КолвоСтрок = Док.Товары.Количество();

Для проверки на пустоту:

Если Док.Товары.Количество() = 0 Тогда

Сообщить("Табличная часть пуста!");

КонецЕсли;

Можно ли отменить изменения в табличной части после записи?

Если документ еще не проведен, вы можете:

  1. Открыть документ в режиме редактирования.
  2. Удалить или изменить нужные строки.
  3. Сохранить документ заново.

Если документ уже проведен, сначала отмените проведение (Док.ОтменитьПроведение()), внесите изменения, а затем проведите заново.

Внимание: в некоторых конфигурациях (например, БП 3.0) отмена проведения может потребовать прав администратора.

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

Используйте метод Загрузить() и Выгрузить():

// Копируем из документа Источник в документ Приемник

Таблица = Источник.Товары.Выгрузить();

Приемник.Товары.Загрузить(Таблица);

Или построка:

Приемник.Товары.Очистить();

Для Каждого Строка Из Источник.Товары Цикл

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

НоваяСтрока.ЗаполнитьЗначения(Строка);

КонецЦикла;

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

Эта ошибка обычно означает, что:

  • Вы пытаетесь присвоить несуществующий элемент справочника (например, Номенклатура с неверным именем).
  • Не хватает