1С 8.3 Сравнение двух таблиц значений - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Сравнение двух таблиц значений

Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Реклама:
Перейти в раздел примеры кода 1С 8.3:
Метод N1 Сравнения таблиц значений (аналог типового) в 1С 8.3:
Функция Сравнить_Две_Таблицы_Значений(ТЗn1, ТЗn2) Экспорт

   
// Данный метод программно сравнивает две таблицы значений по характеристикам и значениям

   
Если ТипЗнч(ТЗn1) <> Тип("ТаблицаЗначений")  Тогда
       
Сообщить("Параметр N1 не является Таблицой значений");
        Возврат Ложь;
    КонецЕсли;

    Если
ТипЗнч(ТЗn2) <> Тип("ТаблицаЗначений") Тогда
       
Сообщить("Параметр N2 не является Таблицой значений");
        Возврат Ложь;
    КонецЕсли;

    Если
ТЗn1.Количество() <> ТЗn2.Количество() Тогда
       
Сообщить("Количество строк у таблиц знаений различное");
        Возврат Ложь;
    КонецЕсли;

    Если
ТЗn1.Колонки.Количество() <> ТЗn2.Колонки.Количество() Тогда
       
Сообщить("Количество колонок у таблиц знаений различное");
        Возврат Ложь;
    КонецЕсли;

   
// Провека полей
   
Для Каждого КолонкаТЗn1 Из ТЗn1.Колонки Цикл
        Если
ТЗn2.Колонки.Найти(КолонкаТЗn1.Имя) = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;

    Для Каждого
КолонкаТЗn2 Из ТЗn2.Колонки Цикл
        Если
ТЗn1.Колонки.Найти(КолонкаТЗn2.Имя) = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;

   
// Формирование строки индекса (для оптимизации поиска по ТЗ)
   
СтрокаИндексаТЗ1 = "";
    Для каждого
КолонкаТЗn1 Из ТЗn1.Колонки Цикл
        Если
СтрокаИндексаТЗ1 = "" Тогда
           
СтрокаИндексаТЗ1 = КолонкаТЗn1.Имя;
        Иначе
           
СтрокаИндексаТЗ1 = СтрокаИндексаТЗ1+","+КолонкаТЗn1.Имя;
        КонецЕсли;
    КонецЦикла;

   
// Вставка индекса
   
ТЗn2.Индексы.Добавить(СтрокаИндексаТЗ1);

   
// Сравнения имён колонок ТЗ (необязательно если заведомо различны, можно закомментировать)
    //Для Каждого СтрокаТаблицы1 Из ТЗn1 Цикл
    //    Для Каждого КолонкаТаблицы Из ТЗn1.Колонки Цикл
    //        Для Каждого СтрокаТаблицы2 Из ТЗn2 Цикл
    //          Если СтрокаТаблицы2[КолонкаТаблицы.Имя] <> СтрокаТаблицы1[КолонкаТаблицы.Имя] Тогда
    //              Сообщить("Имя колонки ТЗ N1 не совпадает с именем колонки ТЗ N2");
    //                Возврат Ложь;
    //            КонецЕсли;
    //        КонецЦикла;
    //    КонецЦикла;
    //КонецЦикла;

    // Проверка записей
   
Для Каждого СтрокаТаблицы1 Из ТЗn1 Цикл

       
СтруктураПоиска1 = Новый Структура;
        Для Каждого
Колонка Из ТЗn1.Колонки Цикл
           
СтруктураПоиска1.Вставить(Колонка.Имя, СтрокаТаблицы1[Колонка.Имя]);
        КонецЦикла;

       
СтрокиТаблицы2 = ТЗn2.НайтиСтроки(СтруктураПоиска1);
        Если
СтрокиТаблицы2.Количество() <> 1 Тогда
            Возврат Ложь;
        КонецЕсли;

    КонецЦикла;

   
// Формирование строки индекса (для оптимизации поиска по ТЗ)
   
СтрокаИндексаТЗ2 = "";
    Для Каждого
КолонкаТЗn2 Из ТЗn2.Колонки Цикл
        Если
СтрокаИндексаТЗ2 = "" Тогда
           
СтрокаИндексаТЗ2 = КолонкаТЗn2.Имя;
        Иначе
           
СтрокаИндексаТЗ2 = СтрокаИндексаТЗ2+","+КолонкаТЗn2.Имя;
        КонецЕсли;
    КонецЦикла;

   
// Вставка индекса
   
ТЗn1.Индексы.Добавить(СтрокаИндексаТЗ2);

    Для Каждого
СтрокаТаблицы2 Из ТЗn2 Цикл

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

       
СтрокиТаблицы1 = ТЗn1.НайтиСтроки(СтруктураПоиска2);
        Если
СтрокиТаблицы1.Количество() <> 1 Тогда
            Возврат Ложь;
        КонецЕсли;

    КонецЦикла;

    Возврат Истина;

КонецФункции
Метод N2 Сравнения таблиц значений (по строкам) в 1С 8.3:
Функция Сравнить_Две_Таблицы_Значений_ПоСтрокам(ТЗn1, ТЗn2, ИзмеренияТЗ) Экспорт

   
ВсеКолонкиТЗ = "";
    Для Каждого
Колонка Из ТЗn1.Колонки Цикл
       
ВсеКолонкиТЗ = ВсеКолонкиТЗ + ", " + Колонка.Имя
    КонецЦикла;
   
ВсеКолонкиТЗ = Сред(ВсеКолонкиТЗ, 2);

   
ТаблицаТЗn2 = ТЗn2.Скопировать();
   
ТаблицаТЗn2.Колонки.Добавить("Знак", Новый ОписаниеТипов("Число"));
   
ТаблицаТЗn2.ЗаполнитьЗначения(1, "Знак");

   
//разница с методом по столбцам (начало)
   
Для Каждого Строка Из ТЗn1 Цикл
       
ЗаполнитьЗначенияСвойств(ТаблицаТЗn2.Добавить(), Строка);
    КонецЦикла;
   
//разница с методом по столбцам (начало)

   
ТаблицаТЗn2.Колонки.Добавить("Подсчет");
   
ТаблицаТЗn2.ЗаполнитьЗначения(1, "Подсчет");
   
ТаблицаТЗn2.Свернуть(ВсеКолонкиТЗ, "Знак, Подсчет");

   
Результат = ТаблицаТЗn2.Скопировать(Новый Структура("Подсчет", 1), ВсеКолонкиТЗ + ", Знак");
   
Результат.Сортировать(ИзмеренияТЗ);

    Возврат
Результат

КонецФункции
Метод N3 Сравнения таблиц значений (по столбцам) в 1С 8.3:
Функция Сравнить_Две_Таблицы_Значений_ПоСтолбцам(ТЗn1, ТЗn2, ИзмеренияТЗ) Экспорт

   
ВсеКолонкиТЗ = "";
    Для Каждого
Колонка Из ТЗn1.Колонки Цикл
       
ВсеКолонкиТЗ = ВсеКолонкиТЗ + ", " + Колонка.Имя
    КонецЦикла;
   
ВсеКолонкиТЗ = Сред(ВсеКолонкиТЗ, 2);

   
ТаблицаТЗn2 = ТЗn2.Скопировать();
   
ТаблицаТЗn2.Колонки.Добавить("Знак", Новый ОписаниеТипов("Число"));
   
ТаблицаТЗn2.ЗаполнитьЗначения(1, "Знак");

    Для Каждого
Строка Из ТЗn1 Цикл
       
ЗаполнитьЗначенияСвойств(ТаблицаТЗn2.Добавить(), Строка);
    КонецЦикла;

   
//разница с методом по строкам (начало)
   
Для а = 1 По ТЗn1.Количество() Цикл
       
ТЗn2.Вставить(0);
    КонецЦикла;

    Для
а = 0 По ТЗn1.Колонки.Количество() - 1 Цикл
       
ТЗn2.ЗагрузитьКолонку(ТЗn1.ВыгрузитьКолонку(а), а);
    КонецЦикла;
   
//разница с методом по строкам (конец)

   
ТаблицаТЗn2.Колонки.Добавить("Подсчет");
   
ТаблицаТЗn2.ЗаполнитьЗначения(1, "Подсчет");
   
ТаблицаТЗn2.Свернуть(ВсеКолонкиТЗ, "Знак, Подсчет");

   
Результат = ТаблицаТЗn2.Скопировать(Новый Структура("Подсчет", 1), ВсеКолонкиТЗ + ", Знак");
   
Результат.Сортировать(ИзмеренияТЗ);

    Возврат
Результат

КонецФункции
Поиск кода
0
комментарии
____________________
Copyright by 1Cnik.by©, «Программист 1С в г.Минске», 19.04.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому