Разработка и Конфигурация · 11 мин
Табличная часть в 1С: как сделать и работать с ней
Как сделать табличную часть в 1С: добавление в конфигураторе, программное заполнение, обход строк, типовые ошибки и проверка результата. Практическая инструкция.
Табличная часть — это вложенная таблица внутри объекта 1С: документа, справочника или обработки. Классический пример — список товаров в документе «Реализация товаров и услуг»: шапка хранит контрагента и дату, а табличная часть «Товары» — номенклатуру, количество и цены по каждой строке. Без табличных частей невозможно представить ни один документ со списком позиций.
Работа с табличной частью делится на два больших блока: создание структуры в конфигураторе (для разработчика) и заполнение данными — вручную пользователем или программно из встроенного языка. Ошибки допускают на обоих этапах: неверный тип колонки ломает итоги, а неправильный программный обход строк приводит к потере данных при записи документа.
Ниже разобраны оба сценария: как добавить табличную часть в объект конфигурации, какие реквизиты в ней создать, как заполнять и обходить строки кодом, как проверить результат и каких ошибок избегать. Примеры приведены на встроенном языке 1С и подходят для большинства типовых и самописных конфигураций на управляемых формах.
Когда нужна табличная часть, а когда другой механизм
Табличная часть подходит, когда строки жёстко привязаны к владельцу и не имеют самостоятельного смысла: позиции товаров в накладной, этапы в заказе, сотрудники в ведомости. Строка не существует без документа — это и достоинство (целостность данных), и ограничение (нельзя сослаться на конкретную строку из другого объекта).
Если строкам нужна самостоятельная жизнь — свои статусы, ссылки из других документов, история изменений — правильнее использовать регистр сведений или отдельный документ. Например, график работы сотрудников лучше хранить в регистре, а не в табличной части справочника: иначе аналитика по периодам превратится в ручной разбор строк.
Что выбрать для хранения списка
Строки принадлежат документу, удаляются вместе с ним. Подходит для товаров, услуг, этапов. Ограничение: нельзя сослаться на строку извне.
Записи независимы, есть периодичность и отборы. Подходит для цен, графиков, статусов. Требует отдельной логики связи с объектом.
Временная структура только в памяти, не хранится в базе. Используется для промежуточных расчётов и обработок.
Создание табличной части в конфигураторе
Откройте конфигуратор, найдите нужный объект (например, документ) в дереве конфигурации и разверните его ветку. Правой кнопкой по пункту «Табличные части» выберите «Добавить». Задайте имя — оно должно быть понятным и в единственном или множественном числе по смыслу: «Товары», «Услуги», «Сотрудники». Имя используется в коде, поэтому избегайте сокращений вроде «ТЧ1».
Далее создайте реквизиты табличной части — это её колонки. Для каждой колонки укажите тип: ссылка на справочник для номенклатуры, число с точностью для количества и суммы, строка для комментария. Для денежных сумм принято использовать Число с длиной 15 и точностью 2, для количества — точность 3, чтобы корректно работать с дробными единицами измерения.
После добавления колонок обновите конфигурацию базы данных (F7 или меню «Конфигурация → Обновить конфигурацию базы данных»). Если объект уже использовался в рабочей базе, 1С выполнит реструктуризацию — при большом объёме данных это может занять время, поэтому на рабочей базе обновление делают в нерабочие часы и после резервной копии.
- 1Откройте объект в конфигураторе, ветка «Табличные части» → «Добавить»
- 2Задайте имя, например «Товары», и синоним для отображения пользователю
- 3Добавьте реквизиты-колонки с корректными типами и точностью чисел
- 4Добавьте табличную часть на форму объекта через редактор формы
- 5Обновите конфигурацию базы данных и проверьте в режиме предприятия
Вывод табличной части на форму
Сама по себе табличная часть в интерфейсе не появится — её нужно добавить на форму объекта. Откройте форму документа, в дереве реквизитов формы найдите «Объект» и перетащите табличную часть в дерево элементов формы. 1С автоматически создаст таблицу с колонками по составу реквизитов.
Проверьте свойства таблицы: для большинства случаев должны быть включены «Изменять состав строк» (иначе пользователь не сможет добавлять строки) и командная панель с кнопками «Добавить» и «Удалить». Если колонка должна быть только для чтения — например, рассчитанная сумма — установите у неё свойство «ТолькоПросмотр» или «РедактированиеТекста = Ложь».
Заполнение табличной части вручную и программно
Ручное заполнение пользователем
В режиме предприятия пользователь открывает документ, переходит на вкладку с табличной частью и нажимает «Добавить» или клавишу Insert. В строке выбирает номенклатуру, вводит количество и цену; сумма обычно рассчитывается автоматически обработчиком «ПриИзменении» колонки. Множественный подбор товаров в типовых конфигурациях выполняется через кнопку «Подбор», которая открывает форму выбора с добавлением сразу нескольких позиций.
Программное добавление строк
Для программного заполнения используется метод Добавить() коллекции табличной части, после чего заполняются поля новой строки. Типовой фрагмент выглядит так:
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденныйТовар;
НоваяСтрока.Количество = 2;
НоваяСтрока.Цена = 1500;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Если данные приходят из внешнего источника (файл, запрос), добавление строк выполняется в цикле по источнику. Перед массовым заполнением очистите табличную часть методом Очистить(), если строки не должны дублироваться при повторном запуске обработки.
Обход и изменение существующих строк
Для пересчёта сумм, простановки скидки или проверки заполненности строки обходят циклом «Для Каждого». Внутри цикла доступны все колонки текущей строки:
Для Каждого СтрокаТовара Из Объект.Товары Цикл
Если СтрокаТовара.Количество = 0 Тогда
Сообщить("В строке " + СтрокаТовара.НомерСтроки + " не указано количество");
КонецЕсли;
СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;
КонецЦикла;
Для поиска конкретной строки вместо цикла используйте метод Найти(Значение, "ИмяКолонки") или НайтиСтроки() с отбором по нескольким полям — это быстрее и читаемее на больших таблицах. Удаление строк в цикле делайте в обратном порядке или собирайте строки в массив и удаляйте после цикла, иначе нумерация «поедет» и часть строк будет пропущена.
// Поиск и удаление строк с нулевым количеством
Отбор = Новый Структура("Количество", 0);
СтрокиКУдалению = Объект.Товары.НайтиСтроки(Отбор);
Для Каждого Строка Из СтрокиКУдалению Цикл
Объект.Товары.Удалить(Строка);
КонецЦикла;Обработчики событий табличной части
Логику пересчёта принято размещать в обработчиках событий формы: «ПриИзменении» для колонок количества и цены (пересчёт суммы), «ПриНачалеРедактирования» для подстановки значений по умолчанию в новую строку, «ПослеУдаления» для пересчёта итогов документа. На сервере, в модуле объекта, проверки дублируют в «ОбработкаПроверкиЗаполнения» — это защищает данные при обмене и фоновой записи, когда форма не участвует.
Частая схема: в «ПриИзменении» колонки «Номенклатура» подтягиваются цена и единица измерения из справочника, а затем вызывается общая процедура пересчёта строки. Выносите такой пересчёт в отдельную процедуру, чтобы вызывать её и из обработчиков, и из программного заполнения — иначе логика разойдётся.
Итог по колонке «Сумма» выводится в подвал таблицы автоматически, если у элемента формы установлено отображение итогов. Не храните «ИтогоДокумента» отдельным реквизитом без необходимости — используйте Объект.Товары.Итог("Сумма"), это всегда актуальное значение.
Проверка результата и типовые ошибки
После настройки проверьте сценарий целиком: создайте документ, добавьте несколько строк вручную, измените количество и убедитесь, что сумма пересчитывается, итог в подвале совпадает с суммой строк, документ записывается и проводится. Затем проверьте программный сценарий: обработка должна заполнить строки без дублей и не оставить пустых обязательных колонок.
Наиболее частые проблемы: сумма не пересчитывается (обработчик «ПриИзменении» не назначен на колонку в форме), строки дублируются при повторном запуске (нет Очистить() или проверки на существование), документ не проводится (не заполнена обязательная колонка, отмеченная как «Проверка заполнения: Выдавать ошибку»), итоги неверные (у колонки суммы недостаточная точность или пересчёт идёт до заполнения цены).
Как проверить результат
Меняете количество — сумма и итог обновляются сразу
Сумма остаётся старой до записи документа
Количество строк не растёт, дублей нет
Строки добавляются поверх существующих
Документ проводится без сообщений о незаполненных полях
Ошибка «Поле не заполнено» по колонке табличной части
Частые вопросы
Можно ли добавить табличную часть в типовую конфигурацию без снятия с поддержки?
Да, через механизм расширений конфигурации. Расширение позволяет добавить табличную часть и реквизиты, не изменяя основную конфигурацию, что сохраняет простое обновление. Ограничение: расширения имеют ограниченный доступ к некоторым механизмам, поэтому сложную логику иногда приходится выносить в общие модули расширения.
Как сослаться на конкретную строку табличной части из другого объекта?
Напрямую — никак: строка табличной части не является самостоятельным объектом и не имеет ссылки. Обходные варианты: хранить ссылку на документ-владелец плюс номер строки или ключевые поля строки, либо перенести данные в регистр сведений, где каждая запись адресуется независимо.
Почему табличная часть пустая после записи документа программно?
Чаще всего строки добавлялись в данные формы, но объект не был записан после заполнения, либо заполнение выполнялось в другом экземпляре объекта. Проверьте, что после цикла добавления строк вызывается Записать() именно того объекта, в который добавлялись строки, и что между заполнением и записью не вызывается Очистить() или повторное чтение объекта.
Как выгрузить табличную часть в таблицу значений?
Методом Выгрузить(): ТЗ = Объект.Товары.Выгрузить(). Полученную таблицу значений можно сворачивать, сортировать, передавать в запрос как временную таблицу или выводить в табличный документ. Для выгрузки отдельных колонок передайте их имена строкой: Выгрузить(, "Номенклатура, Сумма").
Как запретить пользователю удалять строки, но разрешить редактирование?
В свойствах таблицы формы снимите разрешение на изменение состава строк или перехватите событие «ПередУдалением» и установите Отказ = Истина с поясняющим сообщением. Для надёжности продублируйте запрет в модуле объекта при записи, сравнив состав строк с сохранённым состоянием.
Что важно запомнить
Табличная часть создаётся в конфигураторе, выводится на форму и заполняется вручную или кодом через Добавить() и цикл обхода. Расчёты выносите в общие процедуры, проверки дублируйте на сервере, а перед реструктуризацией рабочей базы делайте резервную копию.