Как захватить в хранилище конфигурации 1С только нужные для обновления объекты?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При совместной разработке в 1С разработчики часто сталкиваются с ситуацией, когда необходимо накатить доработки из стороннего файла конфигурации (.cf) или обновить релиз поставщика, но конфигурация подключена к хранилищу. В окне сравнения и объединения отсутствует прямая кнопка «Захватить все измененные объекты», а попытка выполнить объединение без предварительного захвата приводит к ошибкам или блокировке редактирования. Разберем архитектурные особенности механизма хранилища 1С и эффективные практические сценарии захвата объектов перед объединением.

Почему платформа 1С требует обязательного предварительного захвата

Проанализируем архитектуру работы хранилища конфигурации 1С. В основе механизма лежит модель пессимистических блокировок (Pessimistic Locking). Платформа запрещает локальное изменение структуры метаданных и программных модулей, если за объектом в хранилище не зафиксирован статус захвата текущим пользователем.

Окно сравнения и объединения строит дерево различий на основе слепка метаданных, загруженного в память в момент открытия инструмента. Если бы захват происходил непосредственно из окна сравнения после анализа, возникал бы риск конфликта: за время анализа другой разработчик мог изменить и поместить объект в хранилище. В таком случае локальная версия становилась бы неактуальной, а автоматическое объединение привело бы к потере чужих правок. По этой причине захват должен выполняться до или во время синхронизации структуры.

Вариант 1. Захват корня конфигурации целиком

Рассмотрим сценарий полного обновления типовой конфигурации поставщика через меню Конфигурация — Поддержка — Обновить конфигурацию или при масштабном накатывании релиза.

При обновлении конфигурации поставщика платформа модифицирует не только основную конфигурацию, но и служебные таблицы конфигурации поставщика в базе хранилища. Для этого обязательно требуется захват корня конфигурации.

  1. Откроем дерево метаданных и вызовем контекстное меню на самом верхнем корневом элементе конфигурации.
  2. Выберем команду Хранилище конфигурации — Захватить в хранилище....
  3. В открывшемся окне установим флаг Захватывать рекурсивно и нажмем Выполнить.
  4. Выполним штатную процедуру обновления или объединения.
  5. После завершения объединения и проверки работоспособности поместим изменения обратно в хранилище.

Важно: рекурсивный захват корня полностью блокирует разработку для всей команды. Используем этот подход только во время регламентных окон обновления, когда другие программисты не ведут активную разработку в хранилище.

Вариант 2. Выборочный захват объектов с сохранением настроек объединения

Разберем ситуацию, когда из файла .cf требуется перенести только определенный список доработок, не блокируя всю конфигурацию для коллег.

Если список объектов заранее неизвестен, выполним предварительное сравнение и воспользуемся механизмом сохранения настроек объединения:

  1. Откроем меню Конфигурация — Сравнить, объединить с конфигурацией из файла... и выберем файл с изменениями.
  2. В открывшемся окне сравнения настроим соответствия, отметим флажками нужные объекты и модули.
  3. В командной панели окна сравнения откроем меню Действия и выберем пункт Сохранить настройки объединения (файл с расширением .mrgsettings).
  4. Сформируем отчет о сравнении конфигураций или зафиксируем список объектов, которые будут изменяться.
  5. Закроем окно сравнения.
  6. В дереве метаданных найдем требуемые объекты, выделим их (можно использовать пункт меню Конфигурация — Хранилище конфигурации — Захватить объекты в хранилище... с фильтрами) и выполним захват.
  7. Если добавляются новые объекты метаданных, выполним захват корня конфигурации без рекурсии (сняв флаг рекурсивного захвата).
  8. Снова откроем окно Сравнить, объединить с конфигурацией из файла....
  9. В меню Действия выберем Загрузить настройки объединения и укажем сохраненный ранее файл. Все флаги и правила объединения восстановятся автоматически.
  10. Нажмем кнопку Выполнить и применим изменения к захваченным объектам.

Вариант 3. Обновление через отдельную локальную базу

Проанализируем наиболее надежный подход для крупных проектов с высокой интенсивностью разработки. Чтобы не занимать хранилище долгим процессом ручного трехстороннего сравнения и разрешения конфликтов, используем промежуточную базу:

  1. Выгрузим текущую конфигурацию из базы, подключенной к хранилищу, в файл .cf.
  2. Загрузим этот файл в пустую локальную информационную базу (без подключения к хранилищу).
  3. В локальной базе спокойно выполним сравнение, объединение, разрешение конфликтов в модулях и первичное тестирование функционала.
  4. Выгрузим итоговую объединенную конфигурацию в новый файл .cf.
  5. В рабочей базе, подключенной к хранилищу, захватим только измененные объекты (или корень рекурсивно на минимальное время).
  6. Выполним объединение с подготовленным и проверенным файлом и сразу же поместим изменения в хранилище.

Такой подход сокращает время удержания захваченных объектов в хранилище с нескольких часов до нескольких минут, что исключает простои других участников команды разработки.

Вариант 4. Пакетная автоматизация захвата объектов

Если обновление выполняется по заранее известному списку метаданных, рассмотрим возможность пакетного захвата через командную строку запуска конфигуратора. Платформа 1С поддерживает специальные параметры для управления хранилищем:

  1. Для пакетного захвата перечня объектов используем параметр /ConfigurationRepositoryLock:
    
    "C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\Bases\MyBase" /N "Admin" /P "Pass" /ConfigurationRepositoryF "D:\Repository" /ConfigurationRepositoryN "Admin" /ConfigurationRepositoryP "RepoPass" /ConfigurationRepositoryLock -objects "Справочник.Номенклатура Документ.РеализацияТоваровУслуг"
    
  2. Для обновления локальной конфигурации из хранилища после освобождения объектов используем параметр /ConfigurationRepositoryUpdateCfg:
    
    "C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\Bases\MyBase" /N "Admin" /P "Pass" /ConfigurationRepositoryF "D:\Repository" /ConfigurationRepositoryN "Admin" /ConfigurationRepositoryP "RepoPass" /ConfigurationRepositoryUpdateCfg
    

С помощью пакетных скриптов можно автоматизировать рутинные действия по захвату и освобождению метаданных при регулярных интеграциях.

← На главную