При создании тиражных или корпоративных решений часто возникает задача разделения функционала: необходимо выпустить облегченную (младшую) версию программы с базовыми возможностями и полную (старшую/КОРП) версию. Вести две или три независимые конфигурации параллельно вручную — крайне неэффективный путь, который приводит к рассинхронизации кода, ошибкам при повторном переносе доработок и проблемам при переходе пользователей с младшей версии на старшую.
Разберем основные архитектурные и технические подходы, которые позволяют организовать разработку нескольких продуктов на базе единого исходного кода в среде 1С:Предприятие 8.
Посмотрим на опыт разработки флагманских решений (линейка 1С:ERP, 1С:Комплексная автоматизация и 1С:Управление торговлей). Разработка ведется в единой максимальной конфигурации (ERP), после чего сборочный конвейер автоматически формирует младшие конфигурации путем исключения лишних модулей и метаданных.
Рассмотрим, как устроен этот процесс:
#Если КОРП). Поэтому в текстах модулей используются служебные комментарии-теги для внешнего парсера исходного кода..cf: Очищенные исходные тексты загружаются в эталонную базу пакетным запуском конфигуратора или утилитами сборки платформы для формирования дистрибутива поставки.Важный нюанс: При нарезке конфигураций критически важно сохранять неизменными внутренние идентификаторы объектов (UUID). Если базовый справочник или документ в младшей версии будет пересоздан заново с другим идентификатором, пользователи не смогут выполнить штатный апгрейд базы на старшую версию без потери данных.
Посмотрим, как выглядит пример разметки кода специальными комментариями для внешнего препроцессора сборки:
// В коде общего модуля размещаются маркеры для сборочного скрипта
Функция ПолучитьПараметрыРасчета() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("БазовыйТариф", 100);
// &НачалоВставки(КОРП)
Параметры.Вставить("РасширеннаяАналитика", Истина);
Параметры.Вставить("КоэффициентСложности", 1.5);
// &КонецВставки(КОРП)
Возврат Параметры;
КонецФункции
Если нет необходимости физически скрывать метаданные и программный код из поставки, проанализируем вариант с использованием механизма Функциональные опции в рамках одной общей конфигурации.
Разберем по шагам схему реализации:
ИспользоватьРасширенныйФункционал типа Булево).ФункциональнаяОпция, хранилищем которой выступает созданная константа.ПолучитьФункциональнуюОпцию().Рассмотрим пример проверки доступности опции в программном модуле:
Если ПолучитьФункциональнуюОпцию("ИспользоватьРасширенныйФункционал") Тогда
// Выполняем алгоритмы старшей редакции
ВыполнитьРасширенныйРасчет();
Иначе
// Выполняем базовый алгоритм
ВыполнитьБазовыйРасчет();
КонецЕсли;
Современный и модульный подход заключается в разделении программы на основную конфигурацию и расширение функционала.
Рассмотрим ключевые особенности этой архитектуры:
.cf): Содержит все общее ядро, базовые справочники, документы и типовую бизнес-логику. Она поставляется как младшая редакция продукта..cfe): Создается с назначением Адаптация или Дополнение. В него выносятся специфические объекты метаданных старшей версии, дополнительные реквизиты к объектам ядра и переопределения логики с помощью аннотаций &Вместо, &После или &Перед.Если разработка ведется в 1C:Enterprise Development Tools или конфигурация выгружается в Git, организуем процесс через модель ветвления:
main-core, в которой ведется разработка только базовой функциональности младшей конфигурации.corp-release для старшей версии.main-core и регулярно переносятся в ветку corp-release через стандартные операции слияния (merge).corp-release и никогда не вливается обратно в ядро.Выбор конкретного метода зависит от масштаба проекта: для небольших решений оптимально использовать расширения конфигурации или функциональные опции, а для крупных тиражных продуктов — автоматизированную сборку и выгрузку декомпозированных исходников.