Имя: Пароль:
1C
1C 7.7
v7: И снова ОЛЕ
,
0 Snik_666
 
11.11.11
13:08
Добрый день!
Отбираю документы по оле, но мне надо пропустить некоторые в которых определенное значение перечисления. Как это сделать по оле ?

ДокОле = БазаОле.CreateObject("Документ."+знВидаОле);
       ДокОле.ВыбратьДокументы(НачДата, КонДата);
       Пока ДокОле.ПолучитьДокумент() = 1 Цикл
           
           ВО = БазаОле.EvalExpr("Перечисление.ЗначениеПоИдентификатору(""ВводОстатков"")");
           //СП = БазаОле.EvalExpr("Перечисление.ЗначениеПоИдентификатору(""Списание"")");
           //Если ДокОле.Вид = ВО Тогда
           //    Сообщить("Это ВО");
           //КонецЕсли;
           //Если ДокОле.Вид = СП Тогда
           //    Сообщить("Это СП");
           //КонецЕсли;
           тбДокОле.НоваяСтрока();
           тбДокОле.ВидДок   = ДокОле.Вид();
           тбДокОле.НомерДок = ДокОле.НомерДок;
           тбДокОле.ДатаДок  = ДокОле.ДатаДок;
           тбДокОле.UIDp     = ДокОле.UIDp;
           тбДокОле.IDD      = ДокОле.IDD;
           тбДокОле.Проведен = ?(ДокОле.Проведен()=1,1,0);
           тбДокОле.Помечен  = ?(ДокОле.ПометкаУдаления()=1,1,0);
       КонецЦикла;


ВО = БазаОле.EvalExpr("Перечисление.ЗначениеПоИдентификатору(""ВводОстатков"")");
{D:\СОПОСТАВИТЬДОКУМЕНТЫБАЗ.ERT(154)}: 1С:Предприятие: Поле агрегатного объекта не обнаружено (ЗначениеПоИдентификатору): 0
1 ЧеловекДуши
 
11.11.11
13:13
Вот так

Если ДокОле.Вид() = "Мой вид" Тогда
2 ado
 
11.11.11
13:13
(0) А значение КАКОГО перечисления ты хочешь по идентификатору получить?
3 ЧеловекДуши
 
11.11.11
13:14
(2)Он хочет их из 8-ки полу в 7-ку.
4 ЧеловекДуши
 
11.11.11
13:15
Т.е. он из 7.7 подключился к 8.х...
Но это только Телепатия.
5 ado
 
11.11.11
13:17
(1) Это не тот вид.

(0) А вообще, я бы лучше сделал так:

Если ДокОле.Вид.Идентификатор() = "ВводОстатков" Тогда
.............
6 ado
 
11.11.11
13:18
(3)(4) Фигню пишешь
7 viktor_vv
 
11.11.11
13:22
ПеречислениеКО = БазаОле.EvalExpr("Перечисление.ТвойВидПеречисления")
ВО = ПеречислениеКО.ЗначениеПоИдентификатору("ВодОстатков");;
СП = ПеречислениеКО.ЗначениеПоИдентификатору("Списание");
8 antoneus
 
11.11.11
13:27
емнип, можно так обращаться:

ПеречислениеКО = БазаОле.Перечисление.ТвойВидПеречисления

но могу и ошибаться
9 BlackSeaCat
 
11.11.11
13:36
(5) +1

Я по OLE работаю именно так - стараюсь получать только простые типы данных: число, строка, дата. И то с датами надо про баг не забывать. А уж агрегатные - нах-нах.
10 viktor_vv
 
11.11.11
13:39
(8) И точно работает :). Что-то типа такого.

Сообщить(""+База77.Перечисление.ВидыОплаты.Оплата.Идентификатор()) ;

Ну и соотвествнно и такое
ВО = База77.Перечисление.ВидыОплаты.Оплата ;

В ВО будет OLE объект.
11 viktor_vv
 
11.11.11
13:40
(10)+ Значения перечисления.
12 Snik_666
 
11.11.11
13:53
оле перечисления получить удалось, но глядя в отладчике почему то ДокОле.Вид = "" хотя точно у реквизита документа Вид тип значения = Перечисление.ВводСписание, и у данного документа заполнено.    

БазаОле.Перечисление.ВводСписание.ВводОстатков.Идентификатор() = "ВводОстатков"
ВО = OLE
ДокОле.Вид = ""
ТипЗначения(ДокОле.Вид)  = 2
ТипЗначения(ВО)  = 100
13 viktor_vv
 
11.11.11
14:04
Ну че-то отладчик с тобой не согласен насчет "хотя точно у реквизита документа Вид тип значения = Перечисление.ВводСписание", ему кажется, а может это так и есть, что там строка.
14 BlackSeaCat
 
11.11.11
14:08
(12) Ну и какой будет ТипЗначения() в ОТКРЫТОЙ базе у перечисления из ДРУГОЙ базы?

Особенно, если в текущей базе вообще нет такого вида перечисления?

На твоем примере - какой тип назначен колонке тбДокОле.ВидДок?

Читай (9) и оперируй с ПРОСТЫМИ типами. Например:

Если ДокОле.Вид.Идентификатор() = "ВводОстатков" Тогда
    тбДокОле.ВидДок   = Перечисление. КакоеОноТамУТебя.ВводОстатков;
ИначеЕсли ДокОле.Вид.Идентификатор() = "Списание" Тогда
    тбДокОле.ВидДок   = Перечисление. КакоеОноТамУТебя.Списание;
...
и так далее
15 Snik_666
 
11.11.11
14:16
(14)

ТипЗначения(ДокОле.Вид())  = 2
ТипЗначения(ДокОле.ДатаДок)  = 3

ДокОле.Вид.Идентификатор()   ругается....
16 BlackSeaCat
 
11.11.11
14:24
(15) Значит, открыл документ, у которого Вид - не перечисление.
17 BlackSeaCat
 
11.11.11
14:34
+(16) Или, как вариант, реквизит НЕ ЗАПОЛНЕН. Перед ДокОле.Вид.Идентификатор() проверяй на ПустоеЗначение(ДокОле.Вид)
18 miki
 
11.11.11
14:37
(16)А есть доки с видом "перечисление"?
19 Snik_666
 
11.11.11
14:40
(16)
Пишу на базе оле
Док = СоздатьОбъект("Документ.ВводСписаниеТоваров");
   Док.ВыбратьДокументы(НачДата,КонДата);
   Пока Док.ПолучитьДокумент() = 1 Цикл
       Сообщить(""+Док+"  Док.Вид="+Док.Вид.Идентификатор());    
   КонецЦикла;

РЕЗУЛЬТАТ:
ВводСписаниеТоваров Нл-0000087  Док.Вид=ВводОстатков
ВводСписаниеТоваров ВСТp0000003  Док.Вид=Списание


пишу к базе по оле
   Сообщить("знВидаОле="+знВидаОле);
       ДокОле = БазаОле.CreateObject("Документ."+знВидаОле);
       ДокОле.ВыбратьДокументы(НачДата, КонДата);
       Пока ДокОле.ПолучитьДокумент() = 1 Цикл
           Сообщить("ном док= "+ДокОле.НомерДок);
КонецЦикла;

РЕЗУЛЬТАТ:
знВидаОле=ВводСписаниеТоваров
ном док= Нл-0000087
ном док= ВСТp0000003
20 BlackSeaCat
 
11.11.11
14:40
(18) У ТС "Вид" - это реквизит документа.
21 viktor_vv
 
11.11.11
14:40
(15) Про это поподробнее ТипЗначения(ДокОле.Вид()). Скобочки зачем ? Это тогда метод.
22 viktor_vv
 
11.11.11
14:41
ДокОле.Вид() или ДокОле.Вид ?
23 Snik_666
 
11.11.11
14:43
Какой то мудень когдато сделал реквизит Вид тип Перечисление.ВводСписание
24 Snik_666
 
11.11.11
14:44
(22)
ТипЗначения(ДокОле.Вид)  = 2
и
ТипЗначения(ДокОле.Вид())  = 2 //тут логично
25 miki
 
11.11.11
14:45
без скобок д.б. 10.
26 viktor_vv
 
11.11.11
14:47
(19) А так что выйдет ?

Сообщить("ном док= "+ДокОле.НомерДок+ " , ВидРеквизит = " +ДокОле.Вид) ;
27 Snik_666
 
11.11.11
14:48
(26) выходит
знВидаОле=ВводСписаниеТоваров
ном док= Нл-0000087  , ВидРеквизит =
ном док= ВСТp0000003 , ВидРеквизит =
28 viktor_vv
 
11.11.11
14:49
А на

Сообщить("ном док= "+ДокОле.НомерДок+ " , ВидРеквизит = " +ДокОле.Вид.Идентияикатор()) ;

Ругается ?
29 viktor_vv
 
11.11.11
14:49
* Идентификатор()
30 Snik_666
 
11.11.11
14:49
(28) Да, Значение не представляет агрегатный объект (Идентификатор)
31 ado
 
11.11.11
14:49
Прикольно. Похоже, при вызове по ОЛЕ происходит коллизия между свойством и методом, если они обзавны одинаково.
32 Snik_666
 
11.11.11
14:50
(31) вот-вот я тоже заподозрил
33 viktor_vv
 
11.11.11
14:51
(31) Вот у меня тоже в голове такое крутится :). ТС попробуй на тестовой базе поменять идентификатор существующего реквизита Вид на другой и проверь.
34 ado
 
11.11.11
14:51
Хотя, с другой стороны, тогда ДокОле.Вид должно не пустую строку, а название вида документа возвращать.
35 viktor_vv
 
11.11.11
14:52
(34) Может его частично глючит :), на типизации :).
36 ado
 
11.11.11
14:52
А если не через выборку попробовать работать, а через запрос?
37 Snik_666
 
11.11.11
14:53
(31) 100%  переименовал и уже код Сообщить("ном док= "+ДокОле.НомерДок+ " , ВидРеквизит = " +ДокОле.ВидОстатков) ;

Результат:

знВидаОле=ВводСписаниеТоваров
ном док= Нл-0000087  , ВидРеквизит = OLE
ном док= ВСТp0000003 , ВидРеквизит = OLE
38 ado
 
11.11.11
14:56
(37) От жеж ...
39 viktor_vv
 
11.11.11
14:59
Действительно прикольно :). Интересно его на всех именах методов документа так штырит :) или только на вид().
40 Cthulhu
 
11.11.11
15:04
(37),(38): всё непримитивное, что "там" имеет тивы-виды-прочая, тут имеют тип "OLE", чонеясно?
Сообщить("ном док= "+ДокОле.НомерДок+ " , ВидРеквизит = " +ДокОле.ВидОстатков.Identifier());

ЗЫ: и - да. 1) за названия реквизитов и объектов, совпадающие с ключевыми словами встроенного языка - рубить руки, это недопустимо (ну или раскладывает труднораспознаваемые грабли при работе через ОЛЕ); 2) ВСЕ методы и прочие лексемы ВЯ в оле-контексте (для оле-объектов) - указывать строго рекомендуется в англоязычной транскрипции - очень хорошая и полезная для дела привычка!
41 ado
 
11.11.11
15:04
+(36) Примерно так:

Запрос = БазаОле.CreateObject("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с '"+ Строка(НачДата) +"' по '" + Строка(КонДата) + "';
|ОбрабатыватьДокументы все;
|ВидОстатков = Документ."+знВидаОле+".Вид;
|ТекущийДокумент = Документ."+знВидаОле+".ТекущийДокумент;
|Группировка ТекущийДокумент;
|"//}}ЗАПРОС
;

Пока Запрос.Группировка(1) = 1 Цикл
   Сообщить(Запрос.ВидОстатков.Идентификатор());
КонецЦикла;
42 ado
 
11.11.11
15:05
(40) >> чонеясно?

А всю ветку прочитать?
43 Irbis
 
11.11.11
15:06
Если OLE_ДДС.ВидДвижения.Идентификатор()=OLE.Enum.ВидыДвиженийДенежныхСредств.ПриобретениеТоваровПродукцииРаботИУслуг.Идентификатор() Тогда

я так сравниваю
44 ado
 
11.11.11
15:07
(43) Тоже начни с чтения.
45 Irbis
 
11.11.11
15:08
(44) у меня работает, сравнивает и выбирает то что надо.
46 ado
 
11.11.11
15:08
Автор, попробуй через запрос со старым названием реквизита. Очень интересно, что получится :-)
47 ado
 
11.11.11
15:09
(45) У тебя тоже имена реквизитов совпадают с именами методов?
48 Cthulhu
 
11.11.11
15:12
(42): ты внятнее формулируй что именно имеешь ввиду - причем в рамках ответа по сути (40).
49 Snik_666
 
11.11.11
15:15
(41) Запрос ничего не выбирает
50 ado
 
11.11.11
15:16
(48) Я имею в виду, что вот это: "всё непримитивное, что "там" имеет тивы-виды-прочая, тут имеют тип "OLE"" ни у кого неясностей или вопросов не вызывало на протяжении всей ветки. Вопрос вызвало то, что нечто непримитивное "там" вдруг оказалось строкой "тут".
51 Irbis
 
11.11.11
15:16
(47) Вряд ли, а зачем так делать?
52 ado
 
11.11.11
15:19
(49) Хмммм, странно. У меня в (41) пропущено

Запрос.Выполнить(ТекстЗапроса);

Ты не пропустил, надеюсь?
53 ado
 
11.11.11
15:20
(51) А затем, что у автора так уже сделано, и это суровая реальность, данная нам в ощущениях.
54 viktor_vv
 
11.11.11
15:26
(53)+1. Насчет ключевых слов полностью согласен во всеми. Но если такая же бодяга и для других методов, то не всегда при заведении нового реквизита можно помнить все методы, в данном случае документа. На мой взгляд это все-таки косяк платформы.
55 Snik_666
 
11.11.11
15:26
(52) запрос срабатывает

Результат:
ВводОстатков
Списание
56 ado
 
11.11.11
15:31
(55) Ну вот и делай через запрос. Если не хочешь ковырять всю конфу выискивая, где этот реквизит упоминается.
57 ado
 
11.11.11
15:32
(54) Скорее это косяк OLE.