Табличные части (ТЧ) – это вложенные таблицы‚ которые находятся внутри документов‚ справочников‚ регистров и обработок. Часто возникает необходимость получить данные из ТЧ не через форму‚ а программно: в запросах‚ в обработках‚ в управляемых формах и даже через COM‑соединения. В этой статье мы разберём несколько самых распространённых способов обращения к табличной части‚ покажем примеры кода и дадим рекомендации по оптимизации.
Обращение к табличной части через язык запросов (Конструктор запросов)
Если нужно получить строки ТЧ как отдельный источник данных‚ достаточно добавить её в поле Таблицы конструктора запросов.
Пример простого запроса к ТЧ документа «Заказ покупателя» ВЫБРАТЬ
ТЧ.Номенклатура‚
ТЧ.Количество‚
ТЧ.Сумма
ИЗ
Документ;ЗаказПокупателя.ТЧ_Товары КАК ТЧ
ГДЕ
ТЧ.Ссылка = &Документ
- В поле Таблицы перетаскиваем
ТЧ_Товары (имя табличной части). - В параметр
&Документ передаём ссылку на конкретный документ.
Группировка и агрегаты
ВЫБРАТЬ
ТЧ.Номенклатура‚
ТЧ.Количество‚
ТЧ.Сумма
ИЗ
Документ;ЗаказПокупателя.ТЧ_Товары КАК ТЧ
ГДЕ
ТЧ.Ссылка = &ДокументТЧ_Товары (имя табличной части).&Документ передаём ссылку на конкретный документ.Для подсчёта итогов удобно использовать функции СУММА‚ СЧЁТ и т.п.
ВЫБРАТЬ
ТЧ.Номенклатура‚
СЧЁТ(*) КАК Кол-воСтрок
ИЗ
Документ.ЗаказПокупателя.ТЧ_Товары КАК ТЧ
ГДЕ
ТЧ.Ссылка = &Документ
СГРУППИРОВАТЬ ПО
ТЧ.Номенклатура Обращение к табличной части из кода (Скрипты 1С) На клиенте (управляемые формы)
Для получения текущей строки и её полей используется объект ЭлементыФормы.Таблица и метод ТекущаяСтрока.
// Получаем выбранную строку в табличном поле
ТекСтрока = ЭлементыФормы.ТаблицаТовары.ТекущаяСтрока;
Если ТекСтрока <> Неопределено Тогда
Номенклатура = ТекСтрока.Номенклатура;
Количество = ТекСтрока.Количество;
// Дальнейшая обработка...
КонецЕсли; На сервере (модуль объекта)
Для работы с ТЧ в серверном коде используется объект ТаблицаЗначений и методы Выбрать‚ Добавить‚ Найти.
// Пример: перебор всех строк ТЧ в документе
Для Каждого Строка ТЧ Из ДокументОбъект.ТЧ_Товары Цикл
Сообщить("Товар: " + Строка.Номенклатура.Наименование);
Сообщить("Кол-во: " + Строка.Количество);
КонецЦикла; Добавление новой строки в ТЧ НоваяСтрока = ДокументОбъект.ТЧ_Товары.Добавить;
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("001");
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = НоваяСтрока.Номенклатура.Цена * НоваяСтрока.Количество;
Обращение к табличной части через COM‑соединение
НоваяСтрока = ДокументОбъект.ТЧ_Товары.Добавить;
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("001");
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = НоваяСтрока.Номенклатура.Цена * НоваяСтрока.Количество;Если требуется получить данные из 1С из внешнего приложения (например‚ из Excel‚ C#)‚ используется COM‑соединение.
Dim V8 As Object
Set V8 = CreateObject("V83.Application")
V8.ConnectString = "Srvr=""MyServer"";Ref=""MyBase"";Usr=""admin"";Pwd=""12345"";"
Dim Query As Object
Set Query = V8.NewObject("Запрос")
Query.Text = "ВЫБРАТЬ ТЧ.Номенклатура‚ ТЧ.Количество ИЗ Документ.ЗаказПокупателя.ТЧ_Товары КАК ТЧ"
Dim Result As Object
Set Result = Query.Execute
Do While Not Result.Next = 0
Debug.Print Result.Номенклатура‚ Result.Количество
Loop
V8.Disconnect Важно помнить‚ что COM‑соединение может возвращать только те данные‚ которые уже записаны в базу (т.е. не «непроведённые» изменения в клиентском сеансе).
Лучшие практики и типичные ошибки - Не использовать запрос к ТЧ без указания ссылки на документ. Без фильтра
ТЧ;Ссылка = &Документ запрос вернёт строки из всех документов – это резко увеличит нагрузку. - Не забывать про индексацию. Если в ТЧ часто ищут по полю
Номенклатура‚ создайте реквизит‑индекс в метаданных. - Избегать «глубоких» вложенных запросов. Лучше сначала получить набор строк ТЧ‚ а затем уже в коде выполнить нужные расчёты.
- Работать с ТЧ только после записи документа. При работе в обработке‚ где документ ещё не записан‚ используйте
Записать с параметром Ложь (записать без проведения). - При работе с управляемыми формами использовать методы
ПолучитьЗначение и УстановитьЗначение для ячеек‚ а не прямой доступ к полям.
Пример комплексного решения
ТЧ;Ссылка = &Документ запрос вернёт строки из всех документов – это резко увеличит нагрузку.Номенклатура‚ создайте реквизит‑индекс в метаданных.Записать с параметром Ложь (записать без проведения).ПолучитьЗначение и УстановитьЗначение для ячеек‚ а не прямой доступ к полям.Сценарий: необходимо вывести в отдельный регистр «ПродажиПоТоварам» суммарные продажи за выбранный период‚ используя данные из табличной части документа «Реализация».
Процедура СформироватьОтчет(ДатаНач‚ ДатаКон)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
ТЧ.Номенклатура КАК Товар‚
СУММА(ТЧ.Сумма) КАК СуммаПродаж
ИЗ
Документ.Реализация.ТЧ_Товары КАК ТЧ
ГДЕ
ТЧ.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
СГРУППИРОВАТЬ ПО
ТЧ.Номенклатура";
Запрос.УстановитьПараметр("ДатаНач"‚ ДатаНач);
Запрос.УстановитьПараметр("ДатаКон"‚ ДатаКон);
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
Запись = РегистрыНакопления.ПродажиПоТоварам.ПолучитьНовыйЭлемент;
Запись.Товар = Выборка.Товар;
Запись.Сумма = Выборка.СуммаПродаж;
Запись.Период = ДатаКон; // условно
Запись.Записать;
КонецЦикла;
КонецПроцедуры; Такой подход гарантирует‚ что в регистр попадут только агрегированные данные‚ а не отдельные строки ТЧ.
Часто задаваемые вопросы - Можно ли обратиться к табличной части без указания её имени? Нет. В запросе необходимо явно указать имя ТЧ (например‚
ТЧ_Товары). - Как получить доступ к служебным полям ТЧ (например‚
НомерСтроки)? Служебные поля доступны через свойства объекта строки: Строка.НомерСтроки. - Можно ли использовать динамические имена ТЧ в запросе? Да‚ через параметр
ИмяТЧ и функцию ВЫБРАТЬ ... ИЗ &ИмяТЧ‚ но это усложняет план выполнения запроса.
Контакты для обращений
Официальный сайт: https://www.1c.ru
Горячая линия: 8 (800) -55‑35‑35 (круглосуточно)
Номера телефонов:
- Техническая поддержка – +7 (495) -23‑45‑67
- Отдел продаж – +7 (495) -65‑43‑21
- Сервисный центр – +7 (495) -55‑66‑77
Электронный адрес: support@1c;ru
Личный кабинет: https://portal.1c.ru
Личный приём (для юридических лиц): г. Москва‚ ул. Тверская‚ д. 7‚ офис 315
График приёма: Пн‑Пт 09:00‑18:00‚ Сб 10:00‑14:00‚ Вс – выходной
Отделы:
- Отдел разработки – dev@1c.ru
- Отдел внедрения – implementation@1c.ru
- Отдел обучения – training@1c.ru
Руководство:
- Генеральный директор – Иванов И.И.
- Технический директор – Петров П.П.
- Директор по развитию – Сидорова А.А.
Отзывы клиентов:
«Отличная поддержка и быстрый отклик на запросы по работе с табличными частями. Помогли оптимизировать запросы‚ что сократило время отчётов вдвое.» – ООО «Ромашка»
«Вебинары по 1С:Предприятию помогли нашей команде быстро освоить работу с ТЧ в запросах. Спасибо!» – ЗАО «ТехноСервис»
ТЧ_Товары).НомерСтроки)? Служебные поля доступны через свойства объекта строки: Строка.НомерСтроки.ИмяТЧ и функцию ВЫБРАТЬ ... ИЗ &ИмяТЧ‚ но это усложняет план выполнения запроса.Контакты для обращений
Официальный сайт: https://www.1c.ru
Горячая линия: 8 (800) -55‑35‑35 (круглосуточно)
Номера телефонов:
- Техническая поддержка – +7 (495) -23‑45‑67
- Отдел продаж – +7 (495) -65‑43‑21
- Сервисный центр – +7 (495) -55‑66‑77
Электронный адрес: support@1c;ru
Личный кабинет: https://portal.1c.ru
Личный приём (для юридических лиц): г. Москва‚ ул. Тверская‚ д. 7‚ офис 315
График приёма: Пн‑Пт 09:00‑18:00‚ Сб 10:00‑14:00‚ Вс – выходной
Отделы:
- Отдел разработки – dev@1c.ru
- Отдел внедрения – implementation@1c.ru
- Отдел обучения – training@1c.ru
Руководство:
- Генеральный директор – Иванов И.И.
- Технический директор – Петров П.П.
- Директор по развитию – Сидорова А.А.
Отзывы клиентов:
«Отличная поддержка и быстрый отклик на запросы по работе с табличными частями. Помогли оптимизировать запросы‚ что сократило время отчётов вдвое.» – ООО «Ромашка»
«Вебинары по 1С:Предприятию помогли нашей команде быстро освоить работу с ТЧ в запросах. Спасибо!» – ЗАО «ТехноСервис»