В системе 1С:Предприятие табличные части — это один из ключевых элементов, который позволяет структурировать данные в виде строк и столбцов. Без них невозможно представить работу с документами, справочниками или отчетами, где требуется хранить списки товаров, услуг, сотрудников или любых других объектов. Однако для новичков (и даже опытных пользователей) этот инструмент часто остаётся «чёрным ящиком»: непонятно, как его правильно настроить, чем динамическая табличная часть отличается от статической, и почему иногда данные «исчезают» после обновления конфигурации.
В этой статье мы разберём что такое табличная часть в 1С на практике: от базового определения до нюансов программирования. Вы узнаете, как создать табличную часть в документе или справочнике, какие типы данных она поддерживает, и как избежать типичных ошибок при работе с ней. А для разработчиков — рассмотрим примеры кода на встроенном языке 1С 8.3, которые помогут автоматизировать заполнение и обработку табличных данных.
Что такое табличная часть в 1С простыми словами
Табличная часть в 1С:Предприятие — это объект конфигурации, который представляет собой таблицу с набором строк и столбцов. Она используется для хранения многозначных данных (например, списка товаров в документе «Реализация» или перечня сотрудников в приказе). В отличие от обычных реквизитов (которые хранят одно значение), табличная часть позволяет добавлять неограниченное количество строк с одинаковой структурой.
Примеры использования:
- 📄 Документы: список товаров в накладной, услуг в акте выполненных работ.
- 📚 Справочники: контактные лица контрагента, адреса доставки.
- 📊 Отчёты: детализация по строкам (например, расшифровка оборотов по счёту).
- ⚙️ Регистры: движения по регистру накопления (например, остатки товаров).
Важно понимать, что табличная часть — это не просто «таблица на форме», а полноценный объект базы данных. Она хранится в SQL-таблице (если используется файловый или клиент-серверный вариант 1С) и имеет собственные свойства, методы и события.
Виды табличных частей: динамическая vs статическая
В 1С 8.3 табличные части делятся на два основных типа: статические и динамические. Их отличие кроется в способе хранения данных и возможностях редактирования.
| Характеристика | Статическая табличная часть | Динамическая табличная часть |
|---|---|---|
| Хранение данных | В составе объекта (например, документа) | В отдельной таблице базы данных |
| Производительность | Быстрее при небольшом количестве строк | Медленнее, но масштабируема для больших объёмов |
| Редактирование | Только через объект-владелец | Можно редактировать независимо (например, через запрос) |
| Пример использования | Список товаров в накладной | История изменений цен номенклатуры |
🔹 Статическая табличная часть создаётся вместе с объектом (например, документом «Поступление товаров») и удаляется при удалении этого объекта. Она подходит для случаев, когда данные тесно связаны с владельцем и не требуют отдельной обработки. Например, строки товара в накладной не имеют смысла без самой накладной.
🔹 Динамическая табличная часть хранится отдельно и может существовать независимо. Её удобно использовать для исторических данных или когда нужно анализировать строки вне контекста владельца. Например, история цен номенклатуры может храниться в динамической табличной части справочника «Номенклатура», и к ней можно обращаться даже если сама номенклатура удалена.
⚠️ Внимание: В последних версиях 1С:Предприятие 8.3 (начиная с платформы 8.3.20) появилась возможность преобразовывать статические табличные части в динамические и обратно через Конфигуратор → Объекты → [Выбрать объект] → Табличные части. Однако это требует перезаписи данных и может привести к потере связей, если не сделать резервную копию!
Как создать табличную часть в конфигураторе: пошаговая инструкция
Добавить табличную часть можно как в документ, так и в справочник. Рассмотрим процесс на примере документа «Заказ клиента».
Откройте Конфигуратор и перейдите в ветку
Объекты → Документы.Выберите документ «Заказ клиента» (или создайте новый) и откройте его свойства двойным кликом.
На вкладке
Данныенажмите кнопкуДобавитьи выберитеТабличная часть.Задайте имя (например,
Товары) и настройте состав колонок:- 📌
Номенклатура(тип СправочникСсылка.Номенклатура) - 📌
Количество(тип Число, 10, 3) - 📌
Цена(тип Число, 10, 2) - 📌
Сумма(тип Число, 10, 2, вычисляемое поле)
- 📌
На вкладке
Формыдобавьте табличную часть на форму документа (перетащите её из палитры элементов).Сохраните конфигурацию (
F7) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).- 📝
Добавить— создаёт новую строку. - 🗑️
Удалить— удаляет текущую строку. - 🔄
Очистить— удаляет все строки. - 🔍
Найти— ищет строку по условию.
Данные колонок соответствуют бизнес-логике|
Указаны правильные типы данных (например, не текст вместо числа)|
Вычисляемые поля (например, Сумма = Цена × Количество) настроены|
Табличная часть добавлена на форму документа/справочника-->
После создания табличной части её можно заполнять данными в 1С:Предприятии через интерфейс пользователя или программно. Например, чтобы добавить строку в табличную часть Товары документа ЗаказКлиента, используйте код:
Док = Документы.ЗаказКлиента.СоздатьДокумент;
НоваяСтрока = Док.Товары.Добавить;
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Стул офисный");
НоваяСтрока.Количество = 2;
НоваяСтрока.Цена = 1500;
Док.Записать;
Работа с табличными частями на встроенном языке 1С
Для программистов 1С табличные части — это не только интерфейсный элемент, но и объект со своими методами и свойствами. Рассмотрим ключевые приёмы работы с ними.
1. Добавление, удаление и редактирование строк
Чтобы управлять строками табличной части, используйте методы:
Пример кода для удаления строк с нулевым количеством:
Для Каждого Строка Из Док.Товары Цикл
Если Строка.Количество = 0 Тогда
Док.Товары.Удалить(Строка);
КонецЕсли;
КонецЦикла;
2. Вычисление итогов
Часто требуется посчитать сумму по колонке (например, общую стоимость товаров). Для этого используйте цикл или метод Итог:
ИтоговаяСумма = 0;
Для Каждого Строка Из Док.Товары Цикл
ИтоговаяСумма = ИтоговаяСумма + Строка.Сумма;
КонецЦикла;
Если табличная часть большая (тысячи строк), для ускорения расчётов используйте Запрос с агрегирующими функциями (СУММА, КОЛИЧЕСТВО).
3. Работа с динамическими табличными частями
Динамические табличные части поддерживают версионность и отдельные запросы. Например, чтобы получить все строки табличной части ИсторияЦен справочника Номенклатура:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсторияЦен.Номенклатура КАК Номенклатура,
| ИсторияЦен.Цена КАК Цена,
| ИсторияЦен.Дата КАК Дата
|ИЗ
| Справочник.Номенклатура.ИсторияЦен КАК ИсторияЦен
|ГДЕ
| ИсторияЦен.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаНоменклатуру);
Результат = Запрос.Выполнить;
⚠️ Внимание: При работе с динамическими табличными частями черезЗапросучитывайте, что изменения, сделанные напрямую в таблице базы данных, не триггерят события объекта-владельца (например,ПриЗаписидокумента). Это может привести к рассинхронизации данных!
Типичные ошибки при работе с табличными частями и как их избежать
Даже опытные пользователи и разработчики сталкиваются с проблемами при работе с табличными частями. Вот наиболее распространённые ошибки и способы их решения:
-
«Потерялись данные после обновления конфигурации»
Причина: при изменении структуры табличной части (например, переименовании колонки) старые данные могут не перенестись автоматически. Всегда делайте
Выгрузку данных (dt)перед обновлением и проверяйте миграцию черезСравнитьКонфигурации. -
«Не обновляются вычисляемые поля»
Если поле
Суммарассчитывается какЦена × Количество, но не пересчитывается при изменении цены, проверьте, что в свойствах колонки установлен флагВычисляемоеи прописана формула. -
«Медленная работа с большими табличными частями»
Если в документе тысячи строк, используйте динамические табличные части или разбивайте данные на несколько таблиц. Также поможет отключение
Автонумерации строк(если она не нужна).
Почему в табличной части не сохраняются изменения?
Если после редактирования строки в табличной части изменения не сохраняются, проверьте:
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С
Можно ли в одной табличной части хранить разные типы номенклатуры (товары и услуги)?
Да, но для этого нужно:
- Использовать колонку типа
СправочникСсылка.Номенклатура(где хранятся и товары, и услуги). - Добавить колонку
ТипНоменклатуры(перечисление: Товар, Услуга) для фильтрации. - В форме документа настроить отбор по типу при добавлении строк.
Пример кода для фильтра:
Процедура ТоварыТипНоменклатурыПриИзменении(Элемент)
Если Элемент.Значение = Перечисления.ТипыНоменклатуры.Товар Тогда
ЭлементыФормы.Номенклатура.ОграничениеТипа = Новый ОписаниеТипов("СправочникСсылка.Номенклатура", Новый КвалификаторыСсылки(Тип("СправочникСсылка.Номенклатура"), ВидНоменклатуры.Товар));
КонецЕсли;
КонецПроцедуры
Как сделать сортировку строк в табличной части по умолчанию?
Сортировку можно настроить:
- 📌 В конфигураторе: на вкладке табличной части укажите колонку для сортировки в свойстве
Порядок. - 📌 Программно: используйте метод
Сортировать:
Док.Товары.Сортировать("Номенклатура Возр"); // По наименованию по возрастанию
Для динамических табличных частей сортировку можно задать в запросе с помощью УПОРЯДОЧИТЬ ПО.
Почему при копировании документа табличная часть не копируется?
Это типичная проблема, если:
- В обработчике
ОбработкаКопированияне прописано копирование табличной части. - Табличная часть динамическая — в этом случае её нужно копировать отдельно через запрос.
Решение для статической табличной части:
Процедура ОбработкаКопирования(Источник, Цель)
Для Каждого Строка Из Источник.Товары Цикл
НоваяСтрока = Цель.Товары.Добавить;
НоваяСтрока.Заполнить(Строка);
КонецЦикла;
КонецПроцедуры
Как запретить редактирование табличной части для определённых пользователей?
Ограничьте права через:
- 🔒 Роли: в конфигураторе откройте роль пользователя и снимите флаг
Редактированиедля табличной части. - 🔒 Программно: в обработчике
ПередЗаписьюпроверяйте права:
Процедура ПередЗаписью(Отказ)
Если НЕ Пользователь.ПроверитьПрава("РедактированиеТабличныхЧастей") Тогда
Сообщить("У вас нет прав на редактирование табличной части!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Можно ли в табличной части использовать картинки?
Да, но с оговорками:
- 🖼️ В колонке типа
ХранилищеЗначенияможно хранить двоичные данные (например, загруженные изображения). - 🖼️ Для отображения на форме используйте элемент
ПолеHTMLДокументаилиПолеКартинки(в управляемых формах). - 🖼️ Пример загрузки картинки в строку:
НоваяСтрока = Док.Товары.Добавить;
НоваяСтрока.Картинка = Новый ХранилищеЗначения(ПолучитьИзображениеИзФайла("C:\Temp\photo.jpg"));
Однако хранить изображения в табличной части неэффективно — лучше использовать отдельный справочник с картинками и ссылаться на него.