Работа с табличными частями в 1С:Предприятие — одна из самых востребованных задач как для бухгалтеров, так и для разработчиков. Без умения корректно добавлять, редактировать и удалять строки в табличных частях справочников, документов или регистров невозможно полноценно вести учет, формировать отчеты или автоматизировать бизнес-процессы. Эта статья охватывает все актуальные способы записи данных — от ручного заполнения через интерфейс пользователя до программных методов с примерами кода на встроенном языке.
Особое внимание уделено типичным ошибкам, которые приводят к потере данных или сбоям в работе системы. Например, многие пользователи сталкиваются с проблемой, когда после записи документа строки в табличной части исчезают или дублируются. Мы разберем причины таких ситуаций и покажем, как их избежать. Также вы найдете сравнительную таблицу методов записи с указанием их плюсов и минусов — это поможет выбрать оптимальный подход для вашей задачи.
Статья будет полезна как новичкам, которые только осваивают 1С, так и опытным специалистам, ищущим оптимальные решения для автоматизации. Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3 (включая 8.3.23), но основные принципы применимы и к более ранним релизам. Если вы работаете с конфигурациями типа УТ 11, БП 3.0 или ЗУП 3.1, здесь вы найдете универсальные решения.
1. Что такое табличная часть в 1С и где она используется
Табличная часть — это структурный элемент объекта метаданных (справочника, документа, плана обмена и др.), который позволяет хранить набор однотипных данных в виде строк. Каждая строка табличной части представляет собой запись с фиксированным набором реквизитов (колонок). Например, в документе РеализацияТоваровУслуг табличная часть Товары содержит информацию о номенклатуре, количестве, цене и сумме по каждой позиции.
Основные объекты, где применяются табличные части:
- 📄 Документы — товары в накладных, услуги в актах, материалы в требованиях.
- 📚 Справочники — например, список контактных лиц в справочнике
Контрагентыили адреса доставки. - 📊 Регистры сведений — для хранения истории изменений (например, курсы валют).
- 🔄 Планы обмена — правила преобразования данных при обмене между базами.
Отличие табличной части от отдельного справочника или регистра заключается в том, что она всегда привязана к родительскому объекту. Например, строки табличной части Товары не могут существовать отдельно от документа ПоступлениеТоваров. Это обеспечивает целостность данных, но накладывает ограничения на манипуляции — например, нельзя просто так перенести строку из одного документа в другой.
2. Ручная запись данных через интерфейс 1С
Самый простой способ добавить строку в табличную часть — использовать стандартные формы ввода. Рассмотрим процесс на примере документа РеализацияТоваровУслуг в конфигурации Управление торговлей 11:
- Откройте документ (создайте новый или выберите существующий).
- Перейдите на закладку с табличной частью (например,
Товары). - Нажмите кнопку
Добавить(илиInsertна клавиатуре). - Заполните реквизиты строки: выберите номенклатуру из справочника, укажите количество, цену и т.д.
- Сохраните документ кнопкой
ЗаписатьилиОК.
В некоторых конфигурациях (например, Бухгалтерия предприятия 3.0) для ускорения ввода предусмотрены механизмы подбора:
- 🔍 Подбор из справочника — кнопка
Подбороткрывает форму со списком номенклатуры, где можно отфильтровать товары по группам, остаткам или другим критериям. - 📑 Копирование строк — кнопка
Скопировать строкудублирует текущую строку с сохранением всех реквизитов. - 🔄 Заполнение по остаткам — автоматически добавляет строки на основе доступного количества товара на складе.
Если в табличной части много колонок, но вам нужны только несколько, настройте видимость реквизитов через меню Ещё → Настроить список. Это ускорит работу и снизит риск ошибок при заполнении.
Обратите внимание на особенности ручного ввода:
- При добавлении строки в документ она не сохраняется в базе до тех пор, пока вы не нажмете
ЗаписатьилиПровести. - В некоторых конфигурациях (например, ЗУП 3.1) табличные части могут иметь иерархическую структуру — например, строки с начислениями и удержаниями в документе
Начисление зарплаты. - Если табличная часть привязана к регистру (например,
Товарыв документеИнвентаризация), изменения могут автоматически отражаться в регистрах накопления.
3. Программная запись в табличную часть на встроенном языке
Для автоматизации или массового заполнения табличных частей используется встроенный язык 1С. Основные методы работы:
3.1. Добавление новой строки
Чтобы добавить строку в табличную часть документа или справочника, используйте метод Добавить():
// Пример для документа "ПоступлениеТоваровУслуг"
Док = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НоваяСтрока = Док.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Стул офисный");
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 2500;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Важные нюансы:
- Метод
Добавить()возвращает ссылку на новую строку, через которую можно задать значения реквизитов. - Если табличная часть имеет автонумерацию, номер строки будет присвоен автоматически.
- Для справочников используйте аналогичный подход, но вместо
Документы.ИмяДокументаобращайтесь кСправочники.ИмяСправочника.
3.2. Изменение существующей строки
Чтобы редактировать строку, сначала нужно получить к ней доступ по индексу или условию:
// Изменяем первую строку в табличной части
ПерваяСтрока = Док.Товары[0];
ПерваяСтрока.Количество = 10; // Увеличиваем количество
// Или находим строку по условию
Для Каждого Строка Из Док.Товары Цикл
Если Строка.Номенклатура.Наименование = "Стол письменный" Тогда
Строка.Цена = 3200;
КонецЕсли;
КонецЦикла;
☑️ Проверка перед программной записью
3.3. Удаление строк
Для удаления строки используйте метод Удалить():
// Удаляем строку по индексу
Док.Товары.Удалить(2); // Удалит третью строку (индексация с 0)
// Удаляем все строки, соответствующие условию
Пока Док.Товары.Количество() > 0 Цикл
Если Док.Товары[0].Количество = 0 Тогда
Док.Товары.Удалить(0);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Что будет, если удалить строку в проведенном документе?
Если документ уже проведен, удаление строки из табличной части может привести к расхождению данных в регистрах. Например, в документе РеализацияТоваровУслуг после удаления строки сумма документа не будет совпадать с суммой по строкам, а движения по регистрам ТоварыНаСкладах останутся неизменными. Чтобы избежать ошибок, сначала сделайте документ непроведенным (Док.ОтменитьПроведение()), внесите изменения, а затем проведите заново.
3.4. Массовая запись данных
Для заполнения табличной части большим количеством строк эффективнее использовать цикл:
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Номенклатура");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Цена");
// Заполняем таблицу значениями (например, из файла или запроса)
Для Инд = 1 По 10 Цикл
НоваяСтрока = ТаблицаТоваров.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар " + Инд);
НоваяСтрока.Количество = 2 * Инд;
НоваяСтрока.Цена = 100 * Инд;
КонецЦикла;
// Переносим данные в табличную часть документа
Для Каждого Строка Из ТаблицаТоваров Цикл
НоваяСтрокаДока = Док.Товары.Добавить();
НоваяСтрокаДока.Номенклатура = Строка.Номенклатура;
НоваяСтрокаДока.Количество = Строка.Количество;
НоваяСтрокаДока.Цена = Строка.Цена;
КонецЦикла;
При массовой записи данных всегда проверяйте производительность. Если строк больше 1000, используйте НачатьТранзакцию() и ЗафиксироватьТранзакцию(), чтобы уменьшить нагрузку на базу.
4. Распространенные ошибки и их решения
При работе с табличными частями пользователи и разработчики часто сталкиваются с типовыми проблемами. Разберем самые частые из них и способы их устранения.
| Ошибка | Причина | Решение |
|---|---|---|
| Строки исчезают после записи документа | Не заполнены обязательные реквизиты (например, Номенклатура) |
Проверьте заполненность всех реквизитов с признаком Обязательный в метаданных |
| Дублирование строк при записи | Ошибка в логике кода (например, цикл добавляет одни и те же данные) | Используйте уникальные идентификаторы или проверку на существование строки перед добавлением |
| Ошибка "Недопустимое значение" при записи | Тип данных не соответствует типу реквизита (например, строка вместо числа) | Преобразуйте данные к нужному типу с помощью Число(), Строка() и т.д. |
| Изменения не сохраняются | Забыли вызвать Записать() или Провести() для документа |
Явно вызовите метод записи после изменения табличной части |
Одна из самых коварных ошибок — несовпадение итогов. Например, в документе РеализацияТоваровУслуг сумма по строкам не сходится с общей суммой документа. Это происходит, если:
- 🔢 В коде не пересчитывается реквизит
СуммаДокументапосле изменения строк. - 📉 В табличной части есть скрытые строки с нулевым количеством, которые не учитываются в итогах.
- 🔄 Используется ручное округление сумм, что приводит к расхождениям на копейки.
Чтобы избежать таких проблем, используйте встроенные механизмы пересчета:
Док.ПересчитатьИтоги(); // Пересчитывает все итоговые реквизиты
Док.Товары.Итоги(); // Пересчитывает только итоги табличной части
Если вы работаете с табличной частью, которая связана с регистрами (например, Товары в ПоступлениеТоваровУслуг), после изменения строк всегда проверяйте движения документа через Док.Движения.ТоварыНаСкладах.Получить(). Это поможет убедиться, что изменения корректно отразились в учете.
5. Особенности работы с табличными частями в разных конфигурациях
Хотя принципы работы с табличными частями универсальны, в типовых конфигурациях 1С есть специфические нюансы. Рассмотрим самые распространенные:
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 Тогда
Сообщить("Табличная часть пуста!");
КонецЕсли;
Можно ли отменить изменения в табличной части после записи?
Если документ еще не проведен, вы можете:
- Открыть документ в режиме редактирования.
- Удалить или изменить нужные строки.
- Сохранить документ заново.
Если документ уже проведен, сначала отмените проведение (Док.ОтменитьПроведение()), внесите изменения, а затем проведите заново.
Внимание: в некоторых конфигурациях (например, БП 3.0) отмена проведения может потребовать прав администратора.
Как скопировать табличную часть из одного документа в другой?
Используйте метод Загрузить() и Выгрузить():
// Копируем из документа Источник в документ Приемник
Таблица = Источник.Товары.Выгрузить();
Приемник.Товары.Загрузить(Таблица);
Или построка:
Приемник.Товары.Очистить();
Для Каждого Строка Из Источник.Товары Цикл
НоваяСтрока = Приемник.Товары.Добавить();
НоваяСтрока.ЗаполнитьЗначения(Строка);
КонецЦикла;
Почему при добавлении строки возникает ошибка "Объект не найден"?
Эта ошибка обычно означает, что:
- Вы пытаетесь присвоить несуществующий элемент справочника (например,
Номенклатурас неверным именем). - Не хватает