При сопровождении крупной торговой сети (50 и более магазинов), работающей в распределенной информационной базе (РИБ), часто возникает необходимость оперативно вносить изменения в кассовую линейку: подключать отправку SMS, интегрировать новые программы лояльности, корректировать интерфейс рабочего места кассира (РМК). Главная сложность заключается в том, что применение новой конфигурации в центральной базе (ЦБ) автоматически регистрирует изменения метаданных для всех периферийных узлов. В результате регулярный обмен данными приостанавливается до тех пор, пока на каждой кассе не будет выполнено обновление конфигурации базы данных. Разберем основные подходы, позволяющие тестировать и безопасно раскатывать функционал на пилотных магазинах без сбоев в работе всей сети.
Рассмотрим наиболее современный и безопасный способ изоляции кассовых доработок. Вместо изменения основной конфигурации в ЦБ вся новая функциональность (кнопки в РМК, интеграции с внешними веб-сервисами, алгоритмы начисления бонусов) реализуется в виде отдельного расширения.
Разберем по шагам преимущества и логику такого подхода:
Проанализируем ситуацию, когда доработку невозможно вынести в расширение и код уже внедрен в основную конфигурацию. Чтобы код выполнялся только в определенных торговых точках, используется архитектурный паттерн Feature Flags (фич-тогглы).
Для реализации гибкого управления функционалом создадим отдельный справочник или используем штатный механизм платформы Функциональные опции:
ФлагиФункционала с реквизитом Активен (Булево) и табличной частью Магазины, где перечисляются конкретные узлы, участвующие в пилоте, а также флаг ПрименятьДляВсех.Посмотрим на пример программной проверки в коде:
Если МодульУправленияФлагами.ФичаАктивна("ПроверкаБонусовОнлайн", ТекущийМагазин) Тогда
ВыполнитьЗапросКСервисуБонусов();
Иначе
ВыполнитьСтандартныйРасчетСкидок();
КонецЕсли;
Важный момент: Чтобы конфигурация не обрастала устаревшими проверками и условиями, обязательно закладывайте этап рефакторинга. После того как функционал успешно протестирован и включен для 100% сети, флаг и ветвление Если ... Иначе удаляются из кода в следующем техническом релизе.
Выясним причину, по которой периферийный узел блокирует загрузку данных после обновления центральной базы. Платформа 1С при сохранении конфигурации базы данных автоматически выполняет регистрацию изменений метаданных для всех элементов планов обмена. Однако этой регистрацией можно управлять программно через метод ПланыОбмена.УдалитьРегистрациюИзменений().
Разберем по шагам, как отправить обновление конфигурации только на пилотные кассы:
Посмотрим на пример кода:
ВыборкаУзлов = ПланыОбмена.ПоМагазинам.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
УзелОбъекта = ВыборкаУзлов.ПолучитьОбъект();
Если Не УзелОбъекта.ЭтоПилотныйМагазин Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъекта.Ссылка, Метаданные.Конфигурация);
КонецЕсли;
КонецЦикла;
Обратите внимание: Данный способ безопасен только при изменении программного кода, макетов и экранных форм. Если в конфигурацию были добавлены новые реквизиты или объекты метаданных, непринявшие обновление узлы не смогут прочитать данные, содержащие новые поля, что приведет к ошибкам десериализации XML в процессе обмена.
Если специфика бизнеса требует постоянных доработок и кастомизации под разные форматы магазинов, рассмотрим вариант с выделением нескольких контуров обмена: