Найти в Дзене

Паттерны программирования в 1С: как писать чистый и поддерживаемый код

Паттерны проектирования — это проверенные решения типовых задач, которые помогают структурировать код, избегать ошибок и упрощать поддержку конфигураций. В 1С многие классические паттерны адаптируются с учётом особенностей платформы. Разберём ключевые из них с примерами. Задача: Создание объектов без явного указания их типов.
Пример: Универсальный менеджер для создания документов. // Общий модуль "ФабрикаДокументов"
Функция СоздатьДокумент(ТипДокумента, Параметры) Экспорт
Док = Документы[ТипДокумента].СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.Заполнить(Параметры); // Метод заполнения по параметрам
Возврат Док;
КонецФункции
// Использование:
ДокПоступление = ФабрикаДокументов.СоздатьДокумент("ПоступлениеТоваров", Новый Структура("Контрагент, Склад")); Плюсы: Задача: Переключение алгоритмов в рантайме.
Пример: Разные способы расчёта скидки. // Общий модуль "СтратегииСкидок"
Функция РассчитатьСкидку(Способ, Сумма)
Если Способ = "Фиксированная" Тогда
Воз
Оглавление

Паттерны проектирования — это проверенные решения типовых задач, которые помогают структурировать код, избегать ошибок и упрощать поддержку конфигураций. В 1С многие классические паттерны адаптируются с учётом особенностей платформы. Разберём ключевые из них с примерами.

1. Фабричный метод (Factory Method)

Задача: Создание объектов без явного указания их типов.
Пример: Универсальный менеджер для создания документов.

// Общий модуль "ФабрикаДокументов"
Функция СоздатьДокумент(ТипДокумента, Параметры) Экспорт
Док = Документы[ТипДокумента].СоздатьДокумент();
Док.Дата = ТекущаяДата();
Док.Заполнить(Параметры); // Метод заполнения по параметрам
Возврат Док;
КонецФункции

// Использование:
ДокПоступление = ФабрикаДокументов.СоздатьДокумент("ПоступлениеТоваров", Новый Структура("Контрагент, Склад"));

Плюсы:

  • Упрощает массовое создание объектов.
  • Снижает связность кода.

2. Стратегия (Strategy)

Задача: Переключение алгоритмов в рантайме.
Пример: Разные способы расчёта скидки.

// Общий модуль "СтратегииСкидок"
Функция РассчитатьСкидку(Способ, Сумма)
Если Способ = "Фиксированная" Тогда
Возврат Сумма * 0.1;
ИначеЕсли Способ = "Накопительная" Тогда
Возврат РассчитатьНакопительнуюСкидку(Сумма);
ИначеЕсли Способ = "Сезонная" Тогда
Возврат Сумма * 0.15;
КонецЕсли;
КонецФункции

// Использование в документе "Заказ":
Процедура ПриЗаписи()
Скидка = СтратегииСкидок.РассчитатьСкидку(Объект.СпособСкидки, ИтоговаяСумма);
КонецПроцедуры

Плюсы:

  • Лёгкое добавление новых алгоритмов.
  • Изоляция бизнес-логики.

3. Наблюдатель (Observer)

Задача: Реакция на события объектов.
Пример: Отправка уведомлений при изменении статуса заказа.

// В модуле документа "Заказ":
Процедура ПослеЗаписи()
Если Объект.Статус <> Представление.Статус Тогда
Уведомления.ОтправитьАдминистратору("Статус заказа изменён: " + Объект.Статус);
КонецЕсли;
КонецПроцедуры

Где ещё используется:

  • Обработка изменений в регистрах.
  • Интеграция с внешними системами (например, 1С:CRM).

4. Одиночка (Singleton)

Задача: Гарантия единственного экземпляра объекта.
Реализация через общий модуль:

// Общий модуль "НастройкиСистемы" (Вызов сервера)
Перем ГлобальныеНастройки;

Функция ПолучитьНастройки() Экспорт
Если ГлобальныеНастройки = Неопределено Тогда
ГлобальныеНастройки = ЗагрузитьИзРегистраСведений();
КонецЕсли;
Возврат ГлобальныеНастройки;
КонецФункции

Плюсы:

  • Централизованное управление настройками.
  • Экономия ресурсов за счёт кэширования.

5. Адаптер (Adapter)

Задача: Совмещение несовместимых интерфейсов.
Пример: Адаптация данных для внешнего API.

// Общий модуль "АдаптерJSON"
Функция КонвертироватьВJSON(ТаблицаЗначений)
Результат = Новый Структура();
Для Каждого Строка Из ТаблицаЗначений Цикл
Результат.Вставить(Строка.Ключ, Строка.Значение);
КонецЦикла;
Возврат JSON.Записать(Результат);
КонецФункции

Использование:

Данные = АдаптерJSON.КонвертироватьВJSON(ТаблицаДляЭкспорта);
ОтправитьHTTPЗапрос(Данные);

6. Декоратор (Decorator)

Задача: Динамическое добавление функциональности.
Пример: Логирование выполнения методов.

// Общий модуль "Логгер"
Процедура ЛогироватьВызов(ИмяМетода, Параметры)
Запись = ЖурналРегистрации.СоздатьЗапись();
Запись.Метод = ИмяМетода;
Запись.Параметры = JSON.Записать(Параметры);
Запись.Дата = ТекущаяДата();
Запись.Записать();
КонецПроцедуры

// Обёртка для любого метода:
Функция ВыполнитьСЛогированием(Метод, Параметры)
ЛогироватьВызов(ИмяМетода, Параметры);
Возврат Метод(Параметры);
КонецФункции

7. Состояние (State)

Задача: Изменение поведения объекта при смене состояния.
Пример: Управление статусами документа.

// В модуле документа:
Процедура УстановитьСтатус(НовыйСтатус)
Если Объект.Статус = "Черновик" И НовыйСтатус = "Проведён" Тогда
Объект.Провести();
ИначеЕсли Объект.Статус = "Проведён" И НовыйСтатус = "Отмена" Тогда
Объект.ОтменитьПроведение();
КонецЕсли;
КонецПроцедуры

Антипаттерны в 1С: чего избегать

  1. Божественный модуль
    Модуль с 5000+ строками кода, который делает «всё».
    Решение: Разделять код по общим модулям с чёткими зонами ответственности.
  2. Жёсткая связность
    Прямые вызовы методов между объектами без интерфейсов.
    Пример:// Плохо:
    Док.Сумма = Справочники.Номенклатура.НайтиПоНаименованию("Карандаш").Цена;
    // Хорошо:
    Док.Сумма = СервисЦен.ПолучитьЦену("Карандаш");
  3. Копипаста
    Повторяющиеся блоки кода в разных модулях.
    Решение: Выносить общую логику в функции общих модулей.

Итоги

ПаттернГде применять в 1СПреимуществоФабрикаСоздание документов, справочниковУнификация создания объектовСтратегияРасчёты (цены, скидки, налоги)Гибкость бизнес-логикиНаблюдательСобытия объектов и интеграцииРеактивность системыАдаптерРабота с внешними API/сервисамиИзоляция сторонних зависимостей

Совет: Используйте Библиотеку стандартных подсистем (БСП) — многие паттерны уже реализованы в ней (например, «МенеджерЗадач», «СлужебныеФункции»)