Имя: Пароль:
1C
 
Сравнение ТЗ или особенности ЗначениеВСтрокуВнутр
,
0 ИС-2
 
naïve
23.01.15
08:20
Надо сравнить 2 ТЗ на изменения. Но 1 ТЗ получается из ссылки, а другая ТЧ. Если изменить, что-то в ТЧ, то "хэш" у второй таблицы меняется, хотя данные остаются те же самые. В итоге функция показывает различия, хотя их нет.

Что означают цифры в, {2,2,3, ? Как можно добиться идентичности таблиц, без сложного кода? Или проще сравнивать все через запрос.
1 ИС-2
 
naïve
23.01.15
08:20
КлючевыеСтолбцы = "Номенклатура,ХарактеристикаНоменклатуры,СерияНоменклатуры";
    
    ТЗ_Отсканировано = Отсканировано.Выгрузить(Отсканировано.НайтиСтроки(Новый Структура("Подтверждено",Истина)),КлючевыеСтолбцы);
    ТЗ_Отсканировано.сортировать(КлючевыеСтолбцы);
    
    // в этом случае какие-то поля меняет и таблицы не идентичны, поэтому делаем другой вариант
    //ТЗ_Док = рабдок.ссылка.Товары.выгрузить(,КлючевыеСтолбцы);
    ТЗ_Док = ТЗ_Отсканировано.СкопироватьКолонки();
    Для Каждого Стр из рабдок.ссылка.Товары Цикл
        //ЗаполнитьЗначенияСвойств(ТЗ_Док.Добавить(),стр);
        Для Каждого КлСтолб из ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(КлючевыеСтолбцы,",") Цикл
            
        КонецЦикла;    
    КонецЦикла;;    
    ТЗ_Док.сортировать(КлючевыеСтолбцы);
    
    ЕстьИзм = не (ЗначениеВСтрокуВнутр(ТЗ_Док) = ЗначениеВСтрокуВнутр(ТЗ_Отсканировано));
2 ИС-2
 
naïve
23.01.15
08:21
упс чуть не то
3 ИС-2
 
naïve
23.01.15
08:21
ТЗ_Отсканировано

{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
{8,
{3,
{3,"Номенклатура",
{"Pattern",
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843}
},"Номенклатура",10},
{4,"ХарактеристикаНоменклатуры",
{"Pattern",
{"#",32fb38a7-0eff-4313-93c7-f07d95302083}
},"Характеристика номенклатуры",10},
{5,"СерияНоменклатуры",
{"Pattern",
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab}
},"Серия номенклатуры",10}
},
{2,3,0,3,1,4,2,5,
{1,3,
{2,0,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e4803c4d314049},0},
{2,1,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e47ed3a1f7e5fb},0},
{2,2,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e4803c4d31403d},0}
},-1,2}
}
}
4 ИС-2
 
naïve
23.01.15
08:22
ТЗ_Док

{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,
{8,
{3,
{3,"Номенклатура",
{"Pattern",
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843}
},"Номенклатура",10},
{4,"ХарактеристикаНоменклатуры",
{"Pattern",
{"#",32fb38a7-0eff-4313-93c7-f07d95302083}
},"Характеристика номенклатуры",10},
{5,"СерияНоменклатуры",
{"Pattern",
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab}
},"Серия номенклатуры",10}
},
{2,3,0,3,1,4,2,5,
{1,3,
{2,2,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e4803c4d314049},0},
{2,0,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e47ed3a1f7e5fb},0},
{2,1,3,
{"#",dd0e8719-5e55-43a0-944a-8321d4c46843,162:83642b3c13e292974d52bc28dd7a0c6a},
{"#",32fb38a7-0eff-4313-93c7-f07d95302083,346:00000000000000000000000000000000},
{"#",0675623a-8763-43c0-94dc-e6f81b5173ab,221:997c002219a6a0cc11e4803c4d31403d},0}
},-1,2}
}
}
5 Провинциальный 1сник
 
23.01.15
08:26
Неблагодарное это занятие.. "Внутр" он на то и внутр, что может поменяться в любое время по желанию 1с. Если надо что-то подобное, лучше делайте сериализацию в какой-то стандартный формат, xml или json.
6 ИС-2
 
naïve
23.01.15
08:40
(5) как можно быстро и просто сериализовать ТЗ? XMLСтрока - не работает с ТЗ
7 Провинциальный 1сник
 
23.01.15
08:56
(6) Как-то так:

Функция XML(Данные)
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
    Возврат ЗаписьXML.Закрыть();
КонецФункции
8 Провинциальный 1сник
 
23.01.15
09:08
+(7) А вот десериализация

Функция ДанныеИзXML(Стр)
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(Стр);
    Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
9 ИС-2
 
naïve
23.01.15
09:17
(8) спс. Нашел типовое

ТиповыеОтчеты.СериализоватьОбъектXDTO

    КлючевыеСтолбцы = "Номенклатура,ХарактеристикаНоменклатуры,СерияНоменклатуры";
    
    ТЗ_Отсканировано = Отсканировано.Выгрузить(Отсканировано.НайтиСтроки(Новый Структура("Подтверждено",Истина)),КлючевыеСтолбцы);
    ТЗ_Отсканировано.сортировать(КлючевыеСтолбцы);
    
    // в этом случае какие-то поля меняет и таблицы не идентичны, поэтому делаем другой вариант
    //ТЗ_Док = рабдок.ссылка.Товары.выгрузить(,КлючевыеСтолбцы);
    ТЗ_Док = ТЗ_Отсканировано.СкопироватьКолонки();
    Для Каждого Стр из рабдок.ссылка.Товары Цикл
        //ЗаполнитьЗначенияСвойств(ТЗ_Док.Добавить(),стр);
        НовСтр = ТЗ_Док.Добавить();
        Для Каждого КлСтолб из ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(КлючевыеСтолбцы,",") Цикл
            НовСтр[КлСтолб] = Стр[КлСтолб];     
        КонецЦикла;    
    КонецЦикла;;    
    ТЗ_Док.сортировать(КлючевыеСтолбцы);
    
    Хэш1 = ТиповыеОтчеты.СериализоватьОбъектXDTO(ТЗ_Отсканировано);
    Хэш2 = ТиповыеОтчеты.СериализоватьОбъектXDTO(ТЗ_Док);

//    ЕстьИзм = не (ЗначениеВСтрокуВнутр(ТЗ_Док) = ЗначениеВСтрокуВнутр(ТЗ_Отсканировано));
    
    ЕстьИзм = не (Хэш1 = Хэш2);    
    
    Возврат ЕстьИзм;
10 Ёпрст
 
23.01.15
09:30
(0) Это не верное сравнение ТЗ.
Изменят порядок строк и всё, привет котёнку - твои "хеши" разные, а фактически, тз одинаковые.
11 Ёпрст
 
23.01.15
09:30
Ну и серилизация, не быстрый метод.
12 ИС-2
 
naïve
23.01.15
09:31
(10) поэтому я делаю одинаковую сортировку
13 Ёпрст
 
23.01.15
09:36
(9) Хня же написана, не ?
Зачем ты к отсканированной ТЗ прибавляешь строки документа ?
14 Ёпрст
 
23.01.15
09:36
и потом ЭТО сравниваешь ?
Всегда же будет что они разные.
15 ИС-2
 
naïve
23.01.15
10:12
(13) читай код внимательно. Ни где я не добавляю к ТЗ_Отсканировано строки.

Если не знаешь 1С, то сообщаю что метод СкопироватьКолонки не копирует таблицу. И таблица значений не ссылочная.

Так, что все работает нормально
16 ИС-2
 
naïve
23.01.15
10:14
по скорости не знаю - в моем случае работает нормально (до 100 строк).
А вот большие таблицы надо как-то по другому сравнивать...
17 WebberNSK
 
23.01.15
10:35
(16) непонятно в чем у вас сложность написать сравнение строк?
ваш механизм явно будет проигрывать по производительности- столько не нужных операций для этого делается
18 ИС-2
 
naïve
23.01.15
10:42
(17) как сравнивать строки?
Я знаю только 2 способа - запросом по 2 ТЗ (в этом случае будет тратиться время на создание временных таблиц) и перебор строк таблиц значений (если ТЗ большие, то надо очень много времени).
Если знайте какие-то еще сообщите...

Оба эти варианта, требуют  больших трудозатрат программиста на написание и отладку алгоритма чем вставка 3 строк кода.
19 tridog
 
23.01.15
10:59
(11) Угу, настолько не быстрый, что на любой серверный вызов по нескольку раз делается и от этого наверняка все страдают.

Нужно соизмерять уровень неоптимальности с накладными расходами на "соседних" участках алгоритма.
20 ИС-2
 
naïve
23.01.15
11:00
(19) так какие же есть альтернативы?
21 WebberNSK
 
23.01.15
11:03
перебор строк таблиц значений (если ТЗ большие, то надо очень много времени).

то что вы делаете, будет требовать намного больше времени чем простейшая операция сравнения строк в таблицах

проиндексируйте таблицы и/или используйте дополнительные структуры хранящие индексы строк для обхода таблиц
22 tridog
 
23.01.15
11:19
(20) Нда-м, сарказм не понят. На любой серверный вызов сериализация выполняется по нескольку раз.

И в 99% случаев выполняется быстрее, нежели код на встроенном языке.

Если задачу можно решить сериалзиацией - не нужно бояться ее использовать.
23 Ёпрст
 
23.01.15
12:09
(15) А это че ??
Для Каждого Стр из рабдок.ссылка.Товары Цикл
        //ЗаполнитьЗначенияСвойств(ТЗ_Док.Добавить(),стр);

        НовСтр = ТЗ_Док.Добавить();
24 Ёпрст
 
23.01.15
12:10
И при чем тут скопировать колонки ?
25 Ёпрст
 
23.01.15
12:12
всё догнал, просто пустую тз создаешь
Один хрен , метод не очень