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

Если вы когда-нибудь задавались вопросами вроде «Почему в документе „Поступление товаров“ есть строка с таблицей, а не просто поля для ввода?» или «Как связать табличную часть с другими объектами конфигурации?», эта статья поможет разложить всё по полочкам. Мы разберём не только техническую сторону (как создавать и настраивать табличные части в конфигураторе), но и практическое применение — от бухгалтерских проводок до управления складскими остатками.

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

Что такое табличная часть в 1С и как она выглядит

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

Например, в документе РеализацияТоваровУслуг табличная часть Товары содержит колонки: Номенклатура, Количество, Цена, Сумма. Каждая строка здесь — это отдельная позиция в чеке или накладной. Без табличной части пришлось бы создавать отдельный документ на каждый товар, что сделало бы систему неудобной и громоздкой.

  • 📌 Где встречается: документы (поступление, реализация, инвентаризация), справочники (номенклатура с характеристиками), регистры сведений (цены, остатки).
  • 🔧 Чем отличается от реквизита: реквизит хранит одно значение (например, ДатаДокумента), а табличная часть — массив значений (список товаров).
  • 🔄 Динамичность: количество строк может меняться «на лету» (добавляться, удаляться, редактироваться).

В конфигураторе табличная часть создаётся как дочерний объект. Например, для документа ПоступлениеТоваров она может называться Товары и содержать реквизиты-колонки. При этом каждая колонка сама по себе является реквизитом табличной части, со своими типами данных (число, строка, ссылка на справочник и т.д.).

📊 Как часто вы работаете с табличными частями в 1С?
Ежедневно
Несколько раз в неделю
Редко
Никогда не использовал

Зачем нужны табличные части: 5 ключевых задач

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

  1. Учёт множественных позиций в одном документе.

    Представьте документ СчётНаОплату без табличной части: пришлось бы создавать отдельный счёт на каждый товар. Таблица позволяет указать все позиции в одном документе, что экономит время и уменьшает количество записей в базе.

  2. Автоматический расчёт итогов.

    В табличной части можно настроить автоматическое вычисление сумм, налогов или других показателей по строкам. Например, в документе РеализацияТоваровУслуг сумма по строке рассчитывается как Количество × Цена, а общий итог документа — сумма всех строк.

  3. Связь с другими объектами.

    Через табличные части реализуются движения по регистрам. Например, при проведении документа ПоступлениеТоваров строки табличной части Товары формируют записи в регистре ТоварыНаСкладах.

  4. Гибкая настройка интерфейса.

    Можно скрывать/показывать колонки в зависимости от ролей пользователей, добавлять условное оформление (например, подсветку строк с отрицательным количеством) или даже динамически менять состав колонок через код.

  5. Интеграция с внешними системами.

    Табличные части удобно экспортировать/импортировать в форматы Excel, JSON или XML. Это упрощает обмен данными с сайтами, CRM или другими программами.

💡

Без табличных частей в 1С пришлось бы создавать отдельный документ на каждую позицию (товар, услугу, операцию), что сделало бы систему непригодной для реального бизнеса.

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

Как создавать и настраивать табличные части в конфигураторе

