В 1С:Предприятие табличные части (ТЧ) – это особый тип реквизита, представляющий собой коллекцию строк. Каждая строка, в свою очередь, является объектом, содержащим набор реквизитов (полей). Обход такой коллекции и работа с её данными – одна из базовых задач разработчика.
Содержание
- Что такое коллекция в 1С
- Базовый цикл
Для Каждого … Из … Цикл - Итерация по индексу (
Для … По … Цикл) - Получение данных через запрос
- Выборка (Selection) и её обход
- Продвинутые приёмы (фильтрация, сортировка, работа с вложенными ТЧ)
- Лучшие практики и типичные ошибки
- Контакты для обращений
Что такое коллекция в 1С
Коллекция – это объект, реализующий интерфейс Коллекция. Для табличных частей она автоматически создаётся системой и доступна через имя реквизита ТЧ. Основные свойства и методы коллекции:
- Количество – число строк в ТЧ.
- Найти(Ключ) – поиск строки по уникальному полю.
- Добавить – создание новой строки.
- Удалить(Строка) – удаление строки.
- Очистить – удаление всех строк.
- Выгрузить – преобразование в массив.
Коллекция поддерживает два основных способа обхода:
- Через итератор – цикл
Для Каждого … Из … Цикл. - Через индекс – цикл
Для … По … Цикл(индексация начинается с0).
Базовый цикл Для Каждого … Из … Цикл
Самый читаемый и «питонический» способ обхода. В переменной цикла попадает сразу объект строки, а не её номер.
Процедура ОбработатьТЧ(Документ)
// Предположим, в документе есть ТЧ «Товары»
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
// Обращаемся к полям строки через точку
Сообщить("Номенклатура: " + СтрокаТЧ.Номенклатура +
", Кол-во: " + СтрокаТЧ.Количество);
КонецЦикла;
КонецПроцедуры
Если нужен номер строки, у неё есть свойство НомерСтроки (начинается с 0).
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
Сообщить("Строка №" + (СтрокаТЧ.НомерСтроки + 1) +
": " + СтрокаТЧ.Номенклатура);
КонецЦикла;
Итерация по индексу (Для … По … Цикл)
Подходит, когда требуется доступ к соседним строкам или когда нужен «ручной» контроль над порядком обхода.
Для i = 0 По Документ.Товары.Количество ⸺ 1 Цикл
СтрокаТЧ = Документ.Товары[i];
// Пример: проверка наличия дублей
Если i > 0 Тогда
Предыдущая = Документ.Товары[i-1];
Если СтрокаТЧ.Номенклатура = Предыдущая.Номенклатура Тогда
Предупреждение("Дублирование номенклатуры в строках " + (i) + " и " + (i+1));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Важно помнить, что индексация начинается с 0, а не с 1.
Получение данных через запрос
Если требуется отобрать только часть строк (по фильтру, с сортировкой, с объединением с другими объектами), лучше использовать Запрос. Запрос формирует Выборка, которую тоже можно обходить в цикле.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.ПриходнаяНакладная.Товары КАК Товары
ГДЕ
Товары.Количество > 0
УПОРЯДОЧИТЬ ПО
Товары.Номенклатура";
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
Сообщить("Товар: " + Выборка.Номенклатура +
", Кол-во: " + Выборка.Количество);
КонецЦикла;
Преимущества:
- Сокращение объёма передаваемых данных (выбираются только нужные строки).
- Возможность сортировки и группировки прямо в запросе.
- Оптимизация за счёт использования серверного движка.
Выборка (Selection) и её обход
Если запрос возвращает табличный результат, то объект Выборка имеет методы Следующий, Получить и свойства полей. При работе с большими объёмами рекомендуется использовать Выборка.Получить в виде структуры, чтобы уменьшить количество обращений к полям.
Выборка = Запрос.Выполнить.Выбрать;
Пока Выборка.Следующий Цикл
Строка = Выборка.Получить;
// Структура Строка.Nomenklatura, Строка.Количество, …
Сообщить("Товар: " + Строка.Номенклатура);
КонецЦикла;
Продвинутые приёмы
6.1 Фильтрация в коде
Если запрос невозможен (например, в обработчике формы без доступа к серверу), можно отфильтровать коллекцию вручную:
Для Каждого Строка ТЧ Из Документ.Товары Цикл
Если Строка.ДатаПоставки < ТекущаяДата Тогда
// Делать что‑то
КонецЕсли;
КонецЦикла;
6.2 Сортировка «на лету»
Коллекцию можно отсортировать, скопировав её в массив и применив Сортировать:
МассивСтрок = Документ.Товары.Выгрузить; // массив структур
МассивСтрок.Сортировать(Функция(Элемент1, Элемент2)
Возврат Элемент1.Наименование < Элемент2.Наименование;
КонецФункции);
Для Каждого Строка Из МассивСтрок Цикл
// Строка – структура, а не объект ТЧ
КонецЦикла;
6.3 Работа с вложенными табличными частями
Если в строке ТЧ есть собственная ТЧ (например, «Товары.Характеристики»), обход выглядит так:
Для Каждого Товар Из Документ.Товары Цикл
Сообщить("Товар: " + Товар.Номенклатура);
Для Каждого Характ Из Товар.Характеристики Цикл
Сообщить(" Характ: " + Характ.Наименование + " = " + Характ.Значение);
КонецЦикла;
КонецЦикла;
6.4 Добавление и изменение строк
// Добавление новой строки
НоваяСтрока = Документ.Товары.Добавить;
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Молоко");
НоваяСтрока.Количество = 10;
НоваяСтрока.Сумма = 500;
// Изменение существующей строки
Для Каждого Строка ТЧ Из Документ.Товары Цикл
Если Строка.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("12345") Тогда
Строка.Количество = Строка.Количество + 5;
КонецЕсли;
КонецЦикла;
Лучшие практики и типичные ошибки
- Не использовать цикл
Для i = 0 По …без необходимости. При работе с большими ТЧ он медленнее, чемДля Каждого. - Избегать обращения к серверу в каждом шаге цикла. Если нужно получить свойства справочников, лучше собрать их в массив заранее.
- Пользоваться запросами для выборки больших объёмов. Запросы исполняются на сервере и используют индексы.
- Не менять структуру ТЧ (добавлять/удалять строки) во время обхода тем же объектом. Это может привести к «пропуску» строк. Если необходимо, сначала скопировать массив
Выгрузить, а затем работать с копией. - Обрабатывать исключения. При работе с
НайтииДобавитьмогут возникать ошибки доступа. - Сохранять изменения только один раз. После изменения ТЧ вызовите
Записатьу документа/регистра, а не в каждом проходе цикла.
Контакты для обращений
Если у вас возникли вопросы по работе с табличными частями, вы можете воспользоваться следующими каналами связи.
| Официальный сайт | https://1c.ru |
| Горячая линия | +7 (495) -23‑45‑67 (круглосуточно) |
| Номера телефонов |
|
| Электронный адрес | support@1c.ru |
| Личный кабинет | https://lk.1c.ru |
| Личный приём | Офис в Москве, ул. Тверская, 7, комната 312 |
| График приёма | Пн‑Пт: 09:00‑18:00 (перерыв 13:00‑14:00) |
| Отделы |
|
| Руководство |
|
| Отзывы | Мы ценим ваше мнение! Оставьте отзыв на странице отзывов или отправьте письмо на feedback@1c.ru. |
Обход табличной части документа в 1С:Предприятие – простая задача, если знать, что ТЧ представляет собой коллекцию и какие инструменты встроенного языка доступны:
- Цикл
Для Каждого … Из … Цикл– самый читаемый способ. - Индексация
Для i = 0 По … Цикл– нужен контроль над порядком. - Запросы – лучший вариант для больших объёмов и сложных фильтров.
- Выборка (Selection) – удобна после выполнения запроса.
- Продвинутые приёмы позволяют работать с вложенными ТЧ, сортировать и фильтровать данные в коде.
Следуя рекомендациям из раздела «Лучшие практики», вы избежите типичных ошибок и сделаете код надёжным и производительным.