Табличные части в 1С:Предприятие — это один из ключевых элементов структуры данных, который позволяет хранить и обрабатывать массивы информации внутри одного объекта. Без них невозможно представить работу со справочниками, документами или отчетами, где требуется привязка нескольких записей к одной "головной" сущности. Например, в документе "Заказ покупателя" табличная часть Товары содержит перечень позиций, а в справочнике "Номенклатура" — возможные аналоги или комплектующие.
Для новичков табличные части часто становятся источником путаницы: их легко спутать с отдельными справочниками или регистрами. Однако их главное отличие — привязка к родительскому объекту и автоматическое управление жизненным циклом (создание, изменение, удаление вместе с "головой"). В этой статье разберем, как устроены табличные части на уровне платформы, какие бывают виды, как их создавать в конфигураторе и использовать в коде на встроенном языке 1С.
Что такое табличные части и зачем они нужны
Табличная часть — это вложенный объект, который хранит набор записей с одинаковой структурой (колонками) внутри другого объекта конфигурации. Она всегда принадлежит одному "родителю": документу, справочнику, плану видов характеристик или плану обмена. Без родительского объекта табличная часть не существует.
Основные задачи табличных частей:
- 📋 Хранение связанных данных. Например, в документе
Поступление товаровтабличная часть содержит список поступивших позиций с количеством и ценой. - 🔄 Обеспечение целостности. При удалении документа автоматически очищается его табличная часть (в отличие от отдельных справочников, где связи нужно контролировать вручную).
- 📊 Упрощение отчетности. Данные из табличных частей легко агрегируются в отчетах без дополнительных связей.
- ⚡ Ускорение работы. Доступ к записям табличной части происходит быстрее, чем к связанным справочникам, благодаря оптимизации платформы.
Важно понимать, что табличная часть — это не просто "список строк", а полноценный объект с собственными методами, событиями и свойствами. Например, для табличной части можно:
- 🔍 Настраивать условное оформление (подсветка строк по условиям).
- 📎 Добавлять команды (кнопки для действий над строками).
- 🔄 Устанавливать связи с другими объектами (например, подбор номенклатуры из справочника).
⚠️ Внимание: В версиях платформы 1С:Предприятие 8.3.20+ появилась возможность создавать динамические табличные части — их структура колонок может меняться программно во время выполнения. Это полезно для гибких отчетов или интеграций, но требует осторожности при обновлении конфигураций.
Виды табличных частей в 1С: классификация и отличия
В 1С табличные части делятся на несколько типов по способу хранения и использованию. Основное разделение — на стандартные (встроенные в платформу) и произвольные (созданные разработчиком). Рассмотрим ключевые виды:
| Тип табличной части | Где используется | Особенности | Пример |
|---|---|---|---|
| Стандартные | Документы, справочники | Жестко заданы в платформе, не требуют ручного создания | Табличная часть Товары в документе РеализацияТоваровУслуг |
| Произвольные | Любые объекты конфигурации | Создаются разработчиком, гибкая структура | Табличная часть ДополнительныеРеквизиты в справочнике Контрагенты |
| Динамические | Отчеты, обработки | Структура колонок формируется программно | Таблица с произвольными показателями в отчете Анализ продаж |
| Виртуальные | Формы, печатные формы | Не хранят данные, только отображают | Таблица с расчетами в печатной форме Счет на оплату |
Отдельно стоит выделить табличные части с иерархией — они позволяют создавать многоуровневые списки (например, в справочнике Номенклатура для хранения групп и подгрупп товаров). Однако такой функционал требует дополнительной настройки в конфигураторе и может замедлять работу при большом количестве записей.
Также табличные части различаются по способу хранения данных:
- 💾 В базе данных — стандартный вариант, данные сохраняются в таблицах СУБД.
- 🖥️ В памяти — временные табличные части (например, для промежуточных расчетов в обработках).
Как создать табличную часть в конфигураторе 1С
Добавление табличной части в конфигураторе — процесс, состоящий из нескольких шагов. Рассмотрим пошаговую инструкцию на примере создания табличной части для справочника Контрагенты.
-
Откройте конфигуратор и перейдите в ветку
Объекты конфигурации → Справочники → Контрагенты. -
В панели свойств справочника найдите вкладку
Табличные частии нажмите кнопкуДобавить. -
Задайте имя табличной части (например,
КонтактныеЛица) и настройте состав колонок:- 📌
Имя(типСтрока, длина 50) - 📞
Телефон(типСтрока, длина 20) - ✉️
Email(типСтрока, длина 50)
- 📌
Настройте свойства табличной части:
- Установите флаг
Использовать стандартные командыдля автоматического добавления кнопок "Добавить", "Удалить" и т.д. - Задайте
Минимальное количество строк(например, 1, если контактное лицо обязательно).
Сохраните конфигурацию (Ctrl + S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).
После создания табличная часть станет доступна в форме справочника. Чтобы она отображалась, необходимо добавить ее на форму:
- Откройте форму справочника
Контрагенты(веткаФормы). - Перетащите табличную часть из дерева объектов на форму.
- Настройте отображение колонок (ширину, порядок, видимость).
- 📦
Товары— список поступивших позиций с ценами и количеством. - 💰
Оплата— информация о платежных документах (если поступление с оплатой). - 📄
Дополнительно— произвольные реквизиты (например, номер контракта). - 🔧
Комплектующие— для составных изделий (если номенклатура является комплектом). - 📏
Характеристики— дополнительные параметры (цвет, размер, вес). - 🔄
Аналоги— взаимозаменяемые товары. - 🛒
Товары— позиции заказа. - 📦
Упаковки— информация об упаковке (если используется модуль логистики). - 📝
Комментарии— история изменений или замечания менеджера. - 📊 Вывода сводных данных по периодам.
- 📈 Сравнения план/факт.
- 🔍 Детализации по контрагентам или номенклатуре.
- 👥 Хранения истории изменений окладов в справочнике
Сотрудники. - 💼 Перечня начислений и удержаний в документе
Начисление зарплаты. - В конфигураторе откройте свойства табличной части.
- На вкладке
Индексыдобавьте индекс по нужной колонке.
Указано уникальное имя табличной части|
Заданы все необходимые колонки|
Настроены типы данных для колонок|
Проверены права доступа (если нужны)|
Сохранена резервная копия конфигурации-->
⚠️ Внимание: При добавлении табличной части к документу обязательно настройте поведение при проведении. По умолчанию данные из табличной части не попадают в движения по регистрам — это нужно прописывать в модуле документа вручную (например, для формирования проводок по товарам).
Работа с табличными частями на встроенном языке 1С
Управление табличными частями в коде осуществляется через объекты ТабличнаяЧасть или ТабличнаяЧастьКоллекция. Основные методы и свойства:
Чтение данных:
// Получение количества строк
КоличествоСтрок = Документ.Товары.Количество();
// Перебор строк
Для Каждого СтрокаТоваров Из Документ.Товары Цикл
Сообщить(СтрокаТоваров.Номенклатура.Наименование);
КонецЦикла;
Добавление и изменение строк:
// Добавление новой строки
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор 24\"");
НоваяСтрока.Количество = 2;
// Изменение существующей строки
Документ.Товары[0].Цена = 15000;
Удаление строк:
// Удаление по индексу
Документ.Товары.Удалить(0);
// Удаление всех строк
Документ.Товары.Очистить();
Поиск и фильтрация:
// Поиск строки по условию
НайденнаяСтрока = Документ.Товары.Найти(Новая Структура("Номенклатура", Справочники.Номенклатура.Монитор));
// Фильтрация с использованием запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК Товары
|ГДЕ
| Товары.Количество > 10";
Результат = Запрос.Выполнить();
Для работы с динамическими табличными частями используйте объект ТаблицаЗначений:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число",,, 10, 2));
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.Монитор;
НоваяСтрока.Цена = 18000;
При работе с большими табличными частями (более 1000 строк) используйте метод ЗагрузитьКолонку() для оптимизации производительности. Он позволяет загружать данные колонки пакетами, а не целиком.
Типичные ошибки при работе с табличными частями
Даже опытные разработчики иногда сталкиваются с проблемами при использовании табличных частей. Вот наиболее распространенные ошибки и способы их избежать:
1. Пустые ссылки в колонках
Если не проверить заполненность ссылочных полей (например, Номенклатура), при записи документа может возникнуть ошибка "Недопустимое значение". Всегда используйте конструкцию:
Если НЕ ЗначениеЗаполнено(СтрокаТоваров.Номенклатура) Тогда
Сообщить("Не указана номенклатура!");
Прервать;
КонецЕсли;
2. Неправильная привязка к родительскому объекту
При программном создании строки табличной части без указания владельца (например, через НоваяСтрока = Новый Структура()) данные не сохранятся. Всегда добавляйте строки через методы табличной части:
// Правильно:
НоваяСтрока = Документ.Товары.Добавить();
// Неправильно:
НоваяСтрока = Новый Структура("Номенклатура, Количество", ..., ...);
3. Игнорирование событий
Табличные части имеют события (например, ПриИзменении), которые позволяют контролировать ввод данных. Если не обрабатывать их, пользователь может ввести некорректные значения (отрицательное количество, неверный формат даты).
4. Избыточные данные в табличной части
Хранение редко используемых полей в табличной части документа увеличивает размер базы. Для таких данных лучше использовать отдельные регистры сведений или справочники.
5. Проблемы с правами доступа
Если пользователь не имеет прав на изменение табличной части, но может редактировать документ, это приведет к ошибкам при сохранении. Настройте права в ролях (Конфигурация → Роли).
Как исправить ошибку "Табличная часть не найдена"
Эта ошибка возникает, если в коде обращаются к табличной части, которая была удалена или переименована в конфигураторе. Проверьте:
1. Совпадает ли имя табличной части в коде и в конфигурации.
2. Не было ли обновления конфигурации, после которого изменилась структура.
3. Правильно ли указан путь к табличной части (например, Документ.Товары, а не Документ.ТабличнаяЧасть1).
Примеры использования табличных частей в типовых конфигурациях
Рассмотрим, как табличные части применяются в стандартных конфигурациях 1С (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11):
1. Документ "Поступление товаров и услуг"
Содержит табличные части:
При проведении документа данные из табличной части Товары формируют движения по регистрам ТоварыНаСкладах и ПартииТоваровНаСкладах.
2. Справочник "Номенклатура"
Может включать табличные части:
3. Документ "Заказ покупателя"
Табличные части:
4. Отчет "Анализ продаж"
Использует динамические табличные части для:
В 1С:Зарплата и управление персоналом табличные части применяются для:
В типовых конфигурациях табличные части часто связывают с регистрами накопления или сведений. Это позволяет автоматически формировать движения при проведении документов, не писать код вручную.
Оптимизация работы с табличными частями
При большом объеме данных табличные части могут замедлять работу системы. Вот способы оптимизации:
1. Индексирование колонок
Если табличная часть часто фильтруется по определенному полю (например, Номенклатура), добавьте индекс:
2. Использование отборов
При выборке данных из табличной части всегда применяйте отборы, чтобы не грузить лишние строки:
Отбор = Новый Структура("Номенклатура", Справочники.Номенклатура.Монитор);
Данные = Документ.Товары.НайтиСтроки(Отбор);
3. Пакетная обработка
При массовом изменении данных используйте транзакции и пакетные операции:
НачатьТранзакцию();
Для Каждого Строка Из Документ.Товары Цикл
Строка.Цена = Строка.Цена * 1.1; // Повышение цен на 10%
КонецЦикла;
ЗафиксироватьТранзакцию();
4. Кэширование данных
Если табличная часть часто используется в отчетах, кэшируйте ее данные в временной таблице:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Итого
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &СсылкаНаДокумент
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура";
Запрос.УстановитьПараметр("СсылкаНаДокумент", Документ.Ссылка);
Результат = Запрос.Выполнить().Выгрузить();
5. Разделение больших табличных частей
Если табличная часть содержит более 1000 строк, разбейте ее на несколько логических частей. Например, в документе Инвентаризация можно выделить:
- 📦
ТоварыНаСкладе— фактическое наличие. - ✅
Расхождения— только строки с отклонениями. - Не вызван метод
Записать()для родительского объекта. - Отсутствуют права на изменение табличной части у текущего пользователя.
- В модуле объекта переопределено событие
ПередЗаписью, которое отменяет запись.
⚠️ Внимание: В клиент-серверном варианте работы 1С табличные части передаются между клиентом и сервером целиком. Если в табличной части 10 000 строк, это может вызвать зависание интерфейса. Для таких случаев используйте серверные процедуры или временные таблицы.
FAQ: Частые вопросы о табличных частях в 1С
Можно ли создать табличную часть без родительского объекта?
Нет, табличная часть всегда принадлежит какому-либо объекту конфигурации (документу, справочнику и т.д.). Однако можно эмулировать независимую таблицу с помощью ТаблицаЗначений или регистра сведений.
Как перенести данные из одной табличной части в другую?
Используйте цикл по строкам исходной табличной части и метод Добавить() для целевой:
Для Каждого Строка Из Источник.Товары Цикл
НоваяСтрока = Приемник.Товары.Добавить();
НоваяСтрока.Номенклатура = Строка.Номенклатура;
НоваяСтрока.Количество = Строка.Количество;
КонецЦикла;
Почему при изменении табличной части не сохраняются данные?
Вероятные причины:
Как сделать табличную часть обязательной (не менее N строк)?
В свойствах табличной части в конфигураторе установите параметр Минимальное количество строк. Также можно добавить проверку в модуле объекта:
Процедура ПередЗаписью(Отказ)
Если Товары.Количество() = 0 Тогда
Сообщить("Добавьте хотя бы одну позицию!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Можно ли в табличной части хранить файлы (например, сканы документов)?
Да, для этого добавьте колонку типа ХранилищеЗначения или Строка (для пути к файлу). Однако для большого количества файлов лучше использовать отдельный справочник Файлы со ссылкой на него из табличной части.