Рассмотрим процесс создания табличной части на примере документа ЗаказПокупателя. Для этого нужно:

  1. Открыть конфигуратор и перейти в ветку Объекты → Документы → ЗаказПокупателя.
  2. В палитре свойств документа найти вкладку Табличные части и нажать Добавить.
  3. Задать имя (например, Товары) и добавить реквизиты-колонки:
    • Номенклатура (тип: СправочникСсылка.Номенклатура)
    • Количество (тип: Число(10, 3))
    • Цена (тип: Число(10, 2))
    • Сумма (тип: Число(10, 2), вычисляемое поле).
  • Настроить форму документа, добавив на неё табличное поле и привязав его к созданной табличной части.
  • Для вычисляемых полей (например, Сумма = Количество × Цена) нужно написать код в модуле объекта:

    Процедура ПриИзмененииКоличестваИлиЦены(Элемент)
    

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

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

    КонецЦикла;

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

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

    УсловиеОформлениеПример
    Количество < 0Красный текстОтрицательные остатки
    Цена > 10000Жёлтый фонДорогостоящие товары
    Номенклатура.ВидыНоменклатуры = "Услуга"КурсивВыделение услуг
    💡

    Чтобы ускорить работу с большими табличными частями (1000+ строк), отключите автоматический пересчёт итогов в свойствах таблицы на форме. Это снизит нагрузку на клиентское приложение.

    Программная работа с табличными частями: основные приёмы

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

    1. Добавление и удаление строк

    Чтобы добавить строку в табличную часть Товары документа Док:

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

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

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

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

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

    Если Строка.Количество = 0 Тогда

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

    КонецЕсли;

    КонецЦикла;

    2. Поиск и фильтрация

    Найти строку с определённой номенклатурой:

    НайденнаяСтрока = Док.Товары.Найти(НоваяСтруктура("Номенклатура", СсылкаНаНоменклатуру));

    Отфильтровать строки по условию:

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

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

    Если Выборка.Количество > 10 Тогда

    // Обработка строк с количеством > 10

    КонецЕсли;

    КонецЦикла;

    3. Копирование табличных частей между документами

    Скопировать все строки из одного документа в другой:

    Док2.Товары.Очистить();
    

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

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

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

    КонецЦикла;

    Как ускорить обработку больших табличных частей?

    Для таблиц с 10 000+ строк используйте метод ЗагрузитьКолонку() вместо построчного чтения. Например:

    Количества = Док.Товары.ЗагрузитьКолонку("Количество");
    

    Для Инд = 0 По Количества.ВГраница() Цикл

    // Обработка

    КонецЦикла;

    Это в 5-10 раз быстрее стандартного цикла Для Каждого.

    Иначе данные могут потеряться при ошибках.

    Типичные ошибки при работе с табличными частями

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

    • 🚨 Пустые строки при копировании.

      При программном копировании строк забывают вызвать ЗаполнитьЗначения(), из-за чего новые строки остаются пустыми. Всегда проверяйте заполнение реквизитов.

    • 🔢 Несовпадение типов данных.

      Если в колонке тип Число(10, 2), а вы пытаетесь записать туда строку, возникнет ошибка. Используйте Число() для приведения типов.

    • 🔄 Зацикливание при изменении строк.

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

    • 📉 Потеря данных при очистке.

      Метод Очистить() безвозвратно удаляет все строки. Перед очисткой сохраняйте данные в массив или временную таблицу.

    ⚠️ Внимание: При обмене данными через XML или JSON табличные части сериализуются вложенными узлами. Если структура таблицы изменилась (добавились/удалились колонки), обмен может завершиться ошибкой. Всегда проверяйте соответствие форматов!

    Ещё одна частая проблема — медленная работа форм с большими табличными частями. Это происходит из-за:

    • Автоматического пересчёта итогов при каждом изменении.
    • Слишком сложного условного оформления.
    • Частых обращений к серверу (например, при проверке остатков по каждой строке).

    Решение: отключите ненужные пересчёты, используйте ОтложенноеВыполнение для тяжелых операций и оптимизируйте запросы к базе.

    Продвинутые возможности: динамические табличные части

    В стандартных курсах по редко рассказывают о том, что табличные части можно сделать динамическими — то есть изменять их структуру и поведение «на лету». Это открывает широкие возможности для кастомизации.

    1. Динамическое добавление колонок

    Можно создавать колонки в табличной части программно. Например, добавить колонку Скидка, если она нужна только для определённых типов документов:

    Если Док.ВидДокумента = ВидыДокументов.ОптоваяПродажа Тогда
    

    Если НЕ Док.Товары.Колонки.Найти("Скидка") Тогда

    Док.Товары.Колонки.Добавить("Скидка", Новый ОписаниеТипов("Число(5, 2)"));

    КонецЕсли;

    КонецЕсли;

    2. Изменение видимости колонок

    Скрывать или показывать колонки в зависимости от ролей пользователей:

    Если Пользователь.Роль = "Менеджер" Тогда
    

    ЭлементыФормы.Товары.Колонки.Цена.Видимость = Ложь;

    КонецЕсли;

    3. Использование временных таблиц

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

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

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

    "ВЫБРАТЬ

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

    | СУММА(Товары.Количество) КАК Итого

    |ИЗ

    | Документ.ЗаказПокупателя.Товары КАК Товары

    |ГДЕ

    | Товары.Ссылка = &Ссылка

    |СГРУППИРОВАТЬ ПО

    | Товары.Номенклатура";

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

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

    ⚠️ Внимание: Динамическое изменение структуры табличных частей может привести к ошибкам при обновлении конфигурации. Всегда документируйте такие доработки и тестируйте их на копии базы!

    Эти приёмы особенно полезны для интеграции с внешними системами, где структура данных может меняться. Например, при импорте из Excel можно автоматически создавать колонки в табличной части под новые поля файла.

    Примеры использования табличных частей в реальных задачах

    Разберём несколько практических сценариев, где табличные части играют ключевую роль.

    1. Документ «Поступление товаров»

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

    • 📦 Номенклатуру (ссылка на справочник).
    • 🔢 Количество и Цену (числа).
    • 💰 Сумма (вычисляемое поле).
    • 🏷️ Серия/Срок годности (для маркированных товаров).

    При проведении документа строки табличной части формируют движения в регистре ТоварыНаСкладах.

    2. Справочник «Номенклатура» с историей цен

    Табличная часть ЦеныПоставщиков может содержать:

    • 🏢 Поставщик (ссылка на контрагента).
    • 📅 ДатаЦены (дата).
    • 💵 ЦенаЗакупки (число).
    • 📝 Примечание (строка).

    Это позволяет отслеживать, как менялись цены у разных поставщиков, и выбирать оптимального.

    3. Регистр сведений «График работы сотрудников»

    Табличная часть здесь может хранить:

    • 🗓️ Дата.
    • ВремяНачала и ВремяОкончания.
    • 🏠 МестоРаботы (офис, удалёнка).

    Это упрощает планирование смен и расчёт рабочего времени.

    Объект 1СТабличная частьНазначение
    Документ РеализацияТоваровУслугТоварыСписок продаваемых позиций
    Справочник КонтрагентыКонтактыТелефоны, email, адреса
    Регистр накопления ВзаиморасчётыДвиженияФиксация изменений долга
    План видов характеристик СвойстваТоваровЗначенияСвойствЦвет, размер, вес и др.

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

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

    Можно ли в табличной части хранить вложенные таблицы?

    Нет, в стандартной конфигурации 1С:Предприятие табличная часть не поддерживает вложенные таблицы (как, например, в Excel). Однако можно:

    • Создать отдельный документ или справочник для вложенных данных и связать его с основной табличной частью по ссылке.
    • Использовать Структуру или Соответствие для хранения сложных данных в одной ячейке (но это усложнит обработку).
    Как экспортировать табличную часть в Excel?

    Самый простой способ — использовать метод Записать() объекта ТабличныйДокумент:

    ТабДок = Новый ТабличныйДокумент;
    

    ТабДок.Вывести(Док.Товары);

    ТабДок.Записать("C:\Temp\Товары.xlsx", ТипФайлаТабличногоДокумента.XLSX);

    Для сложных форматов (с формулами, объединёнными ячейками) лучше использовать XDTO или библиотеку OneScript.Excel.

    Почему при копировании документа табличная часть не копируется?

    Это происходит, если:

    • В коде копирования не учтена табличная часть (нужно явно скопировать строки).
    • Используется метод Копировать() без параметра КопироватьДвижения = Истина.
    • Настроены права доступа, запрещающие копирование определённых данных.

    Проверьте процедуру копирования в модуле документа.

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

    Для сортировки на форме:

    • В свойствах табличного поля на форме включите РазрешитьСортировку.
    • Или программно: ЭлементыФормы.Товары.Сортировка = Новый Сортировка("Количество Убыв").

    Для сортировки в коде:

    Док.Товары.Сортировать("Номенклатура Возр, Количество Убыв");
    Можно ли ограничить количество строк в табличной части?

    Да, но не через настройки конфигурации. Нужно:

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

    Пример кода:

    Процедура ПередЗаписью(Отказ)
    

    Если Товары.Количество() > 100 Тогда

    Сообщить("Превышено максимальное количество строк (100)!");

    Отказ = Истина;

    КонецЕсли;

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