Поиск значения древовидной структуры по ключу

1. aturkov 18.04.23 21:30 Сейчас в теме
Клиент обратился с просьбой исправить ошибку в расширении, которая появилась после обновления.
Нашел проблемную строку кода:
Если Не Отказ И ДополнительныеСвойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда


Выяснил, что изменилась структура ДополнительныеСвойства, и к РежимуЗаписи теперь можно обратиться так:
Если Не Отказ И ДополнительныеСвойства.ПроведениеДокументов.СвойстваДокумента.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда


ПроведениеДокументов и СвойстваДокумента это структуры.

Решил, что нужно написать функцию по поиску значения в древовидной структуре ДополнительныеСвойства по ключу "РежимЗаписи", чтобы при последующих обновлениях и возможном изменении структуры ДополнительныеСвойства не возникала ошибка.

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


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


На ваш взгляд это правильный подход?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1826630 18.04.23 23:09 Сейчас в теме
3. comptr 36 19.04.23 06:53 Сейчас в теме
Решили не тестить даже?
Для Каждого Элемент Из Структура Цикл
    Если ТипЗнч(Элемент.Значение) = Тип("Структура") Или ТипЗнч(Элемент.Значение) = Тип("ФиксированнаяСтруктура") Тогда
        Возврат ПолучитьЗначениеСтруктурыПоКлючу(Элемент.Значение, Ключ);
    КонецЕсли;
КонецЦикла;

До второго элемента структуры даже не дойдёт, на первом же сработает Возврат.
7. aturkov 19.04.23 12:02 Сейчас в теме
(3)
Решили не тестить даже?

Код тестировал. Работает.
До второго элемента структуры даже не дойдёт, на первом же сработает Возврат.

Это рекурсивная функция. После того, как сработает возврат, выполнение функции продолжится.
8. spacecraft 19.04.23 12:16 Сейчас в теме
(7) проверьте:
Структура1 = Новый Структура("Фигня",Ложь);
Структура2 = Новый Структура("РежимЗаписи", Истина);
ДопСвойства = Новый Структура("Структура1, Структура2", Структура1, Структура2);
Результат = ПолучитьЗначениеСтруктурыПоКлючу(ДопСвойства,"РежимЗаписи");
10. aturkov 19.04.23 13:15 Сейчас в теме
(8) С такой структурой Неопределено возвращает, но в данном случае работает правильно, так как каждая структура вложена в другую.

ДополнительныеСвойства
....ПроведениеДокументов
........СвойстваДокумента.РежимЗаписи

Согласен, нужно переделать.
9. comptr 36 19.04.23 12:43 Сейчас в теме
(7)
После того, как сработает возврат, выполнение функции продолжится.

Вы же видите противоречие в этой фразе?
4. Dr.HiHi 2 19.04.23 08:07 Сейчас в теме
а если ничего не найдет, то какое значение вернет функция и где этот возврат??
6. comptr 36 19.04.23 11:44 Сейчас в теме
(4) Если принудительно ничего не возвращать, то будет Неопределено, но писать так, конечно же, не надо.
5. starjevschik 19.04.23 08:45 Сейчас в теме
А в следующем обновлении они имя ключа поменяют или перенесут в другой модуль. Пустое это. 1с тщательно следит за тем, чтобы обновления ломали работу как можно большего количества доработок, это хлеб франчей, а франчи это хлеб 1с.
Но если клиент готов оплачивать такие упражнения, то почему бы и нет.
11. user1826630 19.04.23 13:16 Сейчас в теме
"И эти люди запрещают мне ковыряться в носу..." (С)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот