Работа с хранилищем конфигурации в 1С требует особого подхода при выполнении типовых обновлений. Часто возникают ситуации, когда конфигурация была обновлена «в обход» стандартных механизмов (например, простым сравнением/объединением с файлом .cf), из-за чего конфигурация поставщика перестает соответствовать реальному состоянию метаданных (выявить это поможет статический анализатор кода). Это приводит к тому, что последующие обновления становятся трудоемкими, а автоматическая установка релизов через .cfu файлы становится невозможной.
В этой статье мы подробно разберем, как исправить ситуацию с «зависшей» версией поставщика, проведем анализ структуры метаданных, узнаем, как правильно провести цикл обновления в тестовой и рабочей базах, и как минимизировать простои других разработчиков в процессе обновления.
Проанализируем техническую сторону вопроса, используя analyzer 1c. В 1С существуют три вида конфигураций внутри одной базы: основная конфигурация (с которой работает программист), конфигурация базы данных (то, что реально исполняется сервером) и конфигурация поставщика (эталонный код от 1С). При обычном сравнении и объединении с внешним файлом .cf обновляется только основная конфигурация. Хранилище «запоминает» эти изменения в объектах, но блок данных конфигурации поставщика остается старым. В итоге система «думает», что у вас все еще старый релиз, хотя код объектов уже новый. Чтобы этого избежать, необходимо использовать штатный механизм Конфигурация — Поддержка — Обновить конфигурацию.
Рассмотрим по шагам наиболее надежный способ обновления, который позволит синхронизировать хранилище и версию поставщика. Этот метод лучше всего выполнять в тестовой базе, предварительно подключенной к хранилищу.
Конфигурация — Хранилище конфигурации — Захватить в хранилище. В появившемся дереве метаданных необходимо захватить корень конфигурации и обязательно установить флаг «Захватывать рекурсивно». Это гарантирует, что все изменяемые объекты будут доступны для записи.Конфигурация — Поддержка — Обновить конфигурацию. Выбираем файл обновления (.cfu или .cf нужного релиза).F7 (Обновить конфигурацию базы данных). Запустите базу в режиме «Предприятие», согласитесь с легальностью обновления и дождитесь завершения всех обработок обновления данных в самом ЗУП (или другой конфигурации). Проверьте ключевые механизмы.Конфигурация — Хранилище конфигурации — Поместить в хранилище. Все измененные объекты и, что самое важное, новая версия конфигурации поставщика отправятся в хранилище.Когда в хранилище уже находится «чистая» и обновленная версия, процесс актуализации 10 (или любого другого количества) рабочих баз значительно упрощается. Разберем, как сделать это быстро:
Проанализируем ситуацию: нам больше не нужно запускать процедуру сравнения/объединения в каждой рабочей базе. Нам достаточно получить последние изменения из хранилища. Алгоритм действий следующий:
Конфигурация — Хранилище конфигурации — Получить последние данные из хранилища.F7. Система увидит изменения в структуре данных и обновит конфигурацию БД.Важный совет: Если вы администрируете большое количество баз, рассмотрите использование командной строки для автоматизации. Например, команда для обновления конфигурации базы данных из хранилища выглядит так:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /S "Server\BaseName" /N "Admin" /P "Pass" /ConfigurationRepositoryF "tcp://RepoServer/RepoName" /ConfigurationRepositoryN "RepoUser" /ConfigurationRepositoryP "RepoPass" /ConfigurationRepositoryUpdateCfg /UpdateDBCfg
Бывают случаи (как в сообщении 12), когда структура хранилища настолько запутана предыдущими некорректными действиями, что проще создать его заново. Посмотрим, как правильно пересоздать хранилище, не потеряв текущие наработки.
Разберем процесс «лечения» через пересоздание:
Конфигурация — Хранилище конфигурации — Отключиться от хранилища.Конфигурация — Хранилище конфигурации — Создать хранилище.Внимание: При пересоздании хранилища теряется история версий (кто и когда менял объекты). Если история критически важна, используйте только Метод 1 с захватом корня.
Выясним причину, по которой программисты боятся обновлений в хранилище. Главная проблема — Full Lock (полная блокировка). Когда вы захватываете корень рекурсивно, никто другой не может править код. Чтобы минимизировать это время, рекомендуем:
.cf со всеми изменениями.Сравнить и объединить с конфигурацией из файла, указав подготовленный .cf.Поддержка — Обновить конфигурацию (выбрав тот же релиз, что в .cf). Программа увидит, что объекты уже совпадают, и просто обновит «подложку» поставщика.Проанализировав вышеописанные подходы, мы видим, что ключ к успеху — это обязательный захват Корня конфигурации. Без этого действия версия поставщика в хранилище не изменится, сколько бы файлов .cf вы ни накатывали сверху.