Имя: Пароль:
1C
1С v8
Сравнение строк двух таблиц на идентичность
,
0 Nikosss
 
13.03.13
18:44
Необходимо сравнить данные в двух таблицах (Структура ТаблицЗначений идентична) на предмет изменений. Пытался сделать 2 варианта с Циклом по одной из таблиц с СравнениеЗначений, но все равно возвращает 0(Строки идентичны), хотя различия в зачениях есть. Не хочется делать цикл по колонкам и сравнивать значений так...
Думал хотя бы ЗначениеВСтрокуВнутр решит проблему, но нет, А и Б одинаковые!

НайденнаяСтрока = ТаблицаОбщая.Найти (СтрокаSQL.ГУИД,"ГУИД");
       
Сравнение = Новый СравнениеЗначений;
ЕстьИзменения    = 0<>Сравнение.Сравнить(НайденнаяСтрока ,СтрокаSQL);
       
А = ЗначениеВСтрокуВнутр(НайденныйСотр);
Б = ЗначениеВСтрокуВнутр(СтрокаSQL);
ЕстьИзменения2 = 0<>Сравнение.Сравнить(А,Б);
1 Fragster
 
гуру
13.03.13
18:47
запрос помещаешь первую ВТ, добавляешь колонку со значением 1, объединение со второй таблицей со значением -1 в этой колонке. группировка по всем полям и суммой этого доп. поля, отбор где доп поле <> 0
2 SherifSP
 
13.03.13
19:01
(0) А через найти строки?
3 Nikosss
 
13.03.13
19:08
(1) Не хотелось добавлять новые колонки, но сейчас попробую! (2) А что искать? По какому принципу? это в отбор вставлять все поля и значения
4 NcSteel
 
13.03.13
19:10
сгруппировать по всем колонкам.
5 Nikosss
 
13.03.13
19:12
(4) Это имеешь ввиду вариант из (1) ?
6 fisher
 
13.03.13
19:14
Не ипать мозги и сравнивать циклом по колонкам. Будет быстро.
ЗЫ. Загонять ТЗ на север БД только для того, чтобы сравнить строки - это слишком уж по одинэсовски.
7 pumbaEO
 
13.03.13
19:26
kdiff, diff - вывод в консоль, парсинг файла.
8 Nikosss
 
13.03.13
19:28
(6) Ну вот оставался единственный вариант, его похоже и придется использовать.
(1)  Так как колонок 25 то придется описывать каждую в запросе,а это чекнишься, иначе не получится сгруппировать
9 zladenuw
 
13.03.13
19:32
так если написать так должно искать по всем колонкам
НайденнаяСтрока = ТаблицаОбщая.Найти(СтрокаSQL.ГУИД);
10 Nikosss
 
13.03.13
19:48
(9) Так проблема не найти строку, а сравнить ее с другой. Колонок 25 и вариант Fragster ,возможно, подошел если бы не количество колонок - их надо в ВТ описывать в двух таблицах. А это 50 раз, иначе не получится сгруппировать в запросе по всем колонкам, кроме последней
11 Fragster
 
гуру
13.03.13
19:52
(10) ты ленивый? тогда без запроса = делаешь новую таблицу (скопироватьКолонки), добавляешь колонку с числом, перегоняешь в нее все данные через заполнитьЗначенияСвойств и заполняешь доп колонку 1 и -1 соответственно. сворачиваешь (вот тут надо будет циклом сформировать строку с колонками), удаляешь все строки с 0. остается только искомое.
12 Nikosss
 
14.03.13
10:42
(11) Не ленивый, просто хочется найти самый оптимальный способ. Твой пока самый оптимальный))
13 ale-sarin
 
14.03.13
10:48
(0) Я конечно извиняюсь,но в типовых (КА точно) есть функция
НастройкаПравДоступа.СравнитьТаблицыНаборовЗаписей(ТаблицаЗначений1, ТаблицаЗначений2)
14 Classic
 
14.03.13
10:57
(8)
Динамически рисуй запрос. Тогда будет пофиг 5 или 25
15 Reset
 
14.03.13
11:00
(6) +1
16 Zero on a dice
 
14.03.13
11:06
я бы так сделал:
через повторное использование получал бы список колонок в строку и затем сворачивал бы промежуточную таблицу из этих двух строк.
количество строк промежуточной и даст ответ.
насколько медленнее сравнения в цикле - неясно.
17 Полотенчик
 
14.03.13
11:08
Функция СравнитьТЗ(ТЗ_1, ТЗ_2, ПоляСравнения)
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   Запрос.Текст =
   "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ_1 ИЗ &ТЗ_1 КАК ТЗ_1;
   |ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ_2 ИЗ &ТЗ_2 КАК ТЗ_2";
   Запрос.УстановитьПараметр("ТЗ_1", ТЗ_1);
   Запрос.УстановитьПараметр("ТЗ_2", ТЗ_2);
   Запрос.Выполнить();
   
   Текст = "ВЫБРАТЬ";
   Для Каждого ПолеСравнения из ПоляСравнения Цикл
       Текст = Текст + "
       |    Итоговая." + ПолеСравнения + ",";
   КонецЦикла;
   Текст = Текст + "
       |    СУММА(Итоговая.Счетчик) КАК Счетчик
       |ИЗ
       |    (ВЫБРАТЬ";
       
   Для Каждого ПолеСравнения из ПоляСравнения Цикл
       Текст = Текст + "
       |        ТЗ_1." + ПолеСравнения + ",";
   КонецЦикла;
   Текст = Текст + "
       |        0.5 КАК Счетчик
       |    ИЗ
       |        ТЗ_1 КАК ТЗ_1
       |    
       |    ОБЪЕДИНИТЬ ВСЕ
       |    
       |    ВЫБРАТЬ";
       
   Для Каждого ПолеСравнения из ПоляСравнения Цикл
       Текст = Текст + "
       |        ТЗ_2." + ПолеСравнения + ",";
   КонецЦикла;
   Текст = Текст + "
       |        0.5 КАК Счетчик
       |    ИЗ
       |        ТЗ_2 КАК ТЗ_2) КАК Итоговая
       |
       |СГРУППИРОВАТЬ ПО";
       
   НужнаЗапятая = Ложь;
   Для Каждого ПолеСравнения из ПоляСравнения Цикл
       Если НужнаЗапятая Тогда
           Текст = Текст + ",";
       КонецЕсли;
       Текст = Текст + "
       |    Итоговая." + ПолеСравнения;
       НужнаЗапятая = Истина;
   КонецЦикла;
   Текст = Текст + "
       |ИТОГИ
       |    МИНИМУМ(Счетчик)
       |ПО
       |    ОБЩИЕ"
       ;
       
   Запрос.Текст = Текст;    
   Выборка = Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
       ТЧРавны = Выборка.Счетчик = 1;
   Иначе
       ТЧРавны = Ложь;
   КонецЕсли;
   
   Возврат ТЧРавны;
КонецФункции
18 Полотенчик
 
14.03.13
11:09
+(17) причесать только еще немного
19 fisher
 
14.03.13
11:17
Конкурс в номинации "Почетный 1С-Извращенец" набирал обороты...
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший