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