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