|
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? Т.к.мне нужно в результате свести все к такой части: Если Результат = Неопределено ИЛИ Результат.Пустая() Тогда ЛицевойСчет.ЛицевойСчетЗакрыт = Истина; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |