Имя: Пароль:
1C
 
работа с реквизитами доков и справочников
0 Droning
 
10.05.18
13:06
Доброго времени суток)

Я- стажер, работодатель дал задание- создать подписку на событие, которая бы выполняла следующие действия:

необходимо чтобы обработка пробегала по документам и справочникам, писала в сообщения о том что это за тип метаданных. Справочник или Документ. Далее заходила бы в каждый документ и справочник и определяла типы реквизитов с выводом сообщений, в том числе табличные части, если заполнены и их реквизиты. если не заполнены, то должно выводиться соответствующее сообщение.

Вроде должно делаться через рекурсию.

пока что я родил только подписку на событие и в качестве обработчика указал новосозданный общий модуль. а вот что в нем писать- это уже ступор.

нашел на итс такой вот код-

Процедура ОпределениеТиповОбъектовИИхРеквизитов(ТипЗначения) Экспорт


Спр = ТипЗнч(Справочники);
Док = ТипЗнч(Документы);
ТипЗначения = ТипЗнч(ВыбСчет);


ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
    Сообщить("Это Справочник");
ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
    Сообщить("Это Документ");
КонецЕсли;

КонецПроцедуры;



процедуру называл сам, параметры какие указывать пока даже не знаю(

Очень хотелось бы, чтобы вы смогли направить меня в нужном направлении, может что-то подсказать по структуре и синтаксису. Заранее благодарен!
1 Droning
 
10.05.18
13:07
изначально код выглядел так



ТипЗначения = ТипЗнч(ВыбСчет);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
Сообщить("Справочник");
ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
Сообщить("Документ");
КонецЕсли;
2 Mankubus
 
10.05.18
13:08
>>процедуру называл сам, параметры какие указывать пока даже не знаю(
зачем сам? Когда подписку создаешь она сама процедуру создает
3 lubitelxml
 
10.05.18
13:09
(2) как думаешь на какое действие (0) нужна подписка?
4 Droning
 
10.05.18
13:20
у меня в 1ске возможно 5 вариантов. Думаю при записи норм будет. это не главное, насколько я понял. сам код не знаю с чего начать писать
5 Droning
 
10.05.18
13:21
Mankubus  тоесть весь код я должен писать внутри созданной процедуры?
тут?



Процедура ПодпискаНаСобытие1ПриЗаписи(Источник, Отказ) Экспорт
    // Вставить содержимое обработчика.
КонецПроцедуры
6 lubitelxml
 
10.05.18
13:22
(5) да, чтобы именно подписка сработала
7 lubitelxml
 
10.05.18
13:25
8 Droning
 
10.05.18
13:28
да, видел этот пример. А как забраться внутрь каждого элемента массива справочников и документов? как пробежаться по реквизитам?
9 Droning
 
10.05.18
13:34
Процедура ПодпискаНаСобытие1ПриЗаписи(Источник, Отказ) Экспорт
    
    МассивОбъектов = Новый Массив;
    
МассивОбъектов.Добавить("Документы");
МассивОбъектов.Добавить("Справочники");


Для Каждого Элем из МассивОбъектов Цикл
Для Каждого ТекОбъект из Метаданные[Элем] Цикл

Если СтрДлина(ТекОбъект.Имя) > 123 тогда
//что-то делаем
КонецЕсли;
КонецЦикла;
КонецЦикла;


КонецПроцедуры



какой цикл должен быть вместо
Если СтрДлина(ТекОбъект.Имя) > 123 тогда
//что-то делаем
КонецЕсли;
10 PR
 
10.05.18
13:36
Давайте, бухтите ТС про космические корабли :))
11 lubitelxml
 
10.05.18
13:37
(10) что за космические корабли? )
12 Mankubus
 
10.05.18
13:38
(3) ему не нужна подписка, а вдруг потом когда-нибудь понадобится. Зато теперь он знает что для нее не надо писать процедуру руками
(5) С чего ты решил что создавать надо именно подписку?
13 PR
 
10.05.18
13:39
(11) Классику нужно знать
Операция Ы и другие приключения Шурика
14 Droning
 
10.05.18
13:39
Mankubus  это вроде как понадобится потом для обмена и работодатель сказал, что так будет проще в дальнейшем.
15 Индиго
 
10.05.18
13:40
(0)
вот тебе болванка.Разбирайся:-)
//---
    Запрос=Новый Запрос;
    ТекстЗ="Выбрать Док.ссылка Из Документ.ИмяДок КАК Док";

    Для Каждого Менеджер из Документы Цикл
        Мета=Менеджер.Пустаяссылка().Метаданные();    
        Имя=Мета.Имя;
        Запрос.Текст=СтрЗаменить(ТекстЗ,"ИмяДок",Имя);
        Выборка=Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            ОбработкаПрерыванияПользователя();

            Сообщить("Документ."+Выборка.ссылка+"----------------------------------
            |    РЕКВИЗИТЫ:");
            Док=Выборка.Ссылка;
            Для Каждого Рек Из Мета.Реквизиты Цикл
                ИмяРек=Рек.Имя;
                Сообщить("    -"+ИмяРек+":"+Док[ИмяРек]+", тип:"+ТипЗнч(Док[ИмяРек]));
                
            КонецЦикла;    
            Для Каждого ТЧ Из Мета.ТабличныеЧасти Цикл
                ИмяТЧ=ТЧ.Имя;
                Сообщить("    ТАБ. ЧАСТЬ '"+ИмяТЧ+"',кол. строк"+Док[ИмяТЧ].Количество());
                Для Каждого Стр из Док[ИмяТЧ] Цикл
                    ОбработкаПрерыванияПользователя();

                    строчка="";
                    Для Каждого РекТЧ Из ТЧ.Реквизиты Цикл
                        ИмяРекТЧ=РекТЧ.Имя;
                        строчка=строчка+ИмяРекТЧ+":"+Стр[ИмяРекТЧ]+"....";
                    КонецЦикла;
                    Сообщить("            -"+Стр.НомерСтроки+"."+строчка);
                КонецЦикла;    
                
            КонецЦикла;    
            
        КонецЦикла;    
        
    КонецЦикла;
16 Индиго
 
10.05.18
13:40
со справочниками также
17 Droning
 
10.05.18
13:41
Индиго, спасибо, сейчас буду шарить что к чему))

а по тому коду, что выше? забить?
18 Индиго
 
10.05.18
13:42
(17)Можешь распечатать и повесить в рамочке.На память.
19 Droning
 
10.05.18
13:47
Индиго   Для Каждого Менеджер из Документы Цикл
        Мета=Менеджер.Пустаяссылка().Метаданные();


а что тут подразуменвается под словом Менеджер? в этом выражении мне нужно обратиться к реквизитам? по типу

Для Каждого Реквизит

потом нужно както обозначить что слово Реквизит в данном случае будет обращаться к реквизиту доккумента...

Так вот. как блин обратиться к реквизиту? синтаксиса у меня в голове пока что минимум.


например по анологии   Мета= ???????????????
20 Индиго
 
10.05.18
13:48
(19)Менеджер подразумевается, что Документы - это стандартная коллекция менеджеров документов и ты их перебираешь.
21 Индиго
 
10.05.18
13:49
(19)там же все написано. Пробегает и по реквизитам и по таб частям и по реквизитам таб частей. Чего тебе еще не хватает?
22 Индиго
 
10.05.18
13:50
можно конечно и просто через Метаданные.Документы, но мне вот так первое в голову пришло.
23 Droning
 
10.05.18
13:52
Знаний мне не хватает) в особенности знаний синтаксиса) ладно, щас попробую что-то наваять. спасибо большущее)
24 Индиго
 
10.05.18
13:53
(23)Книжки читай. Литературы море. А ходя кругами с бубном ты еще долго синтаксис знать не будешь
25 Droning
 
10.05.18
14:01
а можно это сделать не через запрос с через созданный массив данных ?
26 Мандалай
 
10.05.18
14:09
(25)Че?
27 FIXXXL
 
10.05.18
14:35
(25) запрос тебе не нужен
для начала порекомендую освоить отладчик в конфигураторе, посмотреть "потроха", из чего состоят метаданные и прочее
что бы понимать, что ты пишешь
Закон Брукера: Даже маленькая практика стоит большой теории.