Как исправить избыточный и повторяющийся код при инициализации структур и массивов в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике начинающих разработчиков часто встречается ситуация, когда необходимо инициализировать большой объем однотипных данных — например, список тарифов, идентификаторов или настроек. В результате в модуле появляются десятки строк кода, которые выглядят как «копипаст»: Тариф1 = Новый Структура..., Тариф2 = Новый Структура... и так далее. Такой подход называют «магическим кодом» или избыточным кодом, который крайне сложно поддерживать. Разберем подробно, как превратить «безобразие» в профессиональный, лаконичный и масштабируемый программный код.

Проблема избыточного объявления переменных

Рассмотрим ситуацию: разработчику нужно создать 30 структур с идентификаторами и добавить их в массив. Самый очевидный, но неверный путь — создавать каждую переменную вручную. Проанализируем, почему это плохо:

  1. Сложность изменения: Если завтра потребуется добавить в структуру еще одно поле (например, Наименование), вам придется вручную редактировать все 30 и более блоков кода.
  2. Риск опечаток: Легко пропустить номер переменной (например, после Тариф12 сразу написать Тариф14) или ошибиться в ID.
  3. Нечитаемость: Модуль раздувается до огромных размеров, и полезная логика теряется в «мусоре» из объявлений.

Рассмотрим по шагам, как можно оптимизировать этот процесс, начиная от самых простых методов и заканчивая архитектурно правильными подходами.

Решение 1. Использование циклов и динамического вычисления

Если данные уже захардкожены (прописаны жестко) в коде в виде пронумерованных переменных, их можно собрать в массив с помощью цикла. Для этого в языке 1С существует функция Вычислить(). Рассмотрим этот метод, хотя сразу оговоримся, что он имеет свои недостатки.

Предположим, у вас уже объявлены переменные Тариф1, Тариф2 и так далее. Вместо ручного добавления в массив используем следующий код:


Для а = 1 По 34 Цикл
    // Динамически формируем имя переменной и получаем её значение
    ТекущийТариф = Вычислить("Тариф" + Строка(а));
    МассивДанных.Добавить(ТекущийТариф);
КонецЦикла;

Важное предупреждение: Использование Вычислить() и Выполнить() считается плохим тоном в среде 1С по нескольким причинам. Во-первых, это замедляет работу системы, так как строка компилируется прямо во время выполнения. Во-вторых, такой код невозможно проверить отладчиком (нельзя зайти внутрь вычисляемой строки). В-третьих, это потенциальная дыра в безопасности. Поэтому рассмотрим более правильные методы.

Решение 2. Инициализация через универсальные коллекции

Вместо создания множества отдельных переменных Тариф1, Тариф2, лучше сразу использовать объект Соответствие или Массив. Это позволит нам хранить данные в одной переменной-контейнере. Разберем ситуацию, когда нам нужно быстро создать структуры с ID.


Тарифы = Новый Соответствие;
// Мы можем наполнять коллекцию компактно
Тарифы.Вставить(1, Новый Структура("id", 1));
Тарифы.Вставить(2, Новый Структура("id", 3));
Тарифы.Вставить(3, Новый Структура("id", 5));
// ... и так далее

Такой подход уже чище, но все равно содержит много повторяющихся строк Новый Структура. Попробуем еще больше сократить код.

Решение 3. Использование функции «СтрРазделить» для массовой загрузки

Если вам нужно просто инициализировать массив структур на основе списка ID, самый эффективный способ — перечислить эти ID в одной строке и обработать их. Выясним, как это реализовать:


СписокID = "1,3,5,10,11,12,15,16,17,18,57,58,59,60,61,62,63,118,119,120,121,122";
МассивID = СтрРазделить(СписокID, ",");

МассивДанных = Новый Массив;
Для Каждого Ид Из МассивID Цикл
    // Преобразуем строку в число и создаем структуру
    НовыйТариф = Новый Структура("id", Число(СокрЛП(Ид)));
    МассивДанных.Добавить(НовыйТариф);
КонецЦикла;

Проанализируем ситуацию: мы заменили 34 блока кода (примерно 100 строк) на небольшой фрагмент из 7 строк. Теперь, чтобы добавить новый тариф, вам нужно просто дописать его ID в строку СписокID.

Решение 4. Архитектурный подход: уход от «Магических чисел»

Прописывание ID (1, 3, 5, 122) прямо в программном коде — это критическая ошибка проектирования. Такие числа называют «магическими». Если в будущем в базе данных изменится ID тарифа, вам придется искать по всем модулям, где вы его использовали. Рассмотрим, как сделать систему надежной.

1. Использование предопределенных элементов

Если тарифы являются элементами справочника в вашей базе, лучше всего сделать их предопределенными. Тогда в коде вы будете обращаться к ним по имени:

Справочники.Тарифы.ДоставкаКурьером Справочники.Тарифы.Самовывоз 2. Вынос настроек в базу данных

Если тарифы приходят из внешней системы (например, через API сайта), создайте служебный справочник или регистр сведений «Настройки соответствия тарифов». Тогда программисту вообще не нужно будет править код — администратор сможет просто зайти в пользовательский режим и обновить ID в таблице.

Решение 5. Создание функции-конструктора (Принцип DRY)

Принцип DRY (Don't Repeat Yourself — не повторяйся) гласит, что логика создания объекта должна быть описана в одном месте. Если нам всё же необходимо создавать структуры в коде, разработаем вспомогательную функцию.


Функция СоздатьОбъектТарифа(Идентификатор)
    Результат = Новый Структура;
    Результат.Вставить("id", Идентификатор);
    Результат.Вставить("ДатаСоздания", ТекущаяДата());
    Возврат Результат;
КонецФункции

// Теперь основной код выглядит так:
МассивДанных.Добавить(СоздатьОбъектТарифа(1));
МассивДанных.Добавить(СоздатьОбъектТарифа(3));
МассивДанных.Добавить(СоздатьОбъектТарифа(5));

Это позволяет легко менять логику создания всех тарифов одновременно, изменив только одну функцию СоздатьОбъектТарифа.

Итоги рефакторинга

Подведем итоги. Чтобы ваш код не вызывал вопросов у коллег и руководства, следуйте этим правилам:

Применяя эти методы, вы не только сократите объем кода в разы, но и сделаете его значительно более устойчивым к ошибкам и легким для понимания другими разработчиками.

← На главную