Имя: Пароль:
1C
1С v8
1С синхронизация с FOXPRO
0 jaroslavbayev
 
14.02.14
15:50
На фирме осталась еще часть задачи писанной под Foxpro 2.6 и двот для того что бы не останавливать работу понадобилось синхронизировать справочники 1С со старой базой при чем основная это старая база. Для этой задачи были написаны процедуры такого рода:
НачатьТранзакцию();
    стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
    |SourceType=DBF;SourceDB=D:\Запросы\;
    |Exclusive=No ;NULL=NO; BACKGROUNDFETCH=NO; Collate=Machine;";
    Connect = Новый COMОбъект("ADODB.Connection");
    попытка
        Connect.Open(стрПодключения);
    исключение
        сообщить(ОписаниеОшибки());
        Отказ=Истина;
        Возврат;                                      
    КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
RS.Open("Select nomer,typ,name from sprnp1", Connect);

Пока RS.EOF()=0 цикл
    РезультатПоиска = Справочники.НаселенныеПункты.НайтиПоКоду(RS.Fields("nomer").Value);
Если РезультатПоиска.Пустая() Тогда
НовыйНаселенныйПункт = Справочники.НаселенныеПункты.СоздатьЭлемент();
НовыйНаселенныйПункт.Код = RS.Fields("nomer").Value;
НовыйНаселенныйПункт.НаименованиеНаселенногоПунка =СокрЛП(RS.Fields("name").Value);
НовыйНаселенныйПункт.Тип =Справочники.ТипыНаселенныхПунктов.НайтиПоНаименованию(СокрЛП(RS.Fields("typ").Value));
НовыйНаселенныйПункт.Записать();
КонецЕсли;
RS.MoveNext();
КонецЦикла;
    RS.Close();
    Connect.Close();
    ЗафиксироватьТранзакцию();    

И все вроде работает за исключением одного - в в справочнике по итогу вместо букв вижу либо строку типа _______ либо вообще нечто не читаемое... Может кто-то уже сталкивался и знает решение? Оговорюсь сразу работать приходится в Win7.
1 supremum
 
14.02.14
15:54
Попробуй порыть в сторону кодовой страницы.
"ADODB.Connection" проблема с кодировкой
2 МихаилМ
 
14.02.14
15:59
(0)
зачем транзакция ?
3 МихаилМ
 
14.02.14
16:01
+(2)
вопрос снят. не заметил записи.
4 jaroslavbayev
 
17.02.14
14:42
Кому интересно рассказываю результат своих изысканий: после ответов здесь и на других сайтах, а также после долгого гугления и проб вариантов с реестром пришел к единственному заработавшему решению на которое меня натолкнули знания из FoxPro. Ни одна игра с реестром или допуказания типа Codepage или Collate ничего не дают, а вот если в самом запросе использовать функцию CPCONVERT(), все выходит идеально. Вот кусок кода для примера:

НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=Yes;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
НП = Новый COMОбъект("ADODB.Recordset");
НП.Open("Sel ect nomer,CPCONVERT(866,1251,typ) as typ,CPCONVERT(866,1251,name) as name fr om sprnp", Connect);

Пока НП.EOF()=0 цикл
РезультатПоиска = Справочники.НаселенныеПункты.НайтиПоКоду(НП.Fields("nomer").Value);
Если РезультатПоиска.Пустая() Тогда
НовыйНаселенныйПункт = Справочники.НаселенныеПункты.СоздатьЭлемент();
НовыйНаселенныйПункт.Код = НП.Fields("nomer").Value;
НовыйНаселенныйПункт.НаименованиеНаселенногоПунка =СокрЛП(НП.Fields("name").Value);
НовыйНаселенныйПункт.Тип =Справочники.ТипыНаселенныхПунктов.НайтиПоНаименованию(СокрЛП(НП.Fields("typ").Value));
НовыйНаселенныйПункт.Записать();
КонецЕсли;
НП.MoveNext();
КонецЦикла;
НП.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
5 jaroslavbayev
 
17.02.14
14:42
Собственно тему можно закрывать.
6 jaroslavbayev
 
24.02.14
12:37
Ребята у меня еще один маленький вопрос если сможете помочь как организовать обратный перебор?

Поясню что мне нужно: Процедура ЗакрытыеЛицевыеСчета()
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
    |SourceType=DBF;SourceDB=N:\nast\spr\contact;
    |Exclusive=No ;NULL=NO; BackgroundFetch=Yes;";
    Connect = Новый COMОбъект("ADODB.Connection");
    попытка
        Connect.Open(стрПодключения);
    исключение
        сообщить(ОписаниеОшибки());
        Отказ=Истина;
        Возврат;                                      
    КонецПопытки;
ЛС = Новый COMОбъект("ADODB.Recordset");
ЛС.Open("Sel ect CPCONVERT(866,1251,koddom) as koddom,nomer,CPCONVERT(866,1251,name) as name,nkv,CPCONVERT(866,1251,lkv) as lkv, kodul, kodnp fr om sprls2", Connect);
НачатьТранзакцию();
ВыборкаЛС = Справочники.ЛицевыеСчета.Выбрать();
Пока ВыборкаЛС =Следующий() Цикл
     Результат =
Скрыть

Как мне сравнить Код счета, естественно, я понимаю, что нужно сравнивать Выборка.Код, с nomer? Т.к.мне нужно в результате свести все к такой части:
Если Результат = Неопределено ИЛИ Результат.Пустая() Тогда
ЛицевойСчет.ЛицевойСчетЗакрыт = Истина;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший