1. LomayaZakat 05.06.18 15:55 Сейчас в теме

Родительские документы пропали из структуры подчиненности

Доброго времени суток, несколько дней назад столкнулся с неприятной ошибкой платформы «1С:Предприятие 8.3.10.2252» при использовании расширений конфигурации. С определенной вероятностью в структуре подчиненности перестают отображаться родительские документы и данная заметка призвана помочь разобраться в причине, а так же предложить метод обхода данной неприятности.
В видео, что ниже, описана последовательность шагов для воспроизведения ошибки со структурой подчиненности при отображении родительских документов.

Youtube

Причиной ошибки является код определения родительских документов в общей форме «Структура подчиненности»:

&НаСервере
Процедура ВывестиРодительскиеДокументы(ТекущийДокумент,ДеревоРодитель)

    СтрокиДерева = ДеревоРодитель.ПолучитьЭлементы();
    МетаданныеДокумента = ТекущийДокумент.Метаданные();
    СписокРеквизитов    = Новый СписокЗначений;

    Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
        
    Если Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
Показать


После добавления формы документа в расширение, код, что выделен выше, начинает для всех реквизитов документа возвращать значение
Ложь

По сути, что бы исправить данную ситуацию необходимо проводить сравнение полного имени
Реквизит.ПолноеИмя()
из
МетаданныеДокумента.Реквизиты
с каждым элементом включенным в состав критерия отбора
СвязанныеДокументы

Ниже приведен код для исправления ситуации:

&НаСервере

Процедура ВывестиРодительскиеДокументы(ТекущийДокумент, ДеревоРодитель)
    
    СтрокиДерева = ДеревоРодитель.ПолучитьЭлементы();
    МетаданныеДокумента = ТекущийДокумент.Метаданные();
    СписокРеквизитов    = Новый СписокЗначений;

   КэшПоискаПоСоставу = Новый Соответствие;
    Для Каждого Состав Из Метаданные.КритерииОтбора.СвязанныеДокументы.Состав Цикл
        КэшПоискаПоСоставу.Вставить(Состав.ПолноеИмя(), Истина);   
    КонецЦикла;
    
   Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
        
        //Если Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
        Если КэшПоискаПоСоставу[Реквизит.ПолноеИмя()] = Истина Тогда
            
            Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл
                
                МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
                
                Если МетаданныеРеквизита <> Неопределено
                    И Метаданные.Документы.Содержит(МетаданныеРеквизита)
                    И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                    
                    ЗначениеРеквизита = ТекущийДокумент[Реквизит.Имя];
                    
                    Если ЗначениеЗаполнено(ЗначениеРеквизита)
                        И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
                        И ЗначениеРеквизита <> ТекущийДокумент
                        И СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
                        
                        СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
                        
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЦикла;

    Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
        СтрРеквизитов = "";

        СодержимоеТЧ = ТекущийДокумент[ТЧ.Имя].Выгрузить();

        Для Каждого Реквизит Из ТЧ.Реквизиты Цикл

            //Если Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
           Если КэшПоискаПоСоставу[Реквизит.ПолноеИмя()] = Истина Тогда
            
                Для Каждого ТекущийТип Из Реквизит.Тип.Типы() Цикл
                    
                    МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
                    
                    Если МетаданныеРеквизита<>Неопределено
                        И Метаданные.Документы.Содержит(МетаданныеРеквизита)
                        И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
                        
                        СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
                        Прервать;
                        
                    КонецЕсли;
                КонецЦикла;
                
            КонецЕсли;
            
        КонецЦикла;

        СодержимоеТЧ.Свернуть(СтрРеквизитов);
        Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл

            Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл

                ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];

                МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
                Если МетаданныеЗначения <> Неопределено Тогда

                    Если ЗначениеЗаполнено(ЗначениеРеквизита)
                        И Метаданные.Документы.Содержит(МетаданныеЗначения)
                        И ЗначениеРеквизита <> ТекущийДокумент
                        И СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда

                            СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));

                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    СписокРеквизитов.СортироватьПоПредставлению();

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

КонецПроцедуры
Показать


Ссылка на оригинал
Ответы
Избранное Подписка Сортировка: Древо
2. bav123 10.01.19 13:33 Сейчас в теме
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Москва
зарплата до 120 000 руб.
Полный день

Программист 1С
Ростов-на-Дону
зарплата до 120 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Программист 1С
Москва
Полный день