|
v7: OLE - в чем прикол? | ☑ | ||
---|---|---|---|---|
0
Virtmon
06.02.12
✎
15:52
|
Есть 2 базы ТиС 7.7, у которых МД выходцы из одного файла и базы практически идентичны. Есть так же 2 бухгалтерские базы, у которых так же МД выходцы из одного МД файла. Делал загрузку выписок из ТиС в Бух. У одной базы загрузка прокатывает одним способом, у второй другим. Не могу понять в чем подвох:
1-ая база: прокатывают условия Если ТипЗначения(Док.Счет) <> 0 Тогда Если Док.Счет.Выбран() = 1 Тогда 2-ая база: такое не прокатывает, проходит только Если ПустоеЗначение(Док.Счет) = 0 Тогда Если СокрЛП(Док.Счет.Код) <> "" Тогда Причем во второй базе нужно 2 условия, бывает что счет не выбран, но значение почему-то не пустое |
|||
1
andrewks
06.02.12
✎
16:14
|
Выбран()=1 проверяет спозиционированность ссылки на существующем объекте БД. ТипЗначения(Док.Счет) <> 0 - лишь на пустоту ссылки
|
|||
2
smaharbA
06.02.12
✎
16:15
|
по оле типзначения несколько иначе проверяют
|
|||
3
Virtmon
07.02.12
✎
07:28
|
(2) Как например? В первой базе это условие нормально возвращает значения
|
|||
4
smaharbA
07.02.12
✎
07:31
|
сначала покажи где тут оле ?
|
|||
5
Virtmon
07.02.12
✎
07:33
|
Стр=СтрЗаменить(Документы.ПолучитьЗначение(й),Симв(34),"!");
Док=гБаза.EvalExpr("ОбъектИзСтроки("+Симв(34)+Стр+Симв(34)+")"); |
|||
6
smaharbA
07.02.12
✎
07:36
|
Сообщить(БазаОЛЕ.EvalExpr("ТипЗначения(ЗначениеИзСтрокиВнутр("""+БазаОЛЕ.ЗначениеВСтрокуВнутр(ОЛЕОбъект)+""")");
|
|||
7
smaharbA
07.02.12
✎
07:36
|
как то так
|
|||
8
smaharbA
07.02.12
✎
07:37
|
в конце две скобки в кавычках конечно, ну и так по мелочи может где описьки недописьки
|
|||
9
Virtmon
07.02.12
✎
08:08
|
Сообщить(гБаза.EvalExpr(ТипЗначения("ЗначениеИзСтрокиВнутр("+Симв(34)+гБаза.ЗначениеВСтрокуВнутр(Док.Счет)+Симв(34)+")"))); - Так заработало, но суть не в этом. Там где счет не выбран он все равно возвращает тип значения "2", а должен по сути вернуть неопределенный. Или я может чего не понимаю...
|
|||
10
Rie
07.02.12
✎
08:16
|
(9) А что написано в ОбъектИзСтроки?
|
|||
11
ЧеловекДуши
07.02.12
✎
08:19
|
Оле - это зло, само оле это уже прикол :)
|
|||
12
Virtmon
07.02.12
✎
08:20
|
Стр=СтрЗаменить(Документы.ПолучитьЗначение(й),Симв(34),"!");
"Документы" - список значений с документами |
|||
13
Virtmon
07.02.12
✎
08:24
|
Может хоть кто-то скажет какие условия вообще должны проходить, а кикие не правильные из приведенных в (0)?
|
|||
14
dk
07.02.12
✎
08:51
|
отладчик в зубы и вперед
|
|||
15
1Сергей
07.02.12
✎
09:04
|
(9) используй .Выбран()
|
|||
16
Virtmon
07.02.12
✎
09:04
|
"Сообщить" даже лучше показывает где какие значения появляются. Непонятно почему идет такая разница в загрузках... Может она зависит не только от MD?
|
|||
17
Virtmon
07.02.12
✎
10:34
|
Ни у кого идей нет?
|
|||
18
Ёпрст
07.02.12
✎
10:41
|
больше кода
|
|||
19
Virtmon
07.02.12
✎
10:42
|
Сообщить(гБаза.EvalExpr(ТипЗначения("ЗначениеИзСтрокиВнутр("+Симв(34)+гБаза.ЗначениеВСтрокуВнутр(Док.Счет)+Симв(34)+")")));
ДокРеал.КоррСчет = СчетПоКоду(СокрЛП(Док.Счет.Код)); Если ПустоеЗначение(ДокРеал.КоррСчет) = 0 Тогда //----------------------------------------------------------------------------------- Счет = СоздатьОбъект("Счет.Основной"); Счет.НайтиПоКоду(СокрЛП(ДокРеал.КоррСчет)); ДокРеал.НазначитьТип("Субконто1",Счет.ВидСубконто(1)); ДокРеал.НазначитьТип("Субконто2",Счет.ВидСубконто(2)); ДокРеал.НазначитьТип("Субконто3",Счет.ВидСубконто(3)); //---------- Если ТипЗначения(Док.Субконто1) <> 0 Тогда ТеккСтр = Лев(Счет.ВидСубконто(1).ТипСубконто(),(Найти(Счет.ВидСубконто(1).ТипСубконто(),".")-1)); Если СокрЛП(ТеккСтр) = "" Тогда ИначеЕсли СокрЛП(ТеккСтр) = "Перечисление" Тогда ИдентПеречисления = Счет.ВидСубконто(1).Идентификатор(); Найдено = 0; КолЗначенийТекущегоПеречисления = Метаданные.Перечисление(ИдентПеречисления).Значение(); Для НомерЗначенияТекПеречисления = 1 По КолЗначенийТекущегоПеречисления Цикл Если СокрЛП(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления).Представление) = СокрЛП(Док.Субконто1.Наименование) Тогда ВидПеречисления = Перечисление.ПолучитьАтрибут(Метаданные.Перечисление(ИдентПеречисления).Идентификатор); Зн = ВидПеречисления.ЗначениеПоИдентификатору(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления)); ДокРеал.Субконто1 = Зн; Найдено = 1; Прервать; Прервать; КонецЕсли; КонецЦикла; Если Найдено = 0 Тогда Сообщить("===Значение перечислений "+Док.Субконто1.Наименование+" из документа "+Док.НомерДок+" не найдено!==="); КонецЕсли; ИначеЕсли СокрЛП(ТеккСтр) = "Справочник" Тогда Если СокрЛП(Счет.ВидСубконто(1).Идентификатор()) = "Договоры" Тогда Сообщить("В субконто1 не может быть договора, проверьте загрузку!!!!!!!!!!!!!!!!!!!"); ИначеЕсли СокрЛП(Счет.ВидСубконто(1).Идентификатор()) = "СтавкиНДС" Тогда ДокРеал.Субконто1 = ВыбСтавкаНДС; ИначеЕсли СокрЛП(Счет.ВидСубконто(1).Идентификатор()) = "Контрагенты" Тогда ДокРеал.Субконто1 = Соответствие(гБаза.ЗначениеВСтрокуВнутр(Док.Контрагент),1); Иначе Если СокрЛП(Док.Субконто1.Наименование) <> "" Тогда ТемпСпр = СоздатьОбъект("Справочник."+СокрЛП(Счет.ВидСубконто(1).Идентификатор())); ТемпСпр.ВыбратьЭлементы(); Если ТемпСпр.НайтиПоНаименованию(СокрЛП(Док.Субконто1.Наименование)) = 1 Тогда ДокРеал.Субконто1 = ТемпСпр.ТекущийЭлемент(); Иначе ТемпСпр.Новый(); ТемпСпр.Наименование = Док.Субконто1.Наименование; ТемпСпр.Записать(); ДокРеал.Субконто1 = ТемпСпр.ТекущийЭлемент(); Сообщить("Создан элемент '"+Док.Субконто1.Наименование+"' в справочнике '"+"Справочник."+СокрЛП(Счет.ВидСубконто(1).Идентификатор())+"'"); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; //---------- Если ТипЗначения(Док.Субконто2) <> 0 Тогда ТеккСтр = Лев(Счет.ВидСубконто(2).ТипСубконто(),(Найти(Счет.ВидСубконто(2).ТипСубконто(),".")-1)); Если СокрЛП(ТеккСтр) = "" Тогда ИначеЕсли СокрЛП(ТеккСтр) = "Перечисление" Тогда ИдентПеречисления = Счет.ВидСубконто(2).Идентификатор(); Найдено = 0; КолЗначенийТекущегоПеречисления = Метаданные.Перечисление(ИдентПеречисления).Значение(); Для НомерЗначенияТекПеречисления = 1 По КолЗначенийТекущегоПеречисления Цикл Если СокрЛП(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления).Представление) = СокрЛП(Док.Субконто2.Наименование) Тогда ВидПеречисления = Перечисление.ПолучитьАтрибут(Метаданные.Перечисление(ИдентПеречисления).Идентификатор); Зн = ВидПеречисления.ЗначениеПоИдентификатору(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления)); ДокРеал.Субконто2 = Зн; Найдено = 1; Прервать; Прервать; КонецЕсли; КонецЦикла; Если Найдено = 0 Тогда Сообщить("===Значение перечислений = "+Док.Субконто2.Наименование+" из документа = "+Док.НомерДок+" не найдено!==="); КонецЕсли; ИначеЕсли СокрЛП(ТеккСтр) = "Справочник" Тогда Если СокрЛП(Счет.ВидСубконто(2).Идентификатор()) = "Договоры" Тогда спрД = СоздатьОбъект("Справочник.Договоры"); спрД.ИспользоватьВладельца(ДокРеал.Субконто1); спрД.ВыбратьЭлементы(); Найден = 0; Сообщить("Договор из документа = "+Док.Договор.Наименование); Если спрД.НайтиПоНаименованию(СокрЛП(Док.Договор.Наименование))=1 Тогда ДокРеал.Субконто2 = спрД.ТекущийЭлемент(); Иначе СпрВидДог = СоздатьОбъект("Справочник.ВидыДоговоров"); СпрВидДог.НайтиПоКоду("00001"); спрД.Новый(); спрД.Наименование = Док.Договор.Наименование; спрД.АвтоОбработкаНДС = 1; спрД.ВидДоговора = СпрВидДог.ТекущийЭлемент(); спрД.Записать(); ДокРеал.Субконто2 = спрД.ТекущийЭлемент(); КонецЕсли; ИначеЕсли СокрЛП(Счет.ВидСубконто(2).Идентификатор()) = "СтавкиНДС" Тогда ДокРеал.Субконто2 = ВыбСтавкаНДС; ИначеЕсли СокрЛП(Счет.ВидСубконто(2).Идентификатор()) = "Контрагенты" Тогда ДокРеал.Субконто2 = Соответствие(гБаза.ЗначениеВСтрокуВнутр(Док.Контрагент),1); Иначе Если СокрЛП(Док.Субконто2.Наименование) <> "" Тогда ТемпСпр = СоздатьОбъект("Справочник."+СокрЛП(Счет.ВидСубконто(2).Идентификатор())); ТемпСпр.ВыбратьЭлементы(); Если ТемпСпр.НайтиПоНаименованию(СокрЛП(Док.Субконто2.Наименование)) = 1 Тогда ДокРеал.Субконто2 = ТемпСпр.ТекущийЭлемент(); Иначе ТемпСпр.Новый(); ТемпСпр.Наименование = Док.Субконто2.Наименование; ТемпСпр.Записать(); ДокРеал.Субконто2 = ТемпСпр.ТекущийЭлемент(); Сообщить("Создан элемент '"+Док.Субконто2.Наименование+"' в справочнике '"+"Справочник."+СокрЛП(Счет.ВидСубконто(2).Идентификатор())+"'"); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; //---------- Если ТипЗначения(Док.Субконто3) <> 0 Тогда ТеккСтр = Лев(Счет.ВидСубконто(3).ТипСубконто(),(Найти(Счет.ВидСубконто(3).ТипСубконто(),".")-1)); Если СокрЛП(ТеккСтр) = "" Тогда ИначеЕсли СокрЛП(ТеккСтр) = "Перечисление" Тогда ИдентПеречисления = Счет.ВидСубконто(3).Идентификатор(); Найдено = 0; КолЗначенийТекущегоПеречисления = Метаданные.Перечисление(ИдентПеречисления).Значение(); Для НомерЗначенияТекПеречисления = 1 По КолЗначенийТекущегоПеречисления Цикл Если СокрЛП(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления).Представление) = СокрЛП(Док.Субконто3.Наименование) Тогда ВидПеречисления = Перечисление.ПолучитьАтрибут(Метаданные.Перечисление(ИдентПеречисления).Идентификатор); Зн = ВидПеречисления.ЗначениеПоИдентификатору(Метаданные.Перечисление(ИдентПеречисления).Значение(НомерЗначенияТекПеречисления)); ДокРеал.Субконто3 = Зн; Найдено = 1; Прервать; Прервать; КонецЕсли; КонецЦикла; Если Найдено = 0 Тогда Сообщить("===Значение перечислений "+Док.Субконто3.Наименование+" из документа "+Док.НомерДок+" не найдено!==="); КонецЕсли; ИначеЕсли СокрЛП(ТеккСтр) = "Справочник" Тогда Если СокрЛП(Счет.ВидСубконто(3).Идентификатор()) = "Договоры" Тогда спрД = СоздатьОбъект("Справочник.Договоры"); спрД.ИспользоватьВладельца(ДокРеал.Субконто2); спрД.ВыбратьЭлементы(); Найден = 0; Сообщить("Договор из документа = "+Док.Договор.Наименование); Если спрД.НайтиПоНаименованию(СокрЛП(Док.Договор.Наименование))=1 Тогда ДокРеал.Субконто3 = спрД.ТекущийЭлемент(); Иначе СпрВидДог = СоздатьОбъект("Справочник.ВидыДоговоров"); СпрВидДог.НайтиПоКоду("00001"); спрД.Новый(); спрД.Наименование = Док.Договор.Наименование; спрД.АвтоОбработкаНДС = 1; спрД.ВидДоговора = СпрВидДог.ТекущийЭлемент(); спрД.Записать(); ДокРеал.Субконто3 = спрД.ТекущийЭлемент(); КонецЕсли; ИначеЕсли СокрЛП(Счет.ВидСубконто(3).Идентификатор()) = "СтавкиНДС" Тогда ДокРеал.Субконто3 = ВыбСтавкаНДС; ИначеЕсли СокрЛП(Счет.ВидСубконто(3).Идентификатор()) = "Контрагенты" Тогда ДокРеал.Субконто3 = Соответствие(гБаза.ЗначениеВСтрокуВнутр(Док.Контрагент),1); Иначе Если СокрЛП(Док.Субконто3.Наименование) <> "" Тогда ТемпСпр = СоздатьОбъект("Справочник."+СокрЛП(Счет.ВидСубконто(3).Идентификатор())); ТемпСпр.ВыбратьЭлементы(); Если ТемпСпр.НайтиПоНаименованию(СокрЛП(Док.Субконто3.Наименование)) = 1 Тогда ДокРеал.Субконто3 = ТемпСпр.ТекущийЭлемент(); Иначе ТемпСпр.Новый(); ТемпСпр.Наименование = Док.Субконто3.Наименование; ТемпСпр.Записать(); ДокРеал.Субконто3 = ТемпСпр.ТекущийЭлемент(); Сообщить("Создан элемент '"+Док.Субконто3.Наименование+"' в справочнике '"+"Справочник."+СокрЛП(Счет.ВидСубконто(3).Идентификатор())+"'"); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Иначе ДокРеал.КоррСчет = СчетПоКоду("60.1"); ДокРеал.НазначитьТип("Субконто1","Справочник.Контрагенты"); ДокРеал.НазначитьТип("Субконто2","Справочник.Договоры"); ДокРеал.Субконто1 = Соответствие(гБаза.ЗначениеВСтрокуВнутр(Док.Контрагент),1); спрД = СоздатьОбъект("Справочник.Договоры"); спрД.ИспользоватьВладельца(ДокРеал.Субконто1); спрД.ВыбратьЭлементы(); Найден = 0; Сообщить("Договор из документа = "+Док.Договор.Наименование); Если спрД.НайтиПоНаименованию(СокрЛП(Док.Договор.Наименование))=1 Тогда ДокРеал.Субконто2 = спрД.ТекущийЭлемент(); Иначе СпрВидДог = СоздатьОбъект("Справочник.ВидыДоговоров"); СпрВидДог.НайтиПоКоду("00001"); спрД.Новый(); спрД.Наименование = Док.Договор.Наименование; спрД.АвтоОбработкаНДС = 1; спрД.ВидДоговора = СпрВидДог.ТекущийЭлемент(); спрД.Записать(); ДокРеал.Субконто2 = спрД.ТекущийЭлемент(); Сообщить("------Заполните договор в документе "+ДокРеал.НомерДок+" ------"); КонецЕсли; |
|||
20
Ёпрст
07.02.12
✎
11:09
|
(19)
>> ДокРеал.КоррСчет = СчетПоКоду(СокрЛП(Док.Счет.Код)); >>> Если ПустоеЗначение(ДокРеал.КоррСчет) = 0 Тогда перед этим, хоть Тип назначил реквизиту коррсчет ? |
|||
21
Virtmon
07.02.12
✎
12:29
|
Вот так было изначально:
Если ТипЗначения(Док.Счет) <> 0 Тогда ДокРеал.КоррСчет = СчетПоКоду(СокрЛП(Док.Счет.Код)); |
|||
22
Virtmon
07.02.12
✎
12:30
|
Зачем назначать тип значения? Разве "СчетПоКоду" не преобразует его?
|
|||
23
Ёпрст
07.02.12
✎
12:31
|
(21) еще раз.
Тип назначен реквизиту в базе ОЛЕ ? По-умолчанию, во всех типовых реквизиты типа Счет и КоррСчет имеют тип Неопределенный.. |
|||
24
Ёпрст
07.02.12
✎
12:31
|
(22) че ?
|
|||
25
Virtmon
07.02.12
✎
12:32
|
А в ТиС?
|
|||
26
Virtmon
07.02.12
✎
12:33
|
Док - документ из базы ТиС
|
|||
27
Ёпрст
07.02.12
✎
12:37
|
(25) в Тисе нет плана счетов - там тупо лементы справочников.
|
|||
28
Ёпрст
07.02.12
✎
12:38
|
в бухне, реквизиты счет имеют тип счет.определенный план счетов, в комплексной - неопределенный тип, в пубе - не помню
|
|||
29
Vladal
07.02.12
✎
12:38
|
в ПУБе регистры и план счетов.
|
|||
30
Vladal
07.02.12
✎
12:39
|
в ЗУПе журнал расчетов
|
|||
31
Virtmon
07.02.12
✎
12:40
|
Ну вот. В загрузке из одной базы он возвращает тип значения неопределенный, если счет не заполнен, и тип справочник (или строка - не помню) если он заполнен. А во второй не хочет так.
|
|||
32
Virtmon
07.02.12
✎
12:43
|
Может просто предложишь как узнать выбран там счет или нет. В документах Выписка в ТиС, если стоит "Выид полаты" - "Оплата поставщику", то счет не указывается. Вся проблема в этом. Я пытаюсь отловить этот момент и сажаю его на 60.1
|
|||
33
Virtmon
07.02.12
✎
12:44
|
"Выид полаты"* - "Вид оплаты". Палата - это у меня скоро будет)
|
|||
34
Vladal
07.02.12
✎
12:48
|
Процедура ОпределитьТипАтрибутаПоОЛЕ(ИсхАтрибут,ТипАтрибута,ВидАтрибута)
// Наименование: ОпределитьТипАтрибутаПоОЛЕ // Параметры: // ИсхАтрибут - атрибут в исходной БД // ТипАтрибута - возвращается определенный тип атрибута // ТипАтрибута - возвращается определенный вид атрибута (или пустая строка, для типов, не имеющих вида) // Назначение: Определяет тип и вид переменной, полученной по ОЛЕ. // Это нужно, т.к. ф-я ТипЗначенияСтр() возвращает нам "OLE" ТипАтрибута = ""; // Пока не знаем Попытка ВидАтрибута = ИсхАтрибут.Вид(); Исключение ВидАтрибута = ""; // Вид не определен, т.е. это не документ и не справочник и не перечисление КонецПопытки; Если ПустаяСтрока(ВидАтрибута) =1 Тогда Попытка Зн = ИсхАтрибут.Валютный; // М.б. это счет? ТипАтрибута = "Счет"; возврат; Исключение // Нет, не счет :( КонецПопытки; // Прочие типы не рассматриваем Иначе Попытка Спр = СоздатьОбъект("Справочник."+ВидАтрибута); // М.б. это справочник? ТипАтрибута = "Справочник"; возврат; Исключение // Нет, не справочник :( КонецПопытки; Попытка Док = СоздатьОбъект("Документ."+ВидАтрибута); // М.б. это Документ? ТипАтрибута = "Документ"; возврат; Исключение // Нет, не Документ :( КонецПопытки; Попытка // ну тогда это Перечисление Атрибут=ЗначениеИзСтроки("{""Перечисление"","""+ВидАтрибута+""","""+ИсхАтрибут.Идентификатор()+"""}"); ТипАтрибута = "Перечисление"; возврат; Исключение // Нет, не Перечисление :( КонецПопытки; КонецЕсли; КонецПроцедуры //ОпределитьТипАтрибутаПоОЛЕ(ИсхАтрибут) |
|||
35
Vladal
07.02.12
✎
12:53
|
Вот еще нарыл про типизацию по ОЛЕ:
http://help1c.com/faq7/view/189.html Перенос справочников по оле! Обработка значений неопределенного типа |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |