Выражаю искреннюю благодарность Каратаеву Олегу Александровичу за оказанную помощь и поддержку в работе!
Введение.
Описан практический пример обновления через копию конфигурации 1С:ERP. Управление холдингом с версии 3.2.6.6 на версию 3.2.6.7, который можно применять на других конфигурациях и версиях.
Типовой механизм "Обновление через копию" - не работает. Объекты помечены префиксом "Удалить" и "Не используется" (Возможно в следующих релизах их удалять или доведут до ума). Поэтому было разработано расширение, которое адаптирует типовой механизм до рабочего состояния.
Файл "Расширение Обновление через копию" адаптирует типовую подсистему "ОбновлениеЧерезКопию". Отдельная установка расширения будет бесполезна. Расширение не гарантирует полную работоспособность, возможно придется дорабатывать под частные особенности базы данных.
Краткое описание.
В чем суть?
В проде включаем регистрацию данных на узел плана обмена. Поднимаем копию прода и обновляем релиз вендора. В это время пользователи без проблем работают в проде. Загружаем данные из прода в копию. Меняем базы местами. Дальше пользователи работают так же в проде, но уже с новым релизом.
Для чего это нужно?
Функционал используется для сокращения времени недоступности прод базы при обновления релиза вендора. Например, когда долго происходит обновление релиза вендора (5-40... часов).
Стоит ли использовать?
- Стоит использовать только когда долгий простой прод базы недопустим, или критически опасен для бизнеса, либо несет большие издержки.
- Можно сократить простой прода до 1-2 часов
- Но подготовка к такому обновлению займет намного больше времени, от 1 недели до 2х месяцев.
- С помощью "Обновления через копию" можно обновить только 1 релиз (можно больше, но потребуется анализ метаданных, что не было критических изменений между релизами, и гарантировать целостность данных).
Используемая информация.
- Большая благодарность статье: "Обновление через копию" - как это использовать?
- Бесполезная инструкция механизма от вендора из справки 1С.
- Полезная инструкция настройки обмена из справки 1С.
- Информации на сайте вендора нет - ошибка 404 страница не найдена.
- Видео-обзор от 1С Учебный центр - для общего развития.
- Видео-презентация от Рарус - для общего развития.
Детальное описание механизма и поэтапного выполнения обновления и обмена.
Сначала выполните все описанные ниже действия на тестовом стенде.
После успешного обновления тестового стенда переходите к обновлению в проде.
1. Подготовка баз данных.
Подготовить базы для обновления:
- "update1" - Текущая рабочая прод БД - если это прод стенд, то она уже есть. На тестовом тесте разворачиваем тестовую базу для имитации прода на самом первом этапе.
- "update2" - Копия рабочей базы "update1", которую нужно сделать после включения обновления через копию на проде. Делается уже почти в самом конце, когда все готово для обновления.
- "test_update" - Копия прода для предварительного обновления релиза и адаптации доработок, и для разработки правил обмена. На выходе должны получить подготовленные CF-конфигурации, которые потом будем загружать в "update2".
- КД 3.1 – для разработки правил обмена между релизами.
Аналогичные базы данных нужно развернуть на тестовом стенде для тестирования. Не забываем блокировать рег. задания в кластере 1С и указывать признак "Копия" БД.
2. Предварительные настройки рабочей БД.
Добавить нужные метаданные в состав подсистемы "ОбновлениеЧерезКопию":
- ПланОбмена.ОбновлениеЧерезКопию - в плане обмена отключаем авторегистрацию.
- ПодпискаНаСобытие.ОбновлениеЧерезКопиюРегистрация
- ПодпискаНаСобытие.ОбновлениеЧерезКопиюРегистрацияКонстанты
- ПодпискаНаСобытие.ОбновлениеЧерезКопиюРегистрацияНабора
Если в вашей БД имеются расширения, содержащие метаданные, которые тоже нужно включить в обмен, тогда нужно добавить план обмена и подписки в расширения, и включить эти объекты в состав подсистемы.
Не рекомендуется добавлять в план обмена и в подписки весь вид метаданных целиком (корень/родитель), т.к. будут добавлены типовые объекты, которые не нужны. Например, если включить все регистры сведений, то будет возникать ошибка «Переполнение стека вызовов» при обновлении информационной базы данных. Какой конкретно регистр сведений вызывает ошибку я не обнаружил.
Загрузить расширение "ОбновлениеЧерезКопию", в котором исправлены ошибки типового механизма. Проверить расширение на возможность применения. Для расширения рекомендую сделать хранилище, т.к. скорее всего его придется дорабатывать, а применять его нужно как минимум на 3х базах.
3. Предварительное обновление релиза на тестовой базе.
Делаем копию прода с учетом изменений 1 пункта, и делаем обновление на тестовой базе. Адаптируем все нетиповые доработки и расширения. Получаем полностью работоспособные конфигурации и расширения (Они нам обязательно понадобятся для следующего пункта, для формирования правил обмена). На этом этапе мы должны понять сколько длится обновление, и насколько целесообразно делать обновление через копию.
4. Правила обмена Конвертация данных, редакция 3.1 (3.1.5.33).
1. Выгружаем конфигурации текущего релиза (update1) и нового релиза (test_update), и их расширения, которые изменяют структуру метаданных, в файлы.
2. Загружаем файлы конфигураций в КД в две итерации: текущий релиз с его расширениями и новый релиз с его адаптированными расширениями:
3. Делаем автогенерацию правил обмена из текущего релиза в новый релиз:
4. Делаем пустые правила обмена корреспондента (обратные), указать источник (новый релиз) и приемник (текущий релиз), и записать:
5. Делаем пустые правила регистрации, т.к. регистрация выполняется в коде через подписки, указываем конфигурацию, план обмена, наименование:
6. Выгружаем правила обмена, правила регистрации и правила обмена корреспондента. Наименования файлов должны быть следующими:
- ExchangeRules.xml – автосгенерированные правил обмена из текущего релиза в новый релиз.
- CorrespondentExchangeRules.xml – пустые правила коррексподента.
- RegistrationRules.xml – пустые правила регистрации.
Создаем архив .zip с этими файлами (название архива не важно, просто можно называть "ПравилаОбновленияЧерезКопию").
5. Обновление через копию.
Все предварительные работы выполнены и можно приступать к обновлению через копию.
- Начало. В Прод БД запустить обновление через копию.
- Загрузить правила обмена.
- Включить регистрацию данных.
- Сделать Копию Прода (бэкап).
- Создать новую копию БД, загрузить бэкап прода. Установить запрет сеансов и рег. заданий.
- В копию загрузить ранее подготовленные CF и CFE (конфигурацию и расширения), провести обновление копии.
- В обоих базах (рабочей и копии) настроить транспорт обмена через файл.
- Заблокировать обе БД рабочую и копию.
- В Рабочей базе запустить РЗ "Обновление через копию (отправка/получение)". Накопленные данные будут выгружены в файл.
- в копии прода запустить РЗ "Обновление через копию (отправка/получение)". Данные будут загружены в БД.
- Проверить журнал регистрации на наличие ошибок. Проверить выгруженные\загруженные данные.
- Сделать бэкап прода и сохранить его.
- Сделать бэкап копии и загрузить его в прод базу.
- Разблокировать прод базу.
- Проверить отложенные обработчики обновления. Конец.
Перспективы развития.
- Доработать обратный обмен из обновленной копии в прод, чтобы снимать данные с регистрации и производить несколько итераций обмена. Это позволит еще больше минимизировать простой прода за счет предварительных загрузок больших объемов данных, тогда последняя загрузка данных будет минимальная. Но придется сделать обратные правила обмена и доработать сам механизм "Обновления через копию".
- Полностью выделить подсистему 'ОбновлениеЧерезКопию' в расширение для отдельных внедрений в конфигурации, в которых её нет.
Дополнительная информация.
В статье //infostart.ru/1c/tools/1576756/ рекомендуют в правилах обмена в правилах конвертации объектов (ПКО) для документов устанавливать режим записи документа "Запись". Я не устанавливал, на мой взгляд данные итак загружаются в режиме ОбменДанными.Загрузка = Истина. Если потребуется, то это не проблема добавить режим записи в ПКО с помощью самописной обработки (она кстати есть в той статье), ну или сделать самому доработку хоть на базе ЕРП в расширении, хоть в базе КД...
В конфигураторе удобно делать сортировку по подсистеме "ОбновлениеЧерезКопию".
Рекомендую делать обмен через файл.
Если делать обмен через COM (прямое соединение), то у многих типовых серверных модулей отсутствует свойство "ВнешнееСоединение", и не работает аутентификация ОС.
Чтобы вернуться назад по этапу обновления через копию, нужно изменить константу "ОбновлениеЧерезКопиюСостояние"
или некоторые реквизиты на форме обработки "ОбновлениеЧерезКопию"
или значения реквизитов плана обмена "ОбновлениеЧерезКопию".
Ошибки, которые возникали при обновлении 3.2.6.6 - 3.2.6.7.
1 - Ошибка "Переполнение стека вызова". Связана с тем, что в подписку на событие "ОбновлениеЧерезКопиюРегистрацияНабора" был включен корень Регистров сведений. И в состав подписке оказался включен какой-то типовой РС, который не должен там находиться. Из-за этого происходило зацикливание при записи этого регистра. Решение: в состав плана обмена и подписок на события включать только нужные объекты. Я не стал тратить время на выявление какой конкретно регистр вызывает ошибку.
2 - При COM-соединении (прямом соединении) настройки транспорта обмена могут возникать ошибки инициализации модуля и не определенной переменной (общего модуля).
Связана с тем что у многих серверных модулей отсутствует свойство "ВнешнееСоединение". Решение: установить свойство общих модулей в соответствии стандарта 1С https://its.1c.ru/db/v8std/content/469/hdoc
3 - Ошибка "Попытка передачи с клиента на сервер мутабельного значения". Возникает при КОМ-соединении (прямом соединении). При обмене через файл не возникает. Связана с тем что у общего модуля "ллл_API_out" отсутствует свойство "ВнешнееСоеднинение". По хорошему это архитектурная ошибка, нужно рефакторить общий модуль и разделять на два: один ВызовСервера, другой ВнешнеееСоединение, в соответствии с стандартом 1С https://its.1c.ru/db/v8std/content/469/hdoc
По плохому - можно установить свойство "ВнешнееСоединение" для этого модуля.
4 - Ошибка "Поле объекта не обнаружено" при загрузке данных из файла в копию базы. Связана с тем что в типовом решении при загрузке данных система берет Правила обмена корреспондента, которые пустые, и не находит в них правила конвертации объектов.
Решение: ошибка исправлена через расширение, чтобы система брала нужные (прямые) правила обмена, а не обратные.
5 - Ошибка "Поле объекта не обнаружено" при загрузке\выгрузке данных. Связано с тем что реквизит переименовали. Решение: в расширении сделал проверку через попытку\исключение свойства источника и приемника. Частная ошибка между релизами. В других релизах может возникать аналогичная ошибка.
6 - Доработан типовой функционал Обновления через копию. Получение настроек транспорта обмена из регистра и заполнение их в обработку выгрузки\загрузки данных.
7 - Исправлены ошибки значений перечислений и общего реквизита
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.20.101, 2.5.20.97