Шаги для воспроизведения ошибки в структуре подчиненностиОбычная структура подчиненности

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецПроцедуры // ErrorFix_ВывестиРодительскиеДокументы()

От pbazeliuk

3 комментарий для “Родительские документы пропали из структуры подчиненности”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *