v77. ОЛЕ-перенос документов. хочу сделать универсальный перенос, стоб не обрабатывать реквизиты по именам. Но при переносе плей для субконто возникает вопрос: как определить тип реквизита? В метаданных стоит "Неопределённый".
v77. ОЛЕ-перенос документов. хочу сделать универсальный перенос, стоб не обрабатывать реквизиты по именам. Но при переносе плей для субконто возникает вопрос: как определить тип реквизита? В метаданных стоит "Неопределённый".
Что бы подсказать, напишите фрагмент модуля
" ПланОЛЕ = v7.CreateObject("Документ"); <br> <br>.....................................<br> //сам перенос<br> ПланОЛЕ.НайтиПоНомеру(ТЗ.НомерДок, ТЗ.ДатаДок,ТЗ.Вид);<br> Док = СоздатьОбъект("Документ."+ТЗ.Вид);<br> Если Есть = 0 Тогда<br> Док.Новый();<br>............................................<br> КонецЕсли; <br> <br> МетаДок = Метаданные.Документ(ТЗ.Вид);<br> <br> //общие реквизиты документов<br> Для ном = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл<br> МетаРекв = Метаданные.ОбщийРеквизитДокумента(ном);<br> Значение = ПолучитьРеквизит(МетаРекв.Тип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));<br> Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);<br> КонецЦикла;<br> <br> //шапка документов<br> Для ном = 1 По МетаДок.РеквизитШапки() Цикл<br> МетаРекв = МетаДок.РеквизитШапки(ном); <br> РеквТип = МетаРекв.Тип;<br> Если РеквТип = "Неопределенный" Тогда<br> вот здесь заморочка. в основном это - всяческие субконто к счёту. но могут быть быть поля ввода-справочники<br> РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));<br> КонецЕсли;<br> Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));<br> Док.УстановитьАтрибут(МетаРекв.Идентификатор, Значение);<br> КонецЦикла; <br> Док.НомерДок = ТЗ.НомерДокНов; <br> Док.ДатаДок = ТЗ.ДатаДок; <br> Док.Записать();<br>"
в процедуре ПолучитьРеквизит() отрабатываются неагрегатные типы, справочник, перечисление, счёт. документы пока не трогаю, но как воздух нужно отработать субконто
Я бы, наверное, сделал через Попытка-исключение. То есть пробуем создать объект, далее ищем по коду или наименованию, если находим, то в переменную передаем тип значения...Если не находим...вот тут ступор, либо новый создавать, либо переходить к следующему виду объектов метаданных...Может что то в этом духе?
"> Я бы, наверное, сделал через Попытка-исключение. То есть пробуем создать объект, далее ищем по коду или наименованию, если находим, то в переменную передаем тип значения...Если не находим...вот тут ступор, либо новый создавать, либо переходить к следующему виду объектов метаданных...Может что то в этом духе?<br><br>КАКОЙ объект создаём? всё создано до нас! моя задача - определить тип конкретного ОЛЕ объекта, чтобы потом назначить этот тип соотв. реквизиту документа уже местной базы. Или же как-то вызвать процедуру ПриИзмененииСчета, благо она практически везде одинаково называется (хотя это неверное решение). пыталась использовать конструкцию:<br><br> Если РеквТип = "Неопределенный" Тогда<br> Наим = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Наименование;<br> Идент = ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор).Идентификатор();<br> ВидСубк = ВидыСубконто.ЗначениеПоИдентификатору(Идент);<br> РеквТип = v7.ТипЗначенияСтр(ПланОЛЕ.ПолучитьАтрибут(МетаРекв.Идентификатор));<br> КонецЕсли;<br>но Наим - Наименование конкретнго элемента конкретного справочника, Идент = """" стабильно.<br><br>ЗЫ. прошу прощения за эмоции<br>"
Один косяк нашла: в ОЛЕ базе все встроенные функции пишутся почему-то в англоязычном виде, т.е. надо писать не v7.ТипЗначенияСтр(), а v7.ValueTypeStr(). Сейчас проверяю эту мысль (хотя бы не ругается на отсутствие такого поля у v7)
"Вдруг кому-то пригодится...<br>выкрутилась так:<br><br>Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда<br> Файлик = КаталогИБ()+"ExtForms\Админ\temp.txt";<br> v7.ValueToFile(Файлик,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор),0); <br> Темп.Открыть(Файлик);<br> Строчка1 = Темп.ПолучитьСтроку(1);<br> Строчка1 = СтрЗаменить(Строчка1,"{","""");<br> Строчка1 = СтрЗаменить(Строчка1,"}","""");<br> Список = СоздатьОбъект("СписокЗначений");<br> Список.ИзСтрокиСРазделителями(Строчка1);<br> РеквТип = Список.ПолучитьЗначение(1); <br> РеквВид = Список.ПолучитьЗначение(2);<br> Док.НазначитьТип(МетаРеквизит.Идентификатор,РеквТип+"."+РеквВид);<br>КонецЕсли;<br>Значение = ПолучитьРеквизит(РеквТип,ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор));<br>Док.УстановитьАтрибут(МетаРеквизит.Идентификатор, Значение);<br><br>если кто придумает красивее - напишите, буду рада<br>"
"Через любую глобальную переменную. Например, глРасшифровка - есть в любых типовых конфигурациях на сей день.<br><br>Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда<br> V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);<br> Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));<br>...<br>"
"Через любую глобальную переменную. Например, глРасшифровка - есть в любых типовых конфигурациях на сей день.<br><br>Если (РеквТип = "Неопределенный") и (v7.EmptyValue(ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор))=0) Тогда<br> V77.глРасшифровка=ПланОЛЕ.ПолучитьАтрибут(МетаРеквизит.Идентификатор);<br> Сообщить(V77.EvalExpr("ТипЗначенияСтр(глРасшифровка)"));<br>...<br>"
26 апреля 2024 года — Форум пользователей «1С:Документооборота» |
1C:Лекторий: 25 апреля 2024 года — Бесплатная онлайн-лекция об учете НМА в 2024 году, практические рекомендации в 1С 1C:Лекторий: 7 мая 2024 года — Бесплатная онлайн-лекция о новом в 1С:ЗУП (версии 3.1.27-3.1.29): поддержка изменений по налогам и взносам, СЭДО, регистрация в органе статистики и другие изменения |