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

Petro Bazeliuk —  Август 26, 2017 — 3 комментария

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Petro Bazeliuk

Записи

Опыт работы с «1С:Предприятие 8» — более 10 лет, за это время реализовано 30 успешных проектов по итеративным методологиям Scrum и Kanban. Оптимальные решения для высоконагруженных ИБ с онлайном от 400 человек. Занимаюсь продвижением в массы системы контроля версий — git и методики git-flow, TDD, BDD, а также проработкой паттерна минимальной модификации конфигурации и внесением изменений без обновления базы данных. Время от времени участвую в проекте xUnitFor1C.

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

  1. 

    Большое спасибо, совет помог

    Нравится

  2. 

    Спасибо, очень пригодилось

    Нравится

  3. 

    Спасибо. Очень сложно было понять природу ошибки. Очень помогли!

    Нравится

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s