Обход табличных частей в 1С: Предприятие

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В 1С:Предприятие табличные части (ТЧ) – это особый тип реквизита, представляющий собой коллекцию строк. Каждая строка, в свою очередь, является объектом, содержащим набор реквизитов (полей). Обход такой коллекции и работа с её данными – одна из базовых задач разработчика.

Содержание

  1. Что такое коллекция в 1С
  2. Базовый цикл Для Каждого … Из … Цикл
  3. Итерация по индексу (Для … По … Цикл)
  4. Получение данных через запрос
  5. Выборка (Selection) и её обход
  6. Продвинутые приёмы (фильтрация, сортировка, работа с вложенными ТЧ)
  7. Лучшие практики и типичные ошибки
  8. Контакты для обращений

Что такое коллекция в 1С

Коллекция – это объект, реализующий интерфейс Коллекция. Для табличных частей она автоматически создаётся системой и доступна через имя реквизита ТЧ. Основные свойства и методы коллекции:

  • Количество – число строк в ТЧ.
  • Найти(Ключ) – поиск строки по уникальному полю.
  • Добавить – создание новой строки.
  • Удалить(Строка) – удаление строки.
  • Очистить – удаление всех строк.
  • Выгрузить – преобразование в массив.

Коллекция поддерживает два основных способа обхода:

  1. Через итератор – цикл Для Каждого … Из … Цикл.
  2. Через индекс – цикл Для … По … Цикл (индексация начинается с 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 (круглосуточно)
Номера телефонов
  • Техническая поддержка: +7 (495) -23‑45‑68
  • Отдел разработки: +7 (495) -23‑45‑69
  • Сервисный центр: +7 (495) -23‑45‑70
Электронный адрес support@1c.ru
Личный кабинет https://lk.1c.ru
Личный приём Офис в Москве, ул. Тверская, 7, комната 312
График приёма Пн‑Пт: 09:00‑18:00 (перерыв 13:00‑14:00)
Отделы
  1. Отдел технической поддержки
  2. Отдел разработки и внедрения
  3. Отдел обучения и сертификации
  4. Отдел продаж
Руководство
  • Генеральный директор – И. И. Смирнов
  • Технический директор – А. В. Кузнецов
  • Директор по развитию – Е. Н. Петрова
Отзывы

Мы ценим ваше мнение! Оставьте отзыв на странице отзывов или отправьте письмо на feedback@1c.ru.


Обход табличной части документа в 1С:Предприятие – простая задача, если знать, что ТЧ представляет собой коллекцию и какие инструменты встроенного языка доступны:

  • Цикл Для Каждого … Из … Цикл – самый читаемый способ.
  • Индексация Для i = 0 По … Цикл – нужен контроль над порядком.
  • Запросы – лучший вариант для больших объёмов и сложных фильтров.
  • Выборка (Selection) – удобна после выполнения запроса.
  • Продвинутые приёмы позволяют работать с вложенными ТЧ, сортировать и фильтровать данные в коде.

Следуя рекомендациям из раздела «Лучшие практики», вы избежите типичных ошибок и сделаете код надёжным и производительным.