Версия для печати темы (https://pro1c.org.ua/index.php?s=c1c544628eacfd9fdea8bcfe0718235a&showtopic=59528)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ сравнить много значений

Автор: 4andriy 10.06.20, 10:37

1С 7.7 Предприятие

Если Знач1=Знач2 Тогда
Сообщить(Совпадение);    
КонецЕсли;

Если Знач2=Знач3 Тогда
Сообщить(Совпадение);    
КонецЕсли;

Если Знач3=Знач4 Тогда
Сообщить(Совпадение);    
КонецЕсли;

... и таких 20 значений


возможно есть фукнция сравнить все 20 значений и уменьшить код

Автор: sava1 10.06.20, 12:07

напишите.

Автор: Vofka 10.06.20, 12:10

4andriy, положить все в массив и сделать 2 цикла. Что-то вроде такого (псевдокод):

Для ъ=0 По ъ=КоличествоВМассиве Цикл
   Для ъъ = 0 По ъъ=КоличествоВМассиве Цикл
      Если ъ <> ъъ И Массив[ъ] == Массив[ъъ] Тогда
         Сообщить("Совпадение " + ъ + " и " + ъъ);
      КонецЕсли;
   КонецЦикла;
КонецЦикла;

Автор: Sharzem 10.06.20, 12:42

4andriy @ Сегодня, 10:37 * ,
Ще можна так:

Функция ВернутьЗначенияДляСравнения()
    лпЧетные = 2;
    лпНечетные = 3;
    лпСписЗнач = СоздатьОбъект("СписокЗначений");
    Для лпНомСписка = 1 По 20 Цикл
        Если лпНомСписка % 2 = 0 Тогда
            лпСписЗнач.ДобавитьЗначение(лпЧетные);
        Иначе
            лпСписЗнач.ДобавитьЗначение(лпНечетные);
        КонецЕсли;
    КонецЦикла;
    Возврат лпСписЗнач;
КонецФункции

//======================================================================
Процедура СравнитьЗначения(прСписЗнач,прНомер)
    лпЗначениеКотороеНужноСравнить = прСписЗнач.ПолучитьЗначение(прНомер);
    лпРазмерСписка = прСписЗнач.РазмерСписка();
    Для лпНомСписка = 1 По лпРазмерСписка Цикл
        Если лпНомСписка = прНомер Тогда
            Продолжить;
        КонецЕсли;
        лпЗначение = прСписЗнач.ПолучитьЗначение(лпНомСписка);
        Если лпЗначениеКотороеНужноСравнить = лпЗначение Тогда
            Сообщить("Значение в списке № "+лпНомСписка+" = искомому значению № "+прНомер+" т.е. = "+лпЗначение);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры // СравнитьЗначения

//======================================================================
Процедура Сформировать()
    лпСписЗнач = ВернутьЗначенияДляСравнения();
    лпРазмерСписка = лпСписЗнач.РазмерСписка();
    Для лпНомСписка = 1 По лпРазмерСписка Цикл
        СравнитьЗначения(лпСписЗнач,лпНомСписка);
    КонецЦикла;
КонецПроцедуры // Сформировать

Автор: volodya1122 10.06.20, 14:20

Вставлю и свои 5 копеек.
Я так проверяю в табличной части документа на дубли контрагентов. Легко можно переделать на проверку на дубли в таблице значений или списке значений. Тут отработает быстрее чем цикл в цикле

   сз=СоздатьОбъект("СписокЗначений");
    ВыбратьСтроки();
    Пока ПолучитьСтроку()=1 Цикл
        зн=Контрагент.Код;
        поз=сз.НайтиЗначение(зн);
        Если поз<>0 Тогда
            СтараСтрічка="";
            тмп=сз.ПолучитьЗначение(поз,СтараСтрічка);
            сообщить("Однаковий Контрагент: "+Контрагент+" в рядках: "+СтараСтрічка+" і "+НомерСтроки,"!");
        КонецЕсли;
        сз.ДобавитьЗначение(зн,""+НомерСтроки);
    КонецЦикла;

Автор: Sharzem 11.06.20, 8:59

Цитата(volodya1122 @ 10.06.20, 14:20) *
проверяю в табличной части документа на дубли контрагентов

А мені не подобається Ваш код...
Я б реалізував би так:
    лпПустоеЗначение = ПолучитьПустоеЗначение("Справочник.Контрагенты");
    
    лпТаблЧасть = СоздатьОбъект("ТаблицаЗначений");//Копія табличної частини для отримання номерів строк
    лпТаблЗнач = СоздатьОбъект("ТаблицаЗначений");//Місце пошуку дублів
    
    ВыгрузитьТабличнуюЧасть(лпТаблЧасть,"Контрагент");
    лпТаблЗнач.Загрузить(лпТаблЧасть);
    
    лпТаблЗнач.НоваяКолонка("Количество");//Для підрахунку кількості дублів
    лпТаблЗнач.Заполнить(1,,,"Количество");
    лпТаблЗнач.Свернуть("Контрагент","Количество");
    лпТаблЗнач.Сортировать("Количество");//Сортуємо
    
    лпКвоСтрок = лпТаблЗнач.КоличествоСтрок();
    Для лпСчетчик = 1 По лпКвоСтрок Цикл
        лпНомСтроки = (лпКвоСтрок+1)-лпСчетчик;//Йдемо знизу вверх
        лпКвоПовтор = лпТаблЗнач.ПолучитьЗначение(лпНомСтроки,"Количество");
        Если лпКвоПовтор = 1 Тогда// Продовжувати пошук не потрібно, вище дублів немає
            Прервать;
        КонецЕсли;
        лпКонтрагент = лпТаблЗнач.ПолучитьЗначение(лпНомСтроки,"Контрагент");
        Если ПустоеЗначение(лпКонтрагент) = 1 Тогда//Може бути і таке, це не основне завдання.
            Продолжить;
        КонецЕсли;
        лпИскомаяСтрока = "";
        лпТекст = "";
        Пока лпТаблЧасть.НайтиЗначение(лпКонтрагент,лпИскомаяСтрока,"Контрагент") = 1 Цикл
            Если ПустаяСтрока(лпТекст) = 1 Тогда
                лпТекст = " разів в стрічках № "+лпИскомаяСтрока;
            Иначе
                лпТекст = лпТекст+", "+лпИскомаяСтрока;
            КонецЕсли;
            лпТаблЧасть.УстановитьЗначение(лпИскомаяСтрока,"Контрагент",лпПустоеЗначение);//Затираємо знайденого
            лпИскомаяСтрока = "";
        КонецЦикла;
        Сообщить("Дублюється контрагент "+СокрЛП(Строка(лпКонтрагент))+" "+лпКвоПовтор+лпТекст,"!");
    КонецЦикла;

Автор: volodya1122 11.06.20, 11:13

Sharzem @ Сегодня, 9:59 * ,
Спеціально для мене заморочились? Звичайно це набагато краще. (оптимізовувати код можна до бескінечності). але і буковок набагато більше писати потрібно було,

Автор: Sharzem 11.06.20, 13:21

Цитата(volodya1122 @ 11.06.20, 11:13) *
Спеціально для мене заморочились?

Зайнятися немає чим. Радий, що оцінили.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua