{}const=>[]async()letfn</>var
1CDéveloppement

Cycles dans 1C : comment traiter les listes, les parties tabulaires et les échantillons

Nous analysons tous les types de cycles dans 1C - « Pour », « Pour chacun » et « Jusqu'à présent ». Apprenez à traiter les parties tabulaires, les échantillons de requêtes, les structures et les correspondances. Nous montrons les erreurs typiques lors de la suppression de lignes et les techniques d'optimisation des performances.

К

Kodik

Auteur

8 min de lecture

Travailler avec des données dans 1C est, en fait, un travail constant avec des collections. Les annuaires, les documents, les registres sont tous des tableaux de données qui doivent être triés, filtrés et convertis. Sans comprendre les cycles, vous ne pourrez pas écrire un seul traitement sérieux. Dans cet article, nous analyserons tous les types de cycles en 1C, nous vous montrerons des exemples réels et nous vous parlerons des pièges dont la documentation ne parle pas.

Trois baleines : types de cycles dans 1C

Dans la plate-forme 1C : Enterprise, il existe trois conceptions pour organiser les cycles. Chacune est adaptée à son propre scénario.

Cycle « Pour » — quand on connaît le nombre d'itérations

Boucle de comptage classique. Elle est utilisée lorsque l'on sait à l'avance combien de fois il faut effectuer une action.

Для Счетчик = 1 По 10 Цикл
    Сообщить("Iteration No." + Счетчик);
КонецЦикла;

Une nuance importante : la variable de comptage augmente automatiquement de 1 après chaque itération. Dans 1C, vous ne pouvez pas définir une étape arbitraire, comme dans certains autres langages. Si vous avez besoin d'une étape autre que un, vous devez tricher :

Для Индекс = 0 По 9 Цикл
    РеальныйШаг = Индекс * 3;
    Сообщить("Value: " + РеальныйШаг);
КонецЦикла;

Scénario typique — parcourir le tableau par index :

МассивТоваров = Новый Массив;
МассивТоваров.Добавить("Laptop");
МассивТоваров.Добавить("Monitor");
МассивТоваров.Добавить("Keyboard");

Для Инд = 0 По МассивТоваров.ВГраница() Цикл
    Сообщить(МассивТоваров[Инд]);
КонецЦикла;

Cycle « Pour tous » - soldat universel

Le cycle le plus populaire en 1C. Fonctionne avec n'importe quelle collection : tableaux, listes de valeurs, parties de tableau, résultats de requête, structures et correspondances.

Для Каждого Элемент Из МассивТоваров Цикл
    Сообщить(Элемент);
КонецЦикла;

Le principal avantage est que vous n'avez pas besoin de penser aux index, aux limites et au nombre d'éléments. Vous travaillez simplement avec chaque élément de la collection.

Cycle « Tant que » — lorsque la condition de sortie n'est pas connue à l'avance

Exécuté tant que la condition est vraie. Idéal pour les situations où le nombre d'itérations n'est pas connu à l'avance.

Остаток = 1000;
Месяц = 0;

Пока Остаток > 0 Цикл
    Остаток = Остаток - 150;
    Месяц = Месяц + 1;
КонецЦикла;

Сообщить("Funds will run out in " + Месяц + " months");

Attention : si la condition ne devient jamais fausse, vous obtiendrez une boucle infinie et la plateforme se bloquera. Prévoyez toujours une sortie de secours :

Счетчик = 0;
Пока НеВыполненоУсловие И Счетчик < 10000 Цикл
    // logique de traitement
    Счетчик = Счетчик + 1;
КонецЦикла;
🔥 100 000+ étudiants déjà avec nous

Marre de lire la théorie ?
Il est temps de coder !

Kodik — une appli où tu apprends à coder par la pratique. Mentor IA, leçons interactives, projets réels.

🤖 IA 24/7
🎓 Certificats
💰 Gratuit
🚀 Commencer
Ont rejoint aujourd'hui

Traitement des parties tabulaires des documents

Les parties tabulaires sont l'une des structures de données les plus courantes avec lesquelles le développeur 1C travaille. Analysons quelques tâches pratiques.

Calcul du montant par la partie tabulaire

ИтогоСумма = 0;

Для Каждого СтрокаТЧ Из Документ.Товары Цикл
    ИтогоСумма = ИтогоСумма + СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецЦикла;

Сообщить("Total amount: " + ИтогоСумма);

Suppression de lignes de la partie tabulaire

C'est là que la partie la plus intéressante commence. L'erreur classique du débutant est de supprimer des lignes dans une boucle directe :

// ❌ NE PAS FAIRE CELA — sauter des lignes !
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
    Если СтрокаТЧ.Количество = 0 Тогда
        Документ.Товары.Удалить(СтрокаТЧ);
    КонецЕсли;
КонецЦикла;

Lorsqu'une ligne est supprimée, la collection se déplace et l'élément suivant « glisse ». La bonne approche consiste à contourner la partie tabulaire dans l'ordre inverse. Mais le cycle standard « Pour » dans 1C ne prend pas en charge le compte à rebours, nous utilisons donc « Jusqu'à » :

// ✅ Parcours inversé correct
Инд = Документ.Товары.Количество() - 1;

Пока Инд >= 0 Цикл
    СтрокаТЧ = Документ.Товары[Инд];
    Если СтрокаТЧ.Количество = 0 Тогда
        Документ.Товары.Удалить(Инд);
    КонецЕсли;
    Инд = Инд - 1;
КонецЦикла;

Recherche de doublons dans la partie tabulaire

Une tâche qui se rencontre constamment : trouver et combiner des produits identiques.

Инд = 0;
Пока Инд < Документ.Товары.Количество() Цикл
    ТекСтрока = Документ.Товары[Инд];
    
    Инд2 = Инд + 1;
    Пока Инд2 < Документ.Товары.Количество() Цикл
        СравнСтрока = Документ.Товары[Инд2];
        
        Если ТекСтрока.Номенклатура = СравнСтрока.Номенклатура Тогда
            ТекСтрока.Количество = ТекСтрока.Количество + СравнСтрока.Количество;
            Документ.Товары.Удалить(Инд2);
        Иначе
            Инд2 = Инд2 + 1;
        КонецЕсли;
    КонецЦикла;
    
    Инд = Инд + 1;
КонецЦикла;

Veuillez noter que lors de la suppression d'un doublon, nous n'augmentons pas Ind2, car l'élément suivant se déplacera à sa place.

Travail avec des échantillons de requêtes

Le résultat de la requête dans 1C n'est pas un tableau, mais un objet spécial qui est traité d'une manière particulière.

Parcours de base de l'échantillon

Запрос = Новый Запрос;
Запрос.Текст = 
    "SELECT
    |    Nomenclature.Name AS Name,
    |    Nomenclature.Price AS Price
    | FROM | Reference Book.Nomenclature AS Nomenclature
    |WHERE
    |    Nomenclature.Price > 0";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование + ": " + Выборка.Цена + " RUB");
КонецЦикла;

La méthode Следующий() déplace le pointeur vers l'enregistrement suivant et renvoie Истина si l'enregistrement existe. Lorsque les enregistrements sont terminés, Ложь est renvoyé et la boucle se termine.

Contourner l'échantillonnage hiérarchique

Pour les annuaires avec hiérarchie, il est pratique d'utiliser un échantillon avec des groupes :

Результат = Запрос.Выполнить();
ВыборкаГруппы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаГруппы.Следующий() Цикл
    Сообщить("== Group: " + ВыборкаГруппы.Категория + " ==");
    
    ВыборкаДетали = ВыборкаГруппы.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
        Сообщить("   " + ВыборкаДетали.Наименование);
    КонецЦикла;
КонецЦикла;

Requêtes par lots avec plusieurs résultats

Lorsqu'une requête renvoie plusieurs tableaux, nous traitons chacun d'eux :

МассивРезультатов = Запрос.ВыполнитьПакет();

Для Каждого РезультатЗапроса Из МассивРезультатов Цикл
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        // traitement de la ligne
    КонецЦикла;
КонецЦикла;

Parcourir les structures et les correspondances

Les structures et les correspondances sont des paires clé-valeur. Ils sont contournés via Для Каждого :

Параметры = Новый Структура;
Параметры.Вставить("Organization", "Romashka LLC");
Параметры.Вставить("Period", ТекущаяДата());
Параметры.Вставить("Warehouse", "Primary");

Для Каждого КлючЗначение Из Параметры Цикл
    Сообщить(КлючЗначение.Ключ + " = " + КлючЗначение.Значение);
КонецЦикла;

Pour les correspondances, la syntaxe est similaire, mais la correspondance accepte les clés de tout type, pas seulement les chaînes.

Gestion du cycle : Interrompre et Continuer

Deux opérateurs permettent de contrôler le déroulement du cycle de manière flexible.

Прервать — quitte immédiatement le cycle :

Для Каждого Товар Из Каталог Цикл
    Если Товар.Наименование = "Searched product" Тогда
        НайденныйТовар = Товар;
        Прервать;
    КонецЕсли;
КонецЦикла;

Продолжить — ignore le code d'itération restant et passe au suivant :

Для Каждого Контрагент Из СписокКонтрагентов Цикл
    Если Контрагент.ЭтоГруппа Тогда
        Продолжить; // groupes ignorés
    КонецЕсли;
    
    // traitement des éléments uniquement
    ОбработатьКонтрагента(Контрагент);
КонецЦикла;

Conseils pratiques sur la productivité

Il existe plusieurs règles qui vous aideront à écrire des cycles rapides et fiables dans 1C.

Ne vous référez pas à la base de données à l'intérieur de la boucle. Chaque appel à la base de données est une requête réseau. Si vous avez 10 000 lignes, vous ferez 10 000 appels au serveur. Au lieu de cela, obtenez toutes les données dont vous avez besoin en une seule requête avant la boucle :

// ❌ Lentement : demande à l'intérieur du cycle
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
    Остаток = РегистрыНакопления.ОстаткиТоваров
        .ПолучитьПоследнийСрез(, "Nomenclature = &Nom");
КонецЦикла;

// ✅ Rapide : une demande, puis un cycle
Запрос = Новый Запрос;
Запрос.Текст = "SELECT Nomenclature, Remainder FROM ...";
ТаблицаОстатков = Запрос.Выполнить().Выгрузить();

Для Каждого СтрокаТЧ Из Документ.Товары Цикл
    НайденнаяСтрока = ТаблицаОстатков.Найти(
        СтрокаТЧ.Номенклатура, "Nomenclature");
    Если НайденнаяСтрока <> Неопределено Тогда
        Остаток = НайденнаяСтрока.Остаток;
    КонецЕсли;
КонецЦикла;

Utilisez TableauValeurs.TrouverLignes() au lieu de boucles imbriquées. Au lieu de parcourir la boucle imbriquée, utilisez les méthodes de recherche intégrées — elles fonctionnent beaucoup plus rapidement :

// ❌ Boucle imbriquée O(n²)
Для Каждого Строка1 Из Таблица1 Цикл
    Для Каждого Строка2 Из Таблица2 Цикл
        Если Строка1.Ключ = Строка2.Ключ Тогда
            // ...
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

// ✅ Recherche via FindStrings O(n)
Для Каждого Строка1 Из Таблица1 Цикл
    Отбор = Новый Структура("Key", Строка1.Ключ);
    НайденныеСтроки = Таблица2.НайтиСтроки(Отбор);
    Для Каждого НайдСтрока Из НайденныеСтроки Цикл
        // ...
    КонецЦикла;
КонецЦикла;

Pour de grands volumes de données, utilisez l'indexation par correspondance :

Индекс = Новый Соответствие;
Для Каждого Строка Из Таблица2 Цикл
    Индекс.Вставить(Строка.Ключ, Строка);
КонецЦикла;

Для Каждого Строка1 Из Таблица1 Цикл
    НайденнаяСтрока = Индекс.Получить(Строка1.Ключ);
    Если НайденнаяСтрока <> Неопределено Тогда
        // travailler avec la chaîne trouvée
    КонецЕсли;
КонецЦикла;

Cette technique transforme O(n²) en O(n) et est d'une importance critique lors du traitement de milliers de lignes.

Aide-mémoire : quel cycle choisir ?

Tâche

Cycle

Pourquoi

Parcourir un tableau avec un index

Pour ... Par

Besoin d'un accès par code postal

Contourner la partie tabulaire

Pour tous

La version la plus lue

Suppression de lignes de la collection

Pour l'instant (parcours inverse)

Éviter d'omettre des éléments

Sélection du résultat de la requête

Jusqu'à l'échantillonnage. Suivant ()

La seule façon de contourner

Répétition jusqu'à la condition

Pour le moment

Nombre d'itérations inconnu

Contournement de la structure/conformité

Pour tous

Nous obtenons des paires clé-valeur

Conclusion

Les cycles dans 1C sont un outil que vous utiliserez dans chaque traitement, chaque rapport et chaque module. Rappelez-vous les trois règles principales : ne pas entrer dans la base de données à l'intérieur d'une boucle, supprimer les éléments dans l'ordre inverse et utiliser la correspondance pour une recherche rapide. Ces trois techniques distinguent un développeur 1C novice d'un expérimenté.

Si vous débutez dans la programmation ou si vous souhaitez maîtriser de nouvelles technologies, consultez l'application Code. Vous y trouverez des cours structurés sur Python, JavaScript, HTML, CSS et d'autres langages qui vous aideront à comprendre les bases et à passer à des tâches réelles. Et dans notre Chaîne Telegram vous pouvez toujours poser une question, obtenir le soutien d'une communauté de plus de 2 000 développeurs et être au courant des nouveaux matériaux. La programmation est plus facile qu'il n'y paraît quand il y a des gens prêts à aider.

🎯Arrête de reporter

Tu as aimé l'article ?
Place à la pratique !

Avec Kodik, tu ne lis pas seulement — tu codes immédiatement. Théorie + pratique = vraies compétences.

Pratique instantanée
🧠L'IA explique le code
🏆Certificat

Sans inscription • Sans carte