Разработка и Конфигурация · 11 мин
Как получить табличную часть документа в 1С
Как получить табличную часть документа 1С программно: доступ через ссылку, объект, запрос и СКД. Примеры кода, типичные ошибки и проверка результата.
Табличная часть документа в 1С — это коллекция строк, связанная с шапкой документа: товары в реализации, начисления в документе расчёта зарплаты, материалы в списании. Программно получить её можно несколькими способами: через ссылку на документ, через объект документа, запросом или в записях регистров. Выбор способа зависит от того, нужно ли только прочитать данные или их ещё и изменить.
Ключевой момент, который часто упускают новички: табличная часть не существует как отдельный объект базы данных. Она хранится вместе с документом, и обращение к ней всегда идёт через владельца — ссылку или объект документа. Поэтому сначала нужно получить сам документ, а уже затем обращаться к его табличным частям по имени, заданному в конфигураторе.
Ниже разобраны рабочие варианты получения табличной части с примерами кода, ограничения каждого подхода и типичные ошибки, которые приводят к падению производительности или ошибкам времени выполнения.
Способы доступа к табличной части: что выбрать
Существует три основных способа программно получить табличную часть документа. Первый — обращение через ссылку: СсылкаНаДокумент.Товары. При таком обращении платформа неявно считывает объект из базы целиком, но результат доступен только для чтения. Способ подходит для разового обращения к одному документу.
Второй способ — явное получение объекта: ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект(), после чего табличная часть доступна как ДокОбъект.Товары. Этот вариант обязателен, если нужно изменить строки, добавить новые или очистить табличную часть с последующей записью документа.
Третий способ — запрос к таблице табличной части. В языке запросов 1С каждая табличная часть представлена отдельной таблицей вида Документ.ИмяДокумента.ИмяТабличнойЧасти. Запрос — единственный правильный вариант, когда нужно обработать табличные части множества документов: он выполняется на сервере СУБД и не тащит в память лишние данные.
Сравнение способов
Быстро писать, только чтение. При обращении в цикле к множеству документов вызывает запрос к базе на каждой итерации — не используйте для массовой обработки.
Единственный способ изменить и сохранить табличную часть. Требует больших ресурсов: читается весь объект, нужна запись документа.
Оптимален для чтения данных многих документов, отборов и группировок. Не позволяет изменять данные напрямую.
Получение табличной части через ссылку на документ
Если у вас есть ссылка на документ — например, она пришла как параметр в процедуру или выбрана пользователем на форме, — табличная часть доступна напрямую как свойство ссылки. Платформа сама выполнит чтение данных из базы при первом обращении.
ТабЧасть = СсылкаНаДокумент.Товары;
Для Каждого Строка Из ТабЧасть Цикл
Сообщить(Строка.Номенклатура);
КонецЦикла;
Результат обращения — объект типа «ТабличнаяЧасть», который поддерживает перебор в цикле, методы Количество(), Найти(), Итог(). Например, ТабЧасть.Итог("Сумма") вернёт сумму по колонке без ручного цикла.
Важное ограничение: данные, полученные через ссылку, нельзя изменить. Попытка присвоить значение реквизиту строки вызовет ошибку. Если стоит задача модификации — переходите к работе через объект документа.
Получение и изменение через объект документа
Метод ПолучитьОбъект() загружает документ в память целиком — вместе со всеми табличными частями. После этого строки можно добавлять, удалять и редактировать, а изменения сохраняются методом Записать().
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Для Каждого Строка Из ДокОбъект.Товары Цикл
Строка.Цена = Строка.Цена * 1.1;
КонецЦикла;
НоваяСтрока = ДокОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.Количество = 1;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Полезные методы табличной части объекта: Добавить() — новая строка, Удалить(Строка) — удаление конкретной строки, Очистить() — полная очистка, Найти(Значение, "ИмяКолонки") — поиск строки по значению реквизита, Выгрузить() — преобразование в таблицу значений для произвольной обработки.
Получение табличной части запросом
Запрос к табличной части строится к таблице вида Документ.РеализацияТоваровУслуг.Товары. В ней доступны поле Ссылка (документ-владелец), НомерСтроки и все реквизиты табличной части. Это позволяет отбирать строки сразу по многим документам.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Номенклатура) + ": " + Выборка.Количество);
КонецЦикла;
Запрос особенно эффективен, когда нужно собрать данные по периоду: например, все строки товаров из реализаций за месяц с группировкой по номенклатуре. Одним запросом вы получите готовую выборку, тогда как перебор документов через ссылки потребовал бы обращения к базе на каждом документе.
Результат запроса не связан с документом: изменить через него данные нельзя. Для модификации всё равно потребуется получить объект конкретного документа и записать его.
Особые случаи: форма, несколько табличных частей, движения
Табличная часть на управляемой форме
На управляемой форме документа табличная часть доступна через Объект.Товары, где Объект — основной реквизит формы. Текущая выделенная строка в интерфейсе получается через элемент формы: Элементы.Товары.ТекущиеДанные. Прямая запись в ТекущиеДанные допустима — изменения отразятся в объекте формы.
Документ с несколькими табличными частями
У одного документа может быть несколько табличных частей — например, «Товары» и «Услуги». Каждая обращается независимо по своему имени. Чтобы узнать состав табличных частей программно, используйте метаданные: СсылкаНаДокумент.Метаданные().ТабличныеЧасти — коллекция, которую можно перебрать и построить универсальный алгоритм обхода.
Когда табличной части недостаточно
Не путайте табличную часть с движениями документа по регистрам. Если нужны данные остатков, себестоимости или взаиморасчётов, их источник — регистры, а не табличная часть. Табличная часть отражает только то, что введено в документ вручную или при заполнении.
Как выбрать способ
Проверка результата и контроль ошибок
После получения табличной части убедитесь, что данные соответствуют ожиданиям. Минимальная проверка — количество строк: ТабЧасть.Количество() должно совпадать с числом строк, видимым в форме документа. Если документ пустой, коллекция вернёт ноль строк — это нормальная ситуация, а не ошибка, и код должен её корректно обрабатывать.
Для проверки корректности записи после изменений полезно сравнить итог по ключевой колонке до и после обработки. Также при записи проведённого документа используйте Попытка ... Исключение, чтобы перехватить ошибки проведения — например, нехватку остатков на складе.
Как проверить результат
Совпадает с числом строк в форме документа
Меньше ожидаемого — проверьте отбор в запросе и имя табличной части
Номенклатура, количество, суммы читаются без ошибок
Ошибка «Поле объекта не обнаружено» — неверное имя реквизита
Записать() завершается без исключений, изменения видны в форме
Исключение при записи — смотрите текст ошибки проведения или блокировки
Типичные ошибки при работе с табличной частью
Самая частая ошибка — обращение к табличной части по неверному имени. В типовых конфигурациях имена различаются: у «Реализации товаров и услуг» это «Товары», у других документов могут быть «Материалы», «Работы», «Оплата». Всегда сверяйте имя в конфигураторе, а не угадывайте по названию вкладки формы — подпись на форме и имя в метаданных могут отличаться.
Вторая распространённая проблема — обращение к ссылке в цикле. Конструкция вида «перебрать тысячу документов и у каждого прочитать Ссылка.Товары» генерирует тысячу отдельных обращений к базе. Такой код работает медленно и грузит сервер. Замените его одним запросом с соединением или отбором по списку ссылок.
FAQ
Как узнать имя табличной части документа?
Откройте конфигуратор, найдите нужный документ в дереве конфигурации и разверните ветку «Табличные части» — там перечислены точные имена для обращения из кода. Альтернатива без конфигуратора: выполнить в коде перебор Ссылка.Метаданные().ТабличныеЧасти и вывести свойство Имя каждого элемента.
Можно ли получить табличную часть, не открывая документ?
Да. Обращение через ссылку (Ссылка.Товары) и запрос к таблице табличной части не требуют открытия формы документа. Форма нужна только для интерактивной работы пользователя, программному коду она не обязательна.
Как выгрузить табличную часть в таблицу значений?
Используйте метод Выгрузить(): ТЗ = СсылкаНаДокумент.Товары.Выгрузить();. Полученную таблицу значений можно сортировать, сворачивать, выгружать в Excel или передавать как параметр. Для выгрузки отдельных колонок передайте их имена строкой: Выгрузить(, "Номенклатура, Количество").
Почему запрос к табличной части возвращает пустой результат?
Чаще всего причины три: документ действительно не содержит строк, в параметр передана пустая или неверная ссылка, либо ошибка в имени табличной части в тексте запроса. Проверьте в форме документа наличие строк и убедитесь, что параметр запроса заполнен ссылкой нужного типа.
Как получить табличные части всех документов одного вида за период?
Напишите запрос к таблице табличной части с отбором по дате через поле ссылки: ГДЕ Товары.Ссылка.Дата МЕЖДУ &Начало И &Конец. При необходимости добавьте условие Товары.Ссылка.Проведен, чтобы исключить непроведённые документы. Перебор документов выборкой с обращением к каждой ссылке делать не нужно.
Чем табличная часть отличается от движений документа?
Табличная часть — это введённые в документ строки, которые хранятся вместе с ним и редактируются пользователем. Движения — записи в регистрах, которые формируются при проведении по алгоритму, заданному в модуле документа. Данные могут совпадать, но источники разные: для анализа остатков и оборотов используйте регистры, а не табличные части.
Что важно запомнить
Табличная часть всегда получается через документ-владелец: через ссылку — для чтения, через ПолучитьОбъект() — для изменения с последующей записью, запросом — для массовой обработки и отборов. Сверяйте имя табличной части в конфигураторе, избегайте обращений к ссылке в цикле и проверяйте результат по количеству строк и итогам.