Библиотека кода: Сравнить две таблицы значений



//Сравнивает две таблицы значений
//
Функция ТаблицыЗначенийРавны(ТаблицаЗначений1, ТаблицаЗначений2) Экспорт


    Если ТипЗнч(ТаблицаЗначений1) <> Тип("ТаблицаЗначений") ИЛИ ТипЗнч(ТаблицаЗначений2) <> Тип("ТаблицаЗначений") Тогда
        Возврат Ложь;
    КонецЕсли; 
    
    Если ТаблицаЗначений1.Количество() <> ТаблицаЗначений2.Количество() Тогда
        Возврат Ложь;
    КонецЕсли; 


    Если ТаблицаЗначений1.Колонки.Количество() <> ТаблицаЗначений2.Колонки.Количество() Тогда
        Возврат Ложь;
    КонецЕсли;
    
   // Проверим поля
 
    Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
        Если ТаблицаЗначений2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла; 
    Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
        Если ТаблицаЗначений1.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла; 
    
   // сформируем строку индекса для оптимизации поиска по таблице значений
 
    СтрокаИндекса = "";
    Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
        Если СтрокаИндекса = "" Тогда
            СтрокаИндекса = Колонка.Имя;
        Иначе
            СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя;
        КонецЕсли;
    КонецЦикла;
   // добавим индекс
 
    ТаблицаЗначений2.Индексы.Добавить(СтрокаИндекса);
    
   // Проверим записи
 
    Для каждого СтрокаТаблицы Из ТаблицаЗначений1 Цикл
        СтруктураПоиска = Новый Структура;
        Для каждого Колонка Из ТаблицаЗначений1.Колонки Цикл
            СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]);
        КонецЦикла;
        СтрокиТаблицы2 = ТаблицаЗначений2.НайтиСтроки(СтруктураПоиска);
        Если СтрокиТаблицы2.Количество() <> 1 Тогда
            Возврат Ложь;
        КонецЕсли; 
    КонецЦикла;
    
   // сформируем строку индекса для оптимизации поиска по таблице значений
 
    СтрокаИндекса = "";
    Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
        Если СтрокаИндекса = "" Тогда
            СтрокаИндекса = Колонка.Имя;
        Иначе
            СтрокаИндекса = СтрокаИндекса+","+Колонка.Имя;
        КонецЕсли;
    КонецЦикла;
   // добавим индекс
 
    ТаблицаЗначений1.Индексы.Добавить(СтрокаИндекса);
    
    Для каждого СтрокаТаблицы Из ТаблицаЗначений2 Цикл
        СтруктураПоиска = Новый Структура;
        Для каждого Колонка Из ТаблицаЗначений2.Колонки Цикл
            СтруктураПоиска.Вставить(Колонка.Имя, СтрокаТаблицы[Колонка.Имя]);
        КонецЦикла;
        СтрокиТаблицы1 = ТаблицаЗначений1.НайтиСтроки(СтруктураПоиска);
        Если СтрокиТаблицы1.Количество() <> 1 Тогда
            Возврат Ложь;
        КонецЕсли; 
    КонецЦикла;
    
    Возврат Истина;
    
КонецФункции// СравнитьТаблицыЗначений()