![]() |
![]() |
![]() |
|
Как проверить тип на составной? | ☑ | ||
---|---|---|---|---|
0
WerLym
12.06.25
✎
20:25
|
есть блок кода такой:
Для Каждого Реквизит Из ДокументСсылка.Метаданные().Реквизиты Цикл ИмяРеквизита = Реквизит.Имя; ЗначениеРеквизита = ДокументСсылка[ИмяРеквизита]; ТипЗначения = ТипЗнч(ЗначениеРеквизита); ТипРеквизита = ""; Если ТипЗначения = Тип("СоставнойТип") Тогда Для Каждого ПодТип Из ТипЗначения.Типы() Цикл МетаданныеТипа = Метаданные.НайтиПоТипу(ПодТип); Если МетаданныеТипа <> Неопределено Тогда ТипРеквизита = МетаданныеТипа.ПолноеИмя(); Прервать; Иначе ТипРеквизита = ПодТип; КонецЕсли; КонецЦикла; Иначе МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначения); Если МетаданныеТипа <> Неопределено Тогда ТипРеквизита = МетаданныеТипа.ПолноеИмя(); Иначе ТипРеквизита = ТипЗначения; КонецЕсли; КонецЕсли; ошибка в этой строке: Если ТипЗначения = Тип("СоставнойТип") Тогда Ошибка выгрузки: {ВнешняяОбработка.ПерегрузкаДокумента.Форма.ФормаОбработки.Форма(72)}: Тип не определен (СоставнойТип) |
|||
1
Garykom
гуру
12.06.25
✎
20:54
|
лишняя строка и условие если/иначе
достаточно перебирать .Типы() и если не составной то 1 раз в цикл войдет |
|||
2
craxx
12.06.25
✎
21:09
|
(0) ТипЗначения.Типы().Количество()>1
|
|||
3
WerLym
12.06.25
✎
21:09
|
(1) тогда это еще надо?
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначения); Если МетаданныеТипа <> Неопределено Тогда ТипРеквизита = МетаданныеТипа.ПолноеИмя(); Иначе ТипРеквизита = ТипЗначения; КонецЕсли; |
|||
4
Garykom
гуру
12.06.25
✎
21:33
|
(3) не надо, если условие (2) не делать
имхо ты какую-то хрень делаешь перебор метаданных с составными нужен только для автоформирования XML схемы или нечто вроде |
|||
5
WerLym
12.06.25
✎
21:39
|
(4)
Реализовать возможность выгрузки всей необходимой информации о документе в текстовый файл для последующего его воспроизведения Ограничение – нельзя использовать УИД, выгрузку в формате XML или JSON и т.п. 4.1. Определить, что делает уникальным каждый тип объектов метаданных (документы, элементы справочников и т.д.). 4.2. Для каждого типа объектов метаданных разработать формат, позволяющий только на основе выгруженных в текстовый файл данных, воспроизвести его. 4.3. Используя метаданные документа, выгрузить всю необходимую информацию о реквизитах и табличных частях документа в текстовый файл по указанному в поле «Файл» пути. |
|||
6
Garykom
гуру
12.06.25
✎
22:04
|
(5) Ха, так и думал
Тебе не надо к Метаданные обращаться для типов, пошел по кривому пути Достаточно из Метаданных только список реквизитов/ТЧ получать А Тип брать из ТипЗнч(ДокументСсылка.ИмяРеквизита) // ОбъектСсылка - ДокументСсылка или СправочникСсылка Для Каждого ТекРеквизит Из ОбъектСсылка.Метаданные().Реквизиты Цикл ИмяРеквизита = ТекРеквизит.Имя; ЗначениеРеквизита = ОбъектСсылка[ИмяРеквизита]; ТипРеквизита = ТипЗнч(ЗначениеРеквизита); ТекстСообщения = СтрШаблон("Имя реквизита = %1, Тип = %2, Значение = %3", ИмяРеквизита, ТипРеквизита, ЗначениеРеквизита); Сообщить(ТекстСообщения); КонецЦикла; |
|||
7
Garykom
гуру
12.06.25
✎
22:12
|
(6)+ Кстати есть еще проще вариант, без всех этих переборов по реквизитам и ТЧ
Банальнейшая готовая сериализация объекта целиком в XML или JSON https://wonderland.v8.1c.ru/blog/serializatsiya-prikladnykh-tipov-1s-predpriyatiya-v-json/?sphrase_id=1363428 |
|||
8
H A D G E H O G s
12.06.25
✎
22:13
|
(5) Накажи их, выгрузи в FastInfoSet, а то че они расслабляются.
|
|||
9
Garykom
гуру
12.06.25
✎
22:16
|
(8) "Ограничение – нельзя использовать УИД, выгрузку в формате XML или JSON и т.п."
FastInfoSet - фактически тот же XML, не прокатит как и (7) |
|||
10
Garykom
гуру
12.06.25
✎
22:18
|
Имхо я бы прикололся с https://infostart.ru/1c/articles/1116103/
|
|||
11
WerLym
12.06.25
✎
22:33
|
(6) Это не дает полный путь к объекту, ведь я не знаю изначально что это справочник, перечисления и тд
#РеквизитАвтор=Абдулов Юрий Владимирович=Пользователь=Справочник.Пользователи пример строки ФайлТХТ.ДобавитьСтроку("#Реквизит" + ИмяРеквизита +"="+ ЗначениеРеквизита +"="+ ТипЗначения +"="+ ТипРеквизита) Где ИмяРеквизита = Реквизит.Имя; ЗначениеРеквизита = ДокументСсылка[ИмяРеквизита]; ТипЗначения = ТипЗнч(ЗначениеРеквизита); ТипРеквизита = Метаданные.НайтиПоТипу(ТипЗначения); |
|||
12
WerLym
12.06.25
✎
22:35
|
зато теперь возникла другая проблема, как из строки сделать типреквизита (Справочник,Перечисления, Строка, Дата и тд) универсально, чтобы не прописывать каждый случай отдельно
|
|||
13
Garykom
гуру
12.06.25
✎
22:36
|
Советую тебе бросать это гиблое дело
Сначала подучи получше программирование в целом и особенно на платформе 1С С текущим уровнем знаний не взлетит, не справишься с тестовым заданием никак |
|||
14
WerLym
12.06.25
✎
22:36
|
а то прописывать все вот так:
Если Лев(ТипРеквизита, 12) = "Справочник." Тогда Имя = Сред(ТипРеквизита, 13); Ссылка = Справочники[Имя].НайтиПоНаименованию(Значение); ИначеЕсли Лев(ТипРеквизита, 20) = "ПланВидовХарактеристик." Тогда Имя = Сред(ТипРеквизита, 21); Ссылка = ПланыВидовХарактеристик[Имя].НайтиПоНаименованию(Значение); ИначеЕсли Лев(ТипРеквизита, 10) = "Документ." Тогда Имя = Сред(ТипРеквизита, 11); Ссылка = Документы[Имя].НайтиПоНомеру(Значение); как-то не очень |
|||
15
Garykom
гуру
12.06.25
✎
22:39
|
(12) (14) Логично что надо обернуть это в функцию и вызывать ее
Причем одинаковую обработку можно сгруппировать условием |
|||
16
WerLym
12.06.25
✎
22:40
|
(15) в функцию которая будет где дохера "если"? или есть какой-то гуманный способ
|
|||
17
craxx
12.06.25
✎
22:42
|
(10) Можно в RUTDF.
Прикольный формат от ЦБ. |
|||
18
Garykom
гуру
12.06.25
✎
22:42
|
(16) Да будет дофига Если
Но некоторые Если можно с ИЛИ Так и делают даже в типовых Еще иногда прикольней делают каждое Если/ИначеЕсли засовывают в отдельную процедуру/функцию Выглядит это так: НечтоНаВходе = ...; Если ПроверитьСправочник(НечтоНаВходе) Тогда ИначеЕсли ПроверитьДокумент(НечтоНаВходе) Тогда ИначеЕсли ПроверитьПланВидовХарактеристик(НечтоНаВходе) Тогда |
|||
19
WerLym
12.06.25
✎
22:43
|
просто тогда скорее всего надо прописывать что-то такое в функции
Выбор По Префикс Когда "Справочник" Тогда Возврат Справочники[ИмяТипа].НайтиПоНаименованию(Значение); Когда "ПланВидовХарактеристик" Тогда Возврат ПланыВидовХарактеристик[ИмяТипа].НайтиПоНаименованию(Значение); Когда "Перечисление" Тогда Возврат Перечисления[ИмяТипа].НайтиПоНаименованию(Значение); Когда "Документ" Тогда Возврат Документы[ИмяТипа].НайтиПоНомеру(Значение); Когда "ПланСчетов" Тогда Возврат ПланыСчетов[ИмяТипа].НайтиПоКоду(Значение); Когда "ПланВидовРасчета" Тогда Возврат ПланыВидовРасчета[ИмяТипа].НайтиПоКоду(Значение); Иначе Сообщить("Необработанный тип: " + ТипРеквизита); Возврат Неопределено; |
|||
20
WerLym
12.06.25
✎
22:44
|
(18) "Так и делают даже в типовых"
ема |
|||
21
craxx
12.06.25
✎
23:09
|
(19) ты путаешь язык запросов с языком 1С
|
|||
22
Волшебник
15.06.25
✎
13:11
|
(14) Есть функция СтрНачинаетсяС
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |