|
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) Примерно так:
|
|||
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.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |