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

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

Что такое табличные части и зачем они нужны

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

Основные задачи табличных частей:

  • 📋 Хранение связанных данных. Например, в документе Поступление товаров табличная часть содержит список поступивших позиций с количеством и ценой.
  • 🔄 Обеспечение целостности. При удалении документа автоматически очищается его табличная часть (в отличие от отдельных справочников, где связи нужно контролировать вручную).
  • 📊 Упрощение отчетности. Данные из табличных частей легко агрегируются в отчетах без дополнительных связей.
  • Ускорение работы. Доступ к записям табличной части происходит быстрее, чем к связанным справочникам, благодаря оптимизации платформы.

Важно понимать, что табличная часть — это не просто "список строк", а полноценный объект с собственными методами, событиями и свойствами. Например, для табличной части можно:

  • 🔍 Настраивать условное оформление (подсветка строк по условиям).
  • 📎 Добавлять команды (кнопки для действий над строками).
  • 🔄 Устанавливать связи с другими объектами (например, подбор номенклатуры из справочника).
⚠️ Внимание: В версиях платформы 1С:Предприятие 8.3.20+ появилась возможность создавать динамические табличные части — их структура колонок может меняться программно во время выполнения. Это полезно для гибких отчетов или интеграций, но требует осторожности при обновлении конфигураций.

Виды табличных частей в 1С: классификация и отличия

В табличные части делятся на несколько типов по способу хранения и использованию. Основное разделение — на стандартные (встроенные в платформу) и произвольные (созданные разработчиком). Рассмотрим ключевые виды:

Тип табличной части Где используется Особенности Пример
Стандартные Документы, справочники Жестко заданы в платформе, не требуют ручного создания Табличная часть Товары в документе РеализацияТоваровУслуг
Произвольные Любые объекты конфигурации Создаются разработчиком, гибкая структура Табличная часть ДополнительныеРеквизиты в справочнике Контрагенты
Динамические Отчеты, обработки Структура колонок формируется программно Таблица с произвольными показателями в отчете Анализ продаж
Виртуальные Формы, печатные формы Не хранят данные, только отображают Таблица с расчетами в печатной форме Счет на оплату

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

Также табличные части различаются по способу хранения данных:

  • 💾 В базе данных — стандартный вариант, данные сохраняются в таблицах СУБД.
  • 🖥️ В памяти — временные табличные части (например, для промежуточных расчетов в обработках).
📊 Какой тип табличных частей вы используете чаще?
Стандартные (в документах)
Произвольные (свои)
Динамические
Не знаю, что это

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

Добавление табличной части в конфигураторе — процесс, состоящий из нескольких шагов. Рассмотрим пошаговую инструкцию на примере создания табличной части для справочника Контрагенты.

  1. Откройте конфигуратор и перейдите в ветку Объекты конфигурации → Справочники → Контрагенты.

  2. В панели свойств справочника найдите вкладку Табличные части и нажмите кнопку Добавить.

  3. Задайте имя табличной части (например, КонтактныеЛица) и настройте состав колонок:

    • 📌 Имя (тип Строка, длина 50)
    • 📞 Телефон (тип Строка, длина 20)
    • ✉️ Email (тип Строка, длина 50)
  • Настройте свойства табличной части:

    • Установите флаг Использовать стандартные команды для автоматического добавления кнопок "Добавить", "Удалить" и т.д.
    • Задайте Минимальное количество строк (например, 1, если контактное лицо обязательно).
    • Сохраните конфигурацию (Ctrl + S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

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

    1. Откройте форму справочника Контрагенты (ветка Формы).
    2. Перетащите табличную часть из дерева объектов на форму.
    3. Настройте отображение колонок (ширину, порядок, видимость).
    4. Указано уникальное имя табличной части|

      Заданы все необходимые колонки|

      Настроены типы данных для колонок|

      Проверены права доступа (если нужны)|

      Сохранена резервная копия конфигурации-->

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

      Работа с табличными частями на встроенном языке 1С

      Управление табличными частями в коде осуществляется через объекты ТабличнаяЧасть или ТабличнаяЧастьКоллекция. Основные методы и свойства:

      Чтение данных:

      // Получение количества строк
      

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

      // Перебор строк

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

      Сообщить(СтрокаТоваров.Номенклатура.Наименование);

      КонецЦикла;

      Добавление и изменение строк:

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

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

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

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

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

      Документ.Товары[0].Цена = 15000;

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

      // Удаление по индексу
      

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

      // Удаление всех строк

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

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

      // Поиск строки по условию
      

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

      // Фильтрация с использованием запроса

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

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

      "ВЫБРАТЬ

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

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

      |ИЗ

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

      |ГДЕ

      | Товары.Количество > 10";

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

      Для работы с динамическими табличными частями используйте объект ТаблицаЗначений:

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

      Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

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

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

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

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

      💡

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

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

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

      1. Пустые ссылки в колонках

      Если не проверить заполненность ссылочных полей (например, Номенклатура), при записи документа может возникнуть ошибка "Недопустимое значение". Всегда используйте конструкцию:

      Если НЕ ЗначениеЗаполнено(СтрокаТоваров.Номенклатура) Тогда
      

      Сообщить("Не указана номенклатура!");

      Прервать;

      КонецЕсли;

      2. Неправильная привязка к родительскому объекту

      При программном создании строки табличной части без указания владельца (например, через НоваяСтрока = Новый Структура()) данные не сохранятся. Всегда добавляйте строки через методы табличной части:

      // Правильно:
      

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

      // Неправильно:

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

      3. Игнорирование событий

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

      4. Избыточные данные в табличной части

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

      5. Проблемы с правами доступа

      Если пользователь не имеет прав на изменение табличной части, но может редактировать документ, это приведет к ошибкам при сохранении. Настройте права в ролях (Конфигурация → Роли).

      Как исправить ошибку "Табличная часть не найдена"

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

      1. Совпадает ли имя табличной части в коде и в конфигурации.

      2. Не было ли обновления конфигурации, после которого изменилась структура.

      3. Правильно ли указан путь к табличной части (например, Документ.Товары, а не Документ.ТабличнаяЧасть1).

      Примеры использования табличных частей в типовых конфигурациях

      Рассмотрим, как табличные части применяются в стандартных конфигурациях (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11):

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

      Содержит табличные части:

      • 📦 Товары — список поступивших позиций с ценами и количеством.
      • 💰 Оплата — информация о платежных документах (если поступление с оплатой).
      • 📄 Дополнительно — произвольные реквизиты (например, номер контракта).

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

      2. Справочник "Номенклатура"

      Может включать табличные части:

      • 🔧 Комплектующие — для составных изделий (если номенклатура является комплектом).
      • 📏 Характеристики — дополнительные параметры (цвет, размер, вес).
      • 🔄 Аналоги — взаимозаменяемые товары.

      3. Документ "Заказ покупателя"

      Табличные части:

      • 🛒 Товары — позиции заказа.
      • 📦 Упаковки — информация об упаковке (если используется модуль логистики).
      • 📝 Комментарии — история изменений или замечания менеджера.

      4. Отчет "Анализ продаж"

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

      • 📊 Вывода сводных данных по периодам.
      • 📈 Сравнения план/факт.
      • 🔍 Детализации по контрагентам или номенклатуре.

      В 1С:Зарплата и управление персоналом табличные части применяются для:

      • 👥 Хранения истории изменений окладов в справочнике Сотрудники.
      • 💼 Перечня начислений и удержаний в документе Начисление зарплаты.
      💡

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

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

      При большом объеме данных табличные части могут замедлять работу системы. Вот способы оптимизации:

      1. Индексирование колонок

      Если табличная часть часто фильтруется по определенному полю (например, Номенклатура), добавьте индекс:

      • В конфигураторе откройте свойства табличной части.
      • На вкладке Индексы добавьте индекс по нужной колонке.

    2. Использование отборов

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

    Отбор = Новый Структура("Номенклатура", Справочники.Номенклатура.Монитор);
    

    Данные = Документ.Товары.НайтиСтроки(Отбор);

    3. Пакетная обработка

    При массовом изменении данных используйте транзакции и пакетные операции:

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

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

    Строка.Цена = Строка.Цена * 1.1; // Повышение цен на 10%

    КонецЦикла;

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

    4. Кэширование данных

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

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

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

    "ВЫБРАТЬ

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

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

    |ИЗ

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

    |ГДЕ

    | Товары.Ссылка = &СсылкаНаДокумент

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

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

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

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

    5. Разделение больших табличных частей

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

    • 📦 ТоварыНаСкладе — фактическое наличие.
    • Расхождения — только строки с отклонениями.
    • ⚠️ Внимание: В клиент-серверном варианте работы табличные части передаются между клиентом и сервером целиком. Если в табличной части 10 000 строк, это может вызвать зависание интерфейса. Для таких случаев используйте серверные процедуры или временные таблицы.

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

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

      Нет, табличная часть всегда принадлежит какому-либо объекту конфигурации (документу, справочнику и т.д.). Однако можно эмулировать независимую таблицу с помощью ТаблицаЗначений или регистра сведений.

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

      Используйте цикл по строкам исходной табличной части и метод Добавить() для целевой:

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

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

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

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

      КонецЦикла;

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

      Вероятные причины:

      1. Не вызван метод Записать() для родительского объекта.
      2. Отсутствуют права на изменение табличной части у текущего пользователя.
      3. В модуле объекта переопределено событие ПередЗаписью, которое отменяет запись.
      Как сделать табличную часть обязательной (не менее N строк)?

      В свойствах табличной части в конфигураторе установите параметр Минимальное количество строк. Также можно добавить проверку в модуле объекта:

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

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

      Сообщить("Добавьте хотя бы одну позицию!");

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

      КонецЕсли;

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

      Можно ли в табличной части хранить файлы (например, сканы документов)?

      Да, для этого добавьте колонку типа ХранилищеЗначения или Строка (для пути к файлу). Однако для большого количества файлов лучше использовать отдельный справочник Файлы со ссылкой на него из табличной части.