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

В этой статье мы разберём что такое табличная часть в 1С на практике: от базового определения до нюансов программирования. Вы узнаете, как создать табличную часть в документе или справочнике, какие типы данных она поддерживает, и как избежать типичных ошибок при работе с ней. А для разработчиков — рассмотрим примеры кода на встроенном языке 1С 8.3, которые помогут автоматизировать заполнение и обработку табличных данных.

Что такое табличная часть в 1С простыми словами

Табличная часть в 1С:Предприятие — это объект конфигурации, который представляет собой таблицу с набором строк и столбцов. Она используется для хранения многозначных данных (например, списка товаров в документе «Реализация» или перечня сотрудников в приказе). В отличие от обычных реквизитов (которые хранят одно значение), табличная часть позволяет добавлять неограниченное количество строк с одинаковой структурой.

Примеры использования:

  • 📄 Документы: список товаров в накладной, услуг в акте выполненных работ.
  • 📚 Справочники: контактные лица контрагента, адреса доставки.
  • 📊 Отчёты: детализация по строкам (например, расшифровка оборотов по счёту).
  • ⚙️ Регистры: движения по регистру накопления (например, остатки товаров).

Важно понимать, что табличная часть — это не просто «таблица на форме», а полноценный объект базы данных. Она хранится в SQL-таблице (если используется файловый или клиент-серверный вариант 1С) и имеет собственные свойства, методы и события.

📊 Где вы чаще всего используете табличные части в 1С?
В документах
В справочниках
В отчетах
В регистрах
Не использую

Виды табличных частей: динамическая vs статическая

В 1С 8.3 табличные части делятся на два основных типа: статические и динамические. Их отличие кроется в способе хранения данных и возможностях редактирования.

Характеристика Статическая табличная часть Динамическая табличная часть
Хранение данных В составе объекта (например, документа) В отдельной таблице базы данных
Производительность Быстрее при небольшом количестве строк Медленнее, но масштабируема для больших объёмов
Редактирование Только через объект-владелец Можно редактировать независимо (например, через запрос)
Пример использования Список товаров в накладной История изменений цен номенклатуры

🔹 Статическая табличная часть создаётся вместе с объектом (например, документом «Поступление товаров») и удаляется при удалении этого объекта. Она подходит для случаев, когда данные тесно связаны с владельцем и не требуют отдельной обработки. Например, строки товара в накладной не имеют смысла без самой накладной.

🔹 Динамическая табличная часть хранится отдельно и может существовать независимо. Её удобно использовать для исторических данных или когда нужно анализировать строки вне контекста владельца. Например, история цен номенклатуры может храниться в динамической табличной части справочника «Номенклатура», и к ней можно обращаться даже если сама номенклатура удалена.

⚠️ Внимание: В последних версиях 1С:Предприятие 8.3 (начиная с платформы 8.3.20) появилась возможность преобразовывать статические табличные части в динамические и обратно через Конфигуратор → Объекты → [Выбрать объект] → Табличные части. Однако это требует перезаписи данных и может привести к потере связей, если не сделать резервную копию!

Как создать табличную часть в конфигураторе: пошаговая инструкция

Добавить табличную часть можно как в документ, так и в справочник. Рассмотрим процесс на примере документа «Заказ клиента».

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

  2. Выберите документ «Заказ клиента» (или создайте новый) и откройте его свойства двойным кликом.

  3. На вкладке Данные нажмите кнопку Добавить и выберите Табличная часть.

  4. Задайте имя (например, Товары) и настройте состав колонок:

    • 📌 Номенклатура (тип СправочникСсылка.Номенклатура)
    • 📌 Количество (тип Число, 10, 3)
    • 📌 Цена (тип Число, 10, 2)
    • 📌 Сумма (тип Число, 10, 2, вычисляемое поле)
  5. На вкладке Формы добавьте табличную часть на форму документа (перетащите её из палитры элементов).

  6. Сохраните конфигурацию (F7) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

  7. Данные колонок соответствуют бизнес-логике|

    Указаны правильные типы данных (например, не текст вместо числа)|

    Вычисляемые поля (например, Сумма = Цена × Количество) настроены|

    Табличная часть добавлена на форму документа/справочника-->

    После создания табличной части её можно заполнять данными в 1С:Предприятии через интерфейс пользователя или программно. Например, чтобы добавить строку в табличную часть Товары документа ЗаказКлиента, используйте код:

    Док = Документы.ЗаказКлиента.СоздатьДокумент;
    

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

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

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

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

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

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

    Для программистов табличные части — это не только интерфейсный элемент, но и объект со своими методами и свойствами. Рассмотрим ключевые приёмы работы с ними.

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

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

    • 📝 Добавить — создаёт новую строку.
    • 🗑️ Удалить — удаляет текущую строку.
    • 🔄 Очистить — удаляет все строки.
    • 🔍 Найти — ищет строку по условию.

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

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

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

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

КонецЕсли;

КонецЦикла;

2. Вычисление итогов

Часто требуется посчитать сумму по колонке (например, общую стоимость товаров). Для этого используйте цикл или метод Итог:

ИтоговаяСумма = 0;

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

ИтоговаяСумма = ИтоговаяСумма + Строка.Сумма;

КонецЦикла;

💡

Если табличная часть большая (тысячи строк), для ускорения расчётов используйте Запрос с агрегирующими функциями (СУММА, КОЛИЧЕСТВО).

3. Работа с динамическими табличными частями

Динамические табличные части поддерживают версионность и отдельные запросы. Например, чтобы получить все строки табличной части ИсторияЦен справочника Номенклатура:

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

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

"ВЫБРАТЬ

| ИсторияЦен.Номенклатура КАК Номенклатура,

| ИсторияЦен.Цена КАК Цена,

| ИсторияЦен.Дата КАК Дата

|ИЗ

| Справочник.Номенклатура.ИсторияЦен КАК ИсторияЦен

|ГДЕ

| ИсторияЦен.Номенклатура = &Номенклатура";

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

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

⚠️ Внимание: При работе с динамическими табличными частями через Запрос учитывайте, что изменения, сделанные напрямую в таблице базы данных, не триггерят события объекта-владельца (например, ПриЗаписи документа). Это может привести к рассинхронизации данных!

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

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

  1. «Потерялись данные после обновления конфигурации»

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

  2. «Не обновляются вычисляемые поля»

    Если поле Сумма рассчитывается как Цена × Количество, но не пересчитывается при изменении цены, проверьте, что в свойствах колонки установлен флаг Вычисляемое и прописана формула.

  3. «Медленная работа с большими табличными частями»

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

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

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

1. Вызван ли метод Записать для объекта-владельца (документа/справочника).

2. Нет ли обработчика события ПередЗаписью, который сбрасывает изменения.

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

Ещё одна частая проблема — дублирование строк. Она возникает, если в коде не проверяется наличие строки перед добавлением. Чтобы избежать дублей, используйте конструкцию:

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

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

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

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

КонецЕсли;

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

В стандартных конфигурациях 1С:Бухгалтерия, 1С:УТ или 1С:ЗУП табличные части применяются повсеместно. Рассмотрим несколько примеров:

Конфигурация Объект Табличная часть Назначение
1С:Бухгалтерия 3.0 Документ «Поступление (акты, накладные)» Товары Список поступивших товаров с ценами и количеством
1С:Управление торговлей 11 Документ «Заказ клиента» Товары, Услуги Номенклатура для продажи с резервированием
1С:Зарплата и управление персоналом Документ «Начисление зарплаты» Начисления Расшифровка начислений по сотрудникам
1С:ERP Справочник «Номенклатура» ЦеныНоменклатуры История изменения цен (динамическая табличная часть)

🔹 В 1С:Бухгалтерия табличная часть Товары в документе «Реализация» автоматически формирует движения по регистрам ТоварыНаСкладах и Продажи. Если в ней ошибка (например, неверная цена), это приведёт к неправильным проводкам.

🔹 В 1С:ЗУП табличная часть Начисления связана с расчётом НДФЛ и страховых взносов. Изменение данных вручную может нарушить логику расчётов, поэтому лучше использовать обработки для массового редактирования.

💡

В типовых конфигурациях табличные части часто имеют предопределённые обработчики событий (например, ПриИзменении для колонки Количество). Изменяя их, тестируйте влияние на связанные документы (например, счета-фактуры или отчёты).

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

Часто требуется перенести данные из табличной части в Excel, JSON или другой формат — или наоборот, загрузить их из внешнего источника. Рассмотрим основные способы.

1. Экспорт в Excel

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

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

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

// Сохранить в файл

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

2. Импорт из Excel

Для загрузки данных из Excel в табличную часть используйте ЧтениеXML или библиотеку OneScript.Excel (для сложных файлов). Пример простого импорта:

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

ТабДок.Прочитать("C:\Temp\Товары.xlsx");

Для Каждого СтрокаТабДок Из ТабДок.Область("A2:C100").ВыбратьСтроки Цикл

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

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТабДок.Ячейка("A").Текст);

НоваяСтрока.Количество = Число(СтрокаТабДок.Ячейка("B").Текст);

НоваяСтрока.Цена = Число(СтрокаТабДок.Ячейка("C").Текст);

КонецЦикла;

3. Обмен данными через JSON

Для интеграции с внешними системами удобно использовать JSON. Пример сериализации табличной части:

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку;

ЗаписьJSON.ЗаписатьНачалоОбъекта;

ЗаписьJSON.ЗаписатьКлюч("Товары");

ЗаписьJSON.ЗаписатьНачалоМассива;

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

ЗаписьJSON.ЗаписатьНачалоОбъекта;

ЗаписьJSON.ЗаписатьКлюч("Номенклатура");

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

ЗаписьJSON.ЗаписатьКлюч("Количество");

ЗаписьJSON.ЗаписатьЗначение(Строка.Количество);

ЗаписьJSON.ЗаписатьКонецОбъекта;

КонецЦикла;

ЗаписьJSON.ЗаписатьКонецМассива;

ЗаписьJSON.ЗаписатьКонецОбъекта;

РезультатJSON = ЗаписьJSON.Закрыть;

⚠️ Внимание: При импорте данных из внешних источников всегда проверяйте соответствие типов данных. Например, если в Excel количество указано как текст ("5"), а в 1С ожидается число, возникнет ошибка. Используйте функцию Число для приведения типов.

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

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

Да, но для этого нужно:

  1. Использовать колонку типа СправочникСсылка.Номенклатура (где хранятся и товары, и услуги).
  2. Добавить колонку ТипНоменклатуры (перечисление: Товар, Услуга) для фильтрации.
  3. В форме документа настроить отбор по типу при добавлении строк.

Пример кода для фильтра:

Процедура ТоварыТипНоменклатурыПриИзменении(Элемент)

Если Элемент.Значение = Перечисления.ТипыНоменклатуры.Товар Тогда

ЭлементыФормы.Номенклатура.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Номенклатура", Новый КвалификаторыСсылки(Тип("СправочникСсылка.Номенклатура"), ВидНоменклатуры.Товар));

КонецЕсли;

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

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

Сортировку можно настроить:

  • 📌 В конфигураторе: на вкладке табличной части укажите колонку для сортировки в свойстве Порядок.
  • 📌 Программно: используйте метод Сортировать:
Док.Товары.Сортировать("Номенклатура Возр"); // По наименованию по возрастанию

Для динамических табличных частей сортировку можно задать в запросе с помощью УПОРЯДОЧИТЬ ПО.

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

Это типичная проблема, если:

  1. В обработчике ОбработкаКопирования не прописано копирование табличной части.
  2. Табличная часть динамическая — в этом случае её нужно копировать отдельно через запрос.

Решение для статической табличной части:

Процедура ОбработкаКопирования(Источник, Цель)

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

НоваяСтрока = Цель.Товары.Добавить;

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

КонецЦикла;

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

Как запретить редактирование табличной части для определённых пользователей?

Ограничьте права через:

  • 🔒 Роли: в конфигураторе откройте роль пользователя и снимите флаг Редактирование для табличной части.
  • 🔒 Программно: в обработчике ПередЗаписью проверяйте права:
Процедура ПередЗаписью(Отказ)

Если НЕ Пользователь.ПроверитьПрава("РедактированиеТабличныхЧастей") Тогда

Сообщить("У вас нет прав на редактирование табличной части!");

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

КонецЕсли;

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

Можно ли в табличной части использовать картинки?

Да, но с оговорками:

  • 🖼️ В колонке типа ХранилищеЗначения можно хранить двоичные данные (например, загруженные изображения).
  • 🖼️ Для отображения на форме используйте элемент ПолеHTMLДокумента или ПолеКартинки (в управляемых формах).
  • 🖼️ Пример загрузки картинки в строку:
НоваяСтрока = Док.Товары.Добавить;

НоваяСтрока.Картинка = Новый ХранилищеЗначения(ПолучитьИзображениеИзФайла("C:\Temp\photo.jpg"));

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