May 29th, 2021

Рефакторинг в 1С. Этюд по выделению метода

Этюд по выделению метода

Ниже представлено последовательноое выделение фрагмента кода в функцию при помощи Конфигуратора. Механизм рефакторинг-выделить фрагмент.
У кого есть под рукой EDT проверьте, там так же или умнее работает?

Исходник


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

Делай раз

Выделяем расчет внешней переменной

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    НекаяФигня = Новый Массив;
    ФигняВторогоУровня = Новый Массив;
    ЭтоСамаяВнешняяПеременная = ПолучитьВнешнюю(НекаяФигня, ФигняВторогоУровня);

    Сообщить(ЭтоСамаяВнешняяПеременная);
КонецПроцедуры

Функция ПолучитьВнешнюю(Знач НекаяФигня, Знач ФигняВторогоУровня)
    
    Перем ВнутреннийЭлемент, Элемент, ЭтоВнутренняяПеременная, ЭтоСамаяВнешняяПеременная;
    
    ЭтоСамаяВнешняяПеременная = Неопределено;
    Для Каждого Элемент из НекаяФигня Цикл 
        ЭтоВнутренняяПеременная = Неопределено;
        Для Каждого ВнутреннийЭлемент Из ФигняВторогоУровня Цикл 
            ЭтоВнутренняяПеременная = ВнутреннийЭлемент;
        КонецЦикла;
        ЭтоСамаяВнешняяПеременная = ЭтоВнутренняяПеременная;
    КонецЦикла;
    Возврат ЭтоСамаяВнешняяПеременная;
    
КонецФункции

Делай два

Аналогично выделяем расчет внутренней переменной

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    НекаяФигня = Новый Массив;
    ФигняВторогоУровня = Новый Массив;
    ЭтоСамаяВнешняяПеременная = ПолучитьВнешнюю(НекаяФигня, ФигняВторогоУровня);
    
    Сообщить(ЭтоСамаяВнешняяПеременная);
КонецПроцедуры

Функция ПолучитьВнешнюю(Знач НекаяФигня, Знач ФигняВторогоУровня)
    
    Перем ВнутреннийЭлемент, Элемент, ЭтоВнутренняяПеременная, ЭтоСамаяВнешняяПеременная;
    
    ЭтоСамаяВнешняяПеременная = Неопределено;
    Для Каждого Элемент из НекаяФигня Цикл 
        ПолучитьВнутреннюю(ФигняВторогоУровня, ЭтоВнутренняяПеременная);

        ЭтоСамаяВнешняяПеременная = ЭтоВнутренняяПеременная;
    КонецЦикла;
    Возврат ЭтоСамаяВнешняяПеременная;
    
КонецФункции

Процедура ПолучитьВнутреннюю(Знач ФигняВторогоУровня, ЭтоВнутренняяПеременная)
    
    Перем ВнутреннийЭлемент;
    
    ЭтоВнутренняяПеременная = Неопределено;
    Для Каждого ВнутреннийЭлемент Из ФигняВторогоУровня Цикл 
        ЭтоВнутренняяПеременная = ВнутреннийЭлемент;
    КонецЦикла;
    
КонецПроцедуры

Внимание вопрос?

Q - почему первый раз функция (как и ожидалось), а второй раз процедура?
A - потому что в первом случае ЭтоСамаяВнешняяПеременная это только что объявленная переменная, а во втором - она есть в строке Перем
Q - А кто её туда поставил???
A - Упс…
Q - А зачем вообще смотреть на список Перем? Может только для того, чтобы стирать из него лишнее?
A - вы можете отправить своё предложение боту в телеграм. Да, даже про конфигуратор. Да, только отправить. Ждать чего либо не стоит.