В 1С перебор (итерация) – это процесс последовательного обхода элементов коллекции (массива, списка значений, табличной части, результата запроса и т. д.) для выполнения определенных действий с каждым элементом. 1С предоставляет различные способы реализации перебора в зависимости от типа коллекции и требуемой функциональности.
Рассмотрим основные способы перебора в 1С:
1. Перебор массива:
Цикл Для Индекс = … Цикл (классический перебор по индексу):
Массив = Новый Массив;
Массив. Добавить("Элемент 1");
Массив. Добавить("Элемент 2");
Массив. Добавить("Элемент 3");
Для Индекс = 0 По Массив. Количество() — 1 Цикл // Индексы массивов в 1С начинаются с 0
ТекущийЭлемент = Массив[Индекс];
Сообщить("Элемент массива[" + Индекс + "]: " + ТекущийЭлемент);
// Здесь можно выполнить другие действия с элементом массива
КонецЦикла;
Цикл Для Каждого Элемент Из… Цикл (перебор элементов коллекции):
Массив = Новый Массив;
Массив. Добавить("Элемент 1");
Массив. Добавить("Элемент 2");
Массив. Добавить("Элемент 3");
Для Каждого Элемент Из Массив Цикл
Сообщить("Элемент массива: " + Элемент);
// Здесь можно выполнить другие действия с элементом массива
КонецЦикла;
Метод Для Каждого() (использование процедуры-обработчика):
Массив = Новый Массив;
Массив. Добавить("Элемент 1");
Массив. Добавить("Элемент 2");
Массив. Добавить("Элемент 3");
Процедура ОбработкаЭлементаМассива(Элемент, Индекс, Массив) Экспорт
Сообщить("Элемент массива[" + Индекс + "]: " + Элемент);
КонецПроцедуры
Массив. ДляКаждого("ОбработкаЭлементаМассива");
Преимущества и недостатки:
Для Индекс = … Цикл: Позволяет получить индекс элемента.
Для Каждого Элемент Из… Цикл: Более простой и читаемый код, но нет доступа к индексу элемента.
Для Каждого(): Удобен для выполнения сложных действий с элементом массива в отдельной процедуре.
2. Перебор списка значений:
СписокЗначений = Новый СписокЗначений;
СписокЗначений. Добавить("Значение 1");
СписокЗначений. Добавить("Значение 2");
СписокЗначений. Добавить("Значение 3");
Для Каждого ЭлементСписка Из СписокЗначений Цикл
Сообщить("Значение списка: " + ЭлементСписка. Значение);
//Здесь можно выполнить другие действия с элементом списка
КонецЦикла;
Особенность: Перебор списка значений осуществляется через цикл Для Каждого ЭлементСписка Из… Цикл, где ЭлементСписка — это объект типа ЭлементСпискаЗначений, который имеет свойства Значение (само значение) и Пометка (логическое значение).
3. Перебор табличной части документа (или табличного поля формы):
Для Каждого СтрокаТЧ Из Объект. Товары Цикл // Объект — это текущий документ, Товары — имя табличной части
Сообщить("Номенклатура: " + СтрокаТЧ. Номенклатура + ", Количество: " + СтрокаТЧ. Количество);
//Здесь можно выполнить другие действия со строкой табличной части
КонецЦикла;
Особенность: Перебор табличной части осуществляется как перебор обычной коллекции.
4. Перебор результата запроса:
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура. Ссылка,
| Номенклатура. Наименование
|ИЗ
| Справочник. Номенклатура КАК Номенклатура";
Результат = Запрос. Выполнить();
Выборка = Результат. Выбрать();
Пока Выборка. Следующий() Цикл
Сообщить("Ссылка: " + Выборка. Ссылка + ", Наименование: " + Выборка. Наименование);
//Здесь можно выполнить другие действия с данными запроса
КонецЦикла;
Особенность: Перебор результата запроса осуществляется с помощью цикла Пока Выборка. Следующий() Цикл. Для доступа к данным используется объект Выборка, который имеет свойства, соответствующие полям запроса.
5. Перебор значений свойств объекта (например, перебор реквизитов справочника):
Для Каждого Свойство Из Метаданные. Справочники. Номенклатура. Реквизиты Цикл
Сообщить("Имя реквизита: " + Свойство. Имя + ", Тип реквизита: " + Свойство. Тип);
КонецЦикла;
Особенность: Перебор свойств объекта осуществляется как перебор обычной коллекции.
6. Использование генераторов (только в версиях 8.3.20 и выше):
Для Каждого Элемент Из Массив | ?(Элемент > 10) Цикл
Сообщить(Элемент);
КонецЦикла;
Основные моменты:
Тип коллекции: Выбор способа перебора зависит от типа коллекции (массив, список значений, табличная часть, результат запроса и т. д.).
Направление перебора: Перебор может осуществляться в прямом или обратном порядке (для массивов).
Условия выхода из цикла: В циклах перебора можно использовать операторы Прервать (для выхода из цикла) и Продолжить (для перехода к следующей итерации).
Изменение коллекции в процессе перебора: Не рекомендуется изменять коллекцию (добавлять или удалять элементы) в процессе перебора, так как это может привести к непредсказуемым результатам. Если необходимо изменить коллекцию, используйте копию коллекции или другие методы.
Производительность: Для больших коллекций рекомендуется использовать наиболее производительные способы перебора (например, запросы).
Рекомендации:
Используйте наиболее простой и читаемый способ перебора, который подходит для вашей задачи.
Учитывайте особенности типа коллекции при выборе способа перебора.
Не изменяйте коллекцию в процессе перебора.
Для больших коллекций используйте наиболее производительные способы перебора.
В зависимости от вашей конкретной задачи и типа коллекции, выберите наиболее подходящий способ перебора в 1С.