Имя: Пароль:
1C
 
Как проверить тип на составной?
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) Есть функция СтрНачинаетсяС