Имя: Пароль:
1C
1С v8
Зацикливается функция
0 yavasya
 
29.09.14
13:38
Функция ПолучитьРодительскиеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт
    
    Если СписокСвязанныхДокументов = Неопределено Тогда
        СписокСвязанныхДокументов = Новый СписокЗначений;
    КонецЕсли;
    Если мУжеВСписке = Неопределено Тогда
        мУжеВСписке = Новый Соответствие;
    КонецЕсли;
    
    МетаданныеДокумента = ДокументСсылка.Метаданные();
    СписокРеквизитов = Новый СписокЗначений;
    
    Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
        ТипыРеквизита = Реквизит.Тип.Типы();
        Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
            МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
                    
            Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
                 И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                Попытка
                    ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
                Исключение
                    Прервать;
                КонецПопытки;
                ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
                     И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
                    Попытка
                        СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
                    Исключение
                         ОтладкаТекстОшибки = ОписаниеОшибки();
                    КонецПопытки;    
                КонецЕсли;
            КонецЕсли;            
            
        КонецЦикла;
    КонецЦикла;
    
    Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
        СтрРеквизитов = "";
        
        Попытка
            СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
        Исключение
            Прервать;
        КонецПопытки;
        
        Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
            ТипыРеквизита = Реквизит.Тип.Типы();
            Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
                МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);                
                Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
                    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                    СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
                    Прервать;
                КонецЕсли;                        
            КонецЦикла;
        КонецЦикла;
        
        СодержимоеТЧ.Свернуть(СтрРеквизитов);
        Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
            Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
                Попытка
                    ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
                Исключение
                    Продолжить;
                КонецПопытки;
                МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
                Если МетаданныеЗначения = Неопределено Тогда
                    // базовый тип
                    Продолжить;
                КонецЕсли;
                
                ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
                     И Метаданные.Документы.Содержит(МетаданныеЗначения)
                     И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
                    Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
                        Попытка
                            СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
                        Исключение
                            ОтладкаТекстОшибки = ОписаниеОшибки();
                        КонецПопытки;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;        
    КонецЦикла;
    мУжеВСписке.Вставить(ДокументСсылка, Истина);
    
    Для Каждого СтрСЗ Из СписокРеквизитов Цикл
        СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(СтрСЗ.Значение, СписокСвязанныхДокументов, мУжеВСписке);
    КонецЦикла;
        
    Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка
                           | ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
                          
    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    
    Выборка  = Запрос.Выполнить().Выбрать();
    ЕСли Выборка.Следующий() Тогда        
        СписокСвязанныхДокументов.Добавить(Выборка.Ссылка);
    Иначе
        СписокСвязанныхДокументов.Добавить(ДокументСсылка);
    КонецЕсли;
    
    Возврат СписокСвязанныхДокументов;
        
КонецФункции
1 yavasya
 
29.09.14
13:38
2 ssh2QQ6
 
29.09.14
13:40
Продолжайте наблюдения...
3 yavasya
 
29.09.14
13:40
если не находит родительские документы зацикливается пока все метаданные не переберет. Зацикливается всё на тип "строка" и не выходит из цикла, потому что она повторяется постоянно
4 yavasya
 
29.09.14
13:51
если счетчик <30 тогда продолжить, иначе возврат
5 Лодырь
 
29.09.14
13:52
тихо, сам с собою, я веду беседу..
6 yavasya
 
29.09.14
13:53
Для Счетчик = 1 По 5 Цикл
        Если Счетчик > 2 Тогда
            Прервать;
        КонецЕсли;
        Сообщить(Счетчик); // 1 2
    КонецЦикла;
7 yavasya
 
29.09.14
13:53
ну может подскажешь как родительские документы получить?
8 yavasya
 
29.09.14
13:57
другой функцией
9 yavasya
 
29.09.14
13:57
запросом может ?
10 France
 
29.09.14
14:02
критерии отбора в помощь отцу русской демократии..
11 yavasya
 
29.09.14
14:03
подробнее
12 yavasya
 
29.09.14
14:09
(6) взлетело.  блин корявый код. как правильно написать?
13 lodger
 
29.09.14
14:13
(11) Глобальный контекст (Global context)
КритерииОтбора (FilterCriteria)
Использование:

Только чтение.
Описание:

Тип: КритерииОтбораМенеджер.
Используется для доступа к определенным в конфигурации критериям отбора.

Доступность:

Сервер, толстый клиент, внешнее соединение.
См. также:

КритерииОтбораМенеджер

(12) переписать с нуля через критерии отбора.
14 yavasya
 
29.09.14
14:14
блин, непонятно
15 yavasya
 
29.09.14
14:15
(13) вашу аську можно?
16 yavasya
 
29.09.14
14:16
запрос по критериям отбора из структуры починенности это имеете ввиду?
17 hhhh
 
29.09.14
14:30
По идее и должно зацикливать. Всё правильно работает.

Например реализация ссылается на счет-фактуру, а счет-фактура ссылается на реализацию. У вас получается у реализации родитель счет-фактура, а у счет-фактуры родитель реализация. Ну и программа входит в бесконечный цикл.
18 yavasya
 
29.09.14
14:55
я это понимаю, как по другому сделать?
Закон Брукера: Даже маленькая практика стоит большой теории.