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

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

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

Youtube

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

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

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

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


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

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

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

&НаСервере

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Вакансии

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

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

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

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

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