К статье
Практический материал

Разработка и Конфигурация · 11 мин

Табличная часть в 1С: как сделать и работать с ней

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

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

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

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

Когда нужна табличная часть, а когда другой механизм

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

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

Что выбрать для хранения списка

Табличная часть

Строки принадлежат документу, удаляются вместе с ним. Подходит для товаров, услуг, этапов. Ограничение: нельзя сослаться на строку извне.

Регистр сведений

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

Таблица значений

Временная структура только в памяти, не хранится в базе. Используется для промежуточных расчётов и обработок.

Создание табличной части в конфигураторе

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

Далее создайте реквизиты табличной части — это её колонки. Для каждой колонки укажите тип: ссылка на справочник для номенклатуры, число с точностью для количества и суммы, строка для комментария. Для денежных сумм принято использовать Число с длиной 15 и точностью 2, для количества — точность 3, чтобы корректно работать с дробными единицами измерения.

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

Порядок добавления табличной части
  1. 1
    Откройте объект в конфигураторе, ветка «Табличные части» → «Добавить»
  2. 2
    Задайте имя, например «Товары», и синоним для отображения пользователю
  3. 3
    Добавьте реквизиты-колонки с корректными типами и точностью чисел
  4. 4
    Добавьте табличную часть на форму объекта через редактор формы
  5. 5
    Обновите конфигурацию базы данных и проверьте в режиме предприятия

Вывод табличной части на форму

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

Проверьте свойства таблицы: для большинства случаев должны быть включены «Изменять состав строк» (иначе пользователь не сможет добавлять строки) и командная панель с кнопками «Добавить» и «Удалить». Если колонка должна быть только для чтения — например, рассчитанная сумма — установите у неё свойство «ТолькоПросмотр» или «РедактированиеТекста = Ложь».

Заполнение табличной части вручную и программно

Ручное заполнение пользователем

В режиме предприятия пользователь открывает документ, переходит на вкладку с табличной частью и нажимает «Добавить» или клавишу Insert. В строке выбирает номенклатуру, вводит количество и цену; сумма обычно рассчитывается автоматически обработчиком «ПриИзменении» колонки. Множественный подбор товаров в типовых конфигурациях выполняется через кнопку «Подбор», которая открывает форму выбора с добавлением сразу нескольких позиций.

Программное добавление строк

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

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

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

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

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

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

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

Обход и изменение существующих строк

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

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

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

Сообщить("В строке " + СтрокаТовара.НомерСтроки + " не указано количество");

КонецЕсли;

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

КонецЦикла;

Для поиска конкретной строки вместо цикла используйте метод Найти(Значение, "ИмяКолонки") или НайтиСтроки() с отбором по нескольким полям — это быстрее и читаемее на больших таблицах. Удаление строк в цикле делайте в обратном порядке или собирайте строки в массив и удаляйте после цикла, иначе нумерация «поедет» и часть строк будет пропущена.

1c
// Поиск и удаление строк с нулевым количеством
Отбор = Новый Структура("Количество", 0);
СтрокиКУдалению = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из СтрокиКУдалению Цикл
    Объект.Товары.Удалить(Строка);
КонецЦикла;

Обработчики событий табличной части

Логику пересчёта принято размещать в обработчиках событий формы: «ПриИзменении» для колонок количества и цены (пересчёт суммы), «ПриНачалеРедактирования» для подстановки значений по умолчанию в новую строку, «ПослеУдаления» для пересчёта итогов документа. На сервере, в модуле объекта, проверки дублируют в «ОбработкаПроверкиЗаполнения» — это защищает данные при обмене и фоновой записи, когда форма не участвует.

Частая схема: в «ПриИзменении» колонки «Номенклатура» подтягиваются цена и единица измерения из справочника, а затем вызывается общая процедура пересчёта строки. Выносите такой пересчёт в отдельную процедуру, чтобы вызывать её и из обработчиков, и из программного заполнения — иначе логика разойдётся.

Итог по колонке «Сумма» выводится в подвал таблицы автоматически, если у элемента формы установлено отображение итогов. Не храните «ИтогоДокумента» отдельным реквизитом без необходимости — используйте Объект.Товары.Итог("Сумма"), это всегда актуальное значение.
ПЗ
Практическое замечание

Проверка результата и типовые ошибки

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

Наиболее частые проблемы: сумма не пересчитывается (обработчик «ПриИзменении» не назначен на колонку в форме), строки дублируются при повторном запуске (нет Очистить() или проверки на существование), документ не проводится (не заполнена обязательная колонка, отмеченная как «Проверка заполнения: Выдавать ошибку»), итоги неверные (у колонки суммы недостаточная точность или пересчёт идёт до заполнения цены).

Типичные ошибки
01
Удаление строк в прямом цикле — нумерация смещается, часть строк пропускается. Удаляйте через НайтиСтроки или в обратном порядке.
02
Пересчёт суммы только в обработчике формы — при программном заполнении логика не срабатывает. Дублируйте расчёт в общей процедуре.
03
Недостаточная точность числа у колонки суммы — копейки округляются, итоги расходятся с проведением.
04
Отсутствие Очистить() перед повторным заполнением — строки дублируются при каждом запуске обработки.
05
Проверки только на клиенте — при обмене данными документ записывается с пустыми колонками.
Контрольные точки

Как проверить результат

Пересчёт суммы строки
Норма

Меняете количество — сумма и итог обновляются сразу

Тревожный признак

Сумма остаётся старой до записи документа

Повторный запуск заполнения
Норма

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

Тревожный признак

Строки добавляются поверх существующих

Проведение документа
Норма

Документ проводится без сообщений о незаполненных полях

Тревожный признак

Ошибка «Поле не заполнено» по колонке табличной части

Частые вопросы

Можно ли добавить табличную часть в типовую конфигурацию без снятия с поддержки?

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

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

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

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

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

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

Методом Выгрузить(): ТЗ = Объект.Товары.Выгрузить(). Полученную таблицу значений можно сворачивать, сортировать, передавать в запрос как временную таблицу или выводить в табличный документ. Для выгрузки отдельных колонок передайте их имена строкой: Выгрузить(, "Номенклатура, Сумма").

Как запретить пользователю удалять строки, но разрешить редактирование?

В свойствах таблицы формы снимите разрешение на изменение состава строк или перехватите событие «ПередУдалением» и установите Отказ = Истина с поясняющим сообщением. Для надёжности продублируйте запрет в модуле объекта при записи, сравнив состав строк с сохранённым состоянием.

Итог

Что важно запомнить

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