Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 мая 2024, 03:50

как программно сравнить 2 запроса 1с

Автор esscargoott, 04 мар 2024, 14:36

0 Пользователей и 1 гость просматривают эту тему.

esscargoott

подскажите как программно можно сравнить 2 запроса (результата запросов). У меня имеется справочник с шаблонами запросов и есть обработчик с формой куда пользователь вводит свой запрос. Мне надо сравнить их и если 2 запроса одинаковые то вывести сообщение о том что все круто. Запросы могут быть написано как то по разному но результат то один, вот и хочу проверить по результату

ls600

из БСП функцию вытащил.
Посмотри, может подойдет.

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


esscargoott

ls600, возможно и подойдет, но я не очень понимаю как это можно переделать. просто тут типы сравниваются, а мне результаты запросов надо сравнить

ls600

esscargoott, что мешает выгрузить запрос в таблицу значений и сравнить?

esscargoott

ls600, так и сделал, спасибо большое

Теги:  

Похожие темы (5)

Рейтинг@Mail.ru

Поиск