Имя: Пароль:
1C
1C 7.7
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
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший