проблема с ОЛЕ
26.05.2009
10:05
#1
v77. ОЛЕ-перенос документов. хочу сделать универсальный перенос, стоб не обрабатывать реквизиты по именам. Но при переносе плей для субконто возникает вопрос: как определить тип реквизита? В метаданных стоит "Неопределённый".
26.05.2009
11:50
#3
" ПланОЛЕ = v7.CreateObject("Документ");
.....................................
//сам перенос
ПланОЛЕ.НайтиПоНомеру(ТЗ.НомерДок, ТЗ.ДатаДок,ТЗ.Вид);
Док = СоздатьОбъект("Документ."+ТЗ.Вид);
Если Есть = 0 Тогда
Док.Новый();
............................................
КонецЕсли;
МетаДок = Метаданные.Документ(ТЗ.Вид);
//общие реквизиты документов
Для ном = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
МетаРекв = Метаданные.ОбщийРеквизитДокумента(ном);
Значение = ПолучитьРеквизит(МетаРекв.Тип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);
КонецЦикла;
//шапка документов
Для ном = 1 По МетаДок.РеквизитШапки() Цикл
МетаРекв = МетаДок.РеквизитШапки(ном);
РеквТип = МетаРекв.Тип;
Если РеквТип = "Неопределенный" Тогда
вот здесь заморочка. в основном это - всяческие субконто к счёту. но могут быть быть поля ввода-справочники
РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
КонецЕсли;
Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);
КонецЦикла;
Док.НомерДок = ТЗ.НомерДокНов;
Док.ДатаДок = ТЗ.ДатаДок;
Док.Записать();
"
.....................................
//сам перенос
ПланОЛЕ.НайтиПоНомеру(ТЗ.НомерДок, ТЗ.ДатаДок,ТЗ.Вид);
Док = СоздатьОбъект("Документ."+ТЗ.Вид);
Если Есть = 0 Тогда
Док.Новый();
............................................
КонецЕсли;
МетаДок = Метаданные.Документ(ТЗ.Вид);
//общие реквизиты документов
Для ном = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
МетаРекв = Метаданные.ОбщийРеквизитДокумента(ном);
Значение = ПолучитьРеквизит(МетаРекв.Тип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);
КонецЦикла;
//шапка документов
Для ном = 1 По МетаДок.РеквизитШапки() Цикл
МетаРекв = МетаДок.РеквизитШапки(ном);
РеквТип = МетаРекв.Тип;
Если РеквТип = "Неопределенный" Тогда
вот здесь заморочка. в основном это - всяческие субконто к счёту. но могут быть быть поля ввода-справочники
РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
КонецЕсли;
Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);
КонецЦикла;
Док.НомерДок = ТЗ.НомерДокНов;
Док.ДатаДок = ТЗ.ДатаДок;
Док.Записать();
"
26.05.2009
11:53
#4
в процедуре ПолучитьРеквизит() отрабатываются неагрегатные типы, справочник, перечисление, счёт. документы пока не трогаю, но как воздух нужно отработать субконто
26.05.2009
12:16
#5
Я бы, наверное, сделал через Попытка-исключение. То есть пробуем создать объект, далее ищем по коду или наименованию, если находим, то в переменную передаем тип значения...Если не находим...вот тут ступор, либо новый создавать, либо переходить к следующему виду объектов метаданных...Может что то в этом духе?
26.05.2009
13:12
#6
"> Я бы, наверное, сделал через Попытка-исключение. То есть пробуем создать объект, далее ищем по коду или наименованию, если находим, то в переменную передаем тип значения...Если не находим...вот тут ступор, либо новый создавать, либо переходить к следующему виду объектов метаданных...Может что то в этом духе?
КАКОЙ объект создаём? всё создано до нас! моя задача - определить тип конкретного ОЛЕ объекта, чтобы потом назначить этот тип соотв. реквизиту документа уже местной базы. Или же как-то вызвать процедуру ПриИзмененииСчета, благо она практически везде одинаково называется (хотя это неверное решение). пыталась использовать конструкцию:
Если РеквТип = "Неопределенный" Тогда
Наим = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Наименование;
Идент = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Идентификатор();
ВидСубк = ВидыСубконто.ЗначениеПоИдентификатору(Идент);
РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
КонецЕсли;
но Наим - Наименование конкретнго элемента конкретного справочника, Идент = """" стабильно.
ЗЫ. прошу прощения за эмоции
"
КАКОЙ объект создаём? всё создано до нас! моя задача - определить тип конкретного ОЛЕ объекта, чтобы потом назначить этот тип соотв. реквизиту документа уже местной базы. Или же как-то вызвать процедуру ПриИзмененииСчета, благо она практически везде одинаково называется (хотя это неверное решение). пыталась использовать конструкцию:
Если РеквТип = "Неопределенный" Тогда
Наим = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Наименование;
Идент = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Идентификатор();
ВидСубк = ВидыСубконто.ЗначениеПоИдентификатору(Идент);
РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));
КонецЕсли;
но Наим - Наименование конкретнго элемента конкретного справочника, Идент = """" стабильно.
ЗЫ. прошу прощения за эмоции
"
26.05.2009
17:51
#7
Один косяк нашла: в ОЛЕ базе все встроенные функции пишутся почему-то в англоязычном виде, т.е. надо писать не v7.ТипЗначенияСтр(), а v7.ValueTypeStr(). Сейчас проверяю эту мысль (хотя бы не ругается на отсутствие такого поля у v7)
27.05.2009
13:03
#8
"Вдруг кому-то пригодится...
выкрутилась так:
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
Файлик = КаталогИБ()+"ExtForms\Админ\temp.txt";
v7.ValueToFile(Файлик,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор),0);
Темп.Открыть(Файлик);
Строчка1 = Темп.ПолучитьСтроку(1);
Строчка1 = СтрЗаменить(Строчка1,"{","""");
Строчка1 = СтрЗаменить(Строчка1,"}","""");
Список = СоздатьОбъект("СписокЗначений");
Список.ИзСтрокиСРазделителями(Строчка1);
РеквТип = Список.ПолучитьЗначение(1);
РеквВид = Список.ПолучитьЗначение(2);
Док.НазначитьТип(МетаРеквизит.Идентификатор,РеквТип+"."+РеквВид);
КонецЕсли;
Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор));
Док.УстановитьАтрибут(МетаРеквизит.Идентификатор, Значение);
если кто придумает красивее - напишите, буду рада
"
выкрутилась так:
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
Файлик = КаталогИБ()+"ExtForms\Админ\temp.txt";
v7.ValueToFile(Файлик,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор),0);
Темп.Открыть(Файлик);
Строчка1 = Темп.ПолучитьСтроку(1);
Строчка1 = СтрЗаменить(Строчка1,"{","""");
Строчка1 = СтрЗаменить(Строчка1,"}","""");
Список = СоздатьОбъект("СписокЗначений");
Список.ИзСтрокиСРазделителями(Строчка1);
РеквТип = Список.ПолучитьЗначение(1);
РеквВид = Список.ПолучитьЗначение(2);
Док.НазначитьТип(МетаРеквизит.Идентификатор,РеквТип+"."+РеквВид);
КонецЕсли;
Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор));
Док.УстановитьАтрибут(МетаРеквизит.Идентификатор, Значение);
если кто придумает красивее - напишите, буду рада
"
27.05.2009
15:47
#9
"Через любую глобальную переменную. Например, глРасшифровка - есть в любых типовых конфигурациях на сей день.
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);
Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));
...
"
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);
Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));
...
"
27.05.2009
15:47
#10
"Через любую глобальную переменную. Например, глРасшифровка - есть в любых типовых конфигурациях на сей день.
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);
Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));
...
"
Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда
V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);
Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));
...
"
Операция (бухгалтерский и налоговый учет) в печатной форме не отражается ну, БП 1,6,15Не редактируется шаблон счета
Читают тему
(гостей: 1)