Имя: Пароль:
1C
1С v8
Проверить что 2 таблицы различны
0 Гёдза
 
15.10.15
15:57
Есть две таблицы Т1 и Т2 с одной колонкой "Значение".
Какой самый хороший способ проверить что они различны? те хоть в одной есть отличное значение
1 ДенисЧ
 
15.10.15
15:58
запросом
2 Гёдза
 
15.10.15
15:59
ну это понятно, вопрос каким?
3 Timon1405
 
15.10.15
15:59
(0) БСП power))

// Сравнивает данные сложной структуры с учетом вложенности.
//
// Параметры:
//  Данные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;
    
КонецФункции
4 Живой Ископаемый
 
15.10.15
15:59
то есть само значение не важно? Тогда сортирвкой, получением хэша и сравнением его
5 18_plus
 
15.10.15
15:59
6 Гёдза
 
15.10.15
16:01
(4) нет не важно
Не таблицы значений, а таблицы в бд.
Вернее даже одна тз, а другая в бд
7 Сторно абсурда
 
15.10.15
16:04
(2) например, вложенный запрос - объединение , доп поле число 1 для одной таб, - 1 для другой и во внешнем группировка по значению и имеющие Сумма (доп поле)<> 0
8 Лефмихалыч
 
15.10.15
16:42
полное соединение по
где А.поле есть Null или Б.поле есть null
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn