Имя: Пароль:
1C
1С v8
Сравнение файлов на сервере. Обычные формы, УТ 10.3
, ,
0 pessok
 
24.12.14
14:29
Коллеги, привет! Вот такой затык заимел на свою голову. Есть двай файлика текстовых, там CSV. Один берется с фтп, другой генерируется программно. Надо и сравнить, и, если есть отличия, обновить на фтп. Все это обернуто в регл. задание. Столкнулся с тем, СравнениеФайлов умеет только толстый клиент. Решил пойти методом проверки ОС, через  "fc". Тут уже сервер не умеет КомандаСистемы. Решил делать через Shell. На клиенте все прекрасно отрабатывает, на сервере не хочет создавать файл...

Код:

Функция ФайлыРазличны(ПервыйФайл, ВторойФайл)
    
    ФайлыРазличны = Ложь;
    
    ФайлРезультат = КаталогВременныхФайлов()+"res.txt";
        
    WshShell = Новый COMОбъект("Wscript.Shell");
    WshShell.run("fc /a "+ПервыйФайл+" "+ВторойФайл+" > "+ФайлРезультат, 0, True);
    
    ТекстДок = Новый ТекстовыйДокумент;
    
    ТекстДок.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
    
    ТекстПроверки = ТекстДок.ПолучитьТекст();
    
    Если Найти(ТекстПроверки, "*****") > 0 Тогда
        ФайлыРазличны = Истина;
    КонецЕсли;
    УдалитьФайлы(ФайлРезультат);
    
    Возврат ФайлыРазличны
    
КонецФункции
1 pessok
 
24.12.14
14:31
+(0) вполне понятно, что файлы можно сравнить методами встроенного языка, но тут уже спортивный интерес
2 Господин ПЖ
 
24.12.14
14:31
сервер приложений про файлы на клиенте не в курсе... или прав нет
3 pessok
 
24.12.14
14:32
(2) все файлы создаются на сервере приложений, через КаталогВременныхФайлов(). Посему, думается, с правами тоже не должно быть проблем
4 pessok
 
24.12.14
14:33
+(3) т.е. сам файлик проверки создается регламентным заданием и вполне успешно кладется в тем USR1CV8, тоже самое и с получением файла с фтп. А вот файл сравнения не хочет... Если выполнить просто в cmd, то файл сравнения создается нормально
5 Йохохо
 
24.12.14
14:35
(4) мб надо cd сделать, у тебя > текущий каталог
6 Господин ПЖ
 
24.12.14
14:35
в ФайлРезультат вообще есть что-то?
7 pessok
 
24.12.14
14:36
(6) нет, он при выводе должен создаваться, для того и " > "
8 pessok
 
24.12.14
14:36
но он не создается
9 Господин ПЖ
 
24.12.14
14:39
сиди сравнивай в чем разница в синтаксисе... может у тебя пробелы в путях
10 pessok
 
24.12.14
14:41
(9) на клиенте все отрабатывает.
если тупо вычислить строку "fc /a "+ПервыйФайл+" "+ВторойФайл+" > "+ФайлРезультат и вставить в cmd на сервере - тоже отрабатывает. а вот регламентным не хочет, и это вгоняет меня в тупик
11 zulu_mix
 
24.12.14
14:47
crc32 еще не предлагали?
12 Господин ПЖ
 
24.12.14
14:50
чота не все так просто в фоновом...

какие-то костылики везде типа ТекстовыйДокумент.Вывод = ИспользованиеВывода.Разрешить;
13 pessok
 
24.12.14
14:53
(11) не, и, думаю, не надо
(12) ну так по идее, вывод текстового документа делает не 1С, а fc
14 Господин ПЖ
 
24.12.14
14:55
(13) ну не знаю я что еще предложить...

натравливай procmon на каталог/файлы, сиди смотри кто туда приходит и с какими правами...
15 pessok
 
24.12.14
14:59
(14) это уже, пардон, онанизЬм. В общем задачку решил встроенным языком, банально:

Функция ФайлыРазличны(ПервыйФайл, ВторойФайл)
    
    Результат = Ложь;
    
    //ФайлыРазличны = Ложь;
    //
    //ФайлРезультат = КаталогВременныхФайлов()+"res.txt";
    //    
    //WshShell = Новый COMОбъект("Wscript.Shell");
    //WshShell.run("fc /a "+ПервыйФайл+" "+ВторойФайл+" > "+ФайлРезультат, 0, True);
    //
    //ТекстДок = Новый ТекстовыйДокумент;
    //
    //ТекстДок.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
    //
    //ТекстПроверки = ТекстДок.ПолучитьТекст();
    //
    //Если Найти(ТекстПроверки, "*****") > 0 Тогда
    //    ФайлыРазличны = Истина;
    //КонецЕсли;
    //
    //УдалитьФайлы(ФайлРезультат);
    //
    //Возврат ФайлыРазличны
    
    ТекстПервогоФайла = Новый ТекстовыйДокумент;
    ТекстПервогоФайла.Прочитать(ПервыйФайл);
    
    ТекстВторогоФайла = Новый ТекстовыйДокумент;
    ТекстВторогоФайла.Прочитать(ВторойФайл);
    
    Если ТекстПервогоФайла.КоличествоСтрок() <> ТекстВторогоФайла.КоличествоСтрок() Тогда
        Результат = Истина;
    Иначе
        
        ВсегоСтрок = ТекстПервогоФайла.КоличествоСтрок();
        
        Для А = 1 По ВсегоСтрок Цикл
            
            СтрокаПервогоФайла = ТекстПервогоФайла.ПолучитьСтроку(А);
            СтрокаВторогоФайла = ТекстВторогоФайла.ПолучитьСтроку(А);
            
            Если СтрокаПервогоФайла <> СтрокаВторогоФайла Тогда
                Результат = Истина;
                Прервать;
            КонецЕсли;
            
        КонецЦикла;
    
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

будем считать, что в регл. заданиям с Wscript.Shell происходит что-то грустное :(
16 pessok
 
24.12.14
15:03
даже встроенным языком есть некислый прирост скорости работы, из-за прерывания обработки при первом расхождении
17 zulu_mix
 
24.12.14
15:07
(13) чейта не надо? мд5 посчитать у файлов и если разные то грузить

Функция DecToHex(Знач Число)
    Если Число = 0 Тогда Возврат "00"; КонецЕсли;
    _Число = Число;
    База = 16;
    Пока _Число <> 0 Цикл
        Поз =_Число % База;
        Результат = Сред("0123456789abcdef", Поз + 1, 1) + Результат;
        _Число = Цел(_Число / База);
    КонецЦикла;
    Если Число < База Тогда Результат = "0" + Результат; КонецЕсли;
    Возврат Результат;
КонецФункции // DecToHex()

Функция  ПолучитьMD5ХэшФайла(ПутьКФайлу) Экспорт
        adTypeBinary = 1;
    
    objCrypt = Новый COMОбъект("System.Security.Cryptography.MD5CryptoServiceProvider");
    objStream = Новый COMОбъект("ADODB.Stream");
    objStream.Open();
    objStream.Type = adTypeBinary;
    objStream.LoadFromFile(ПутьКФайлу);
    HashArray = objCrypt.ComputeHash_2(objStream.Read());
    Хэш = "";
    Для каждого Число Из HashArray Цикл
        Хэш = Хэш + DecToHex(Число);
    КонецЦикла;
    Возврат Хэш;
КонецФункции
18 Господин ПЖ
 
24.12.14
15:09
>будем считать, что в регл. заданиям с Wscript.Shell происходит что-то грустное :(

отмазка на уровне "голова предмет темный"
19 pessok
 
24.12.14
15:13
(17) если я щас начну еще пихать в регл. задание ком-объекты, то фиг его знает, что там еще отвалится :) но спасибо за идею, интересно.

(18) ну дык а какие еще варианты? может быть это пламенный привет дяде Билли, но как это отлаживать - я себе слабо представляю
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший