В процессе разработки и поддержки систем на платформе 1С:Предприятие 8 программисты регулярно сталкиваются с необходимостью переноса изменений между различными базами. Стандартная операция «Сравнение и объединение конфигураций» по умолчанию настроена на «мягкое» слияние: она добавляет новые объекты и обновляет существующие, но игнорирует те элементы, которые присутствуют в основной конфигурации, но отсутствуют во внешнем файле (.cf или .cfe). В этой статье мы подробно разберем, как заставить систему удалять лишние реквизиты, разберемся в тонкостях идентификации объектов и выясним риски, связанные с этими операциями.
Рассмотрим стандартную ситуацию: у нас есть рабочая база и файл обновления. В рабочей базе существует реквизит СтарыйДолг, который мы решили упразднить, и в файле обновления его уже нет. Однако после выполнения сравнения и объединения мы с удивлением обнаруживаем, что СтарыйДолг никуда не исчез. Это происходит потому, что идеология механизма объединения в 1С направлена на сохранение данных. Система считает, что если в источнике объекта нет, а у вас он есть — значит, это ваша уникальная доработка, которую нельзя удалять без явного указания.
Чтобы система предложила удалить объект, которого нет в файле-источнике, нам необходимо изменить правила объединения. Разберем этот процесс по шагам:
Проанализируем ситуацию: теперь, если мы нажмем кнопку «Выполнить», система физически удалит метаданные выбранных реквизитов из конфигурации. Важно помнить: само по себе объединение не удаляет данные из таблиц SQL. Это произойдет только на следующем шаге — при обновлении конфигурации базы данных (клавиша F7).
Выясним причину, почему иногда даже при одинаковых названиях система пытается создать новый объект и удалить старый. В 1С каждый объект метаданных (справочник, документ, реквизит) имеет скрытый внутренний идентификатор — UUID (или GUID).
Рассмотрим два сценария:
Склады в одной базе и справочник с таким же именем в другой, их UUID будут разными. Для системы 1С это абсолютно разные объекты.В такой ситуации при объединении система предложит удалить ваш справочник и создать новый из файла. Чтобы избежать этого, в окне сравнения нужно воспользоваться функцией «Сопоставить объекты вручную». Мы выбираем объект слева и справа, нажимаем «Сопоставить», и теперь система понимает, что это одна и та же сущность, несмотря на разные внутренние идентификаторы.
Если перед нами стоит задача сделать конфигурацию базы полностью идентичной файлу .cf, то вместо «Сравнения и объединения» лучше использовать операцию «Загрузить конфигурацию из файла». Для выборочного переноса конкретных объектов между базами также можно использовать обработку для ручной выгрузки и загрузки конфигурации.
Посмотрим на отличия этого метода:
Внимание: используйте этот метод только в том случае, если в вашей базе нет никаких уникальных доработок, которые отсутствуют в .cf файле, иначе вы их безвозвратно потеряете.
Когда конфигурация большая (например, ERP или УПП), искать один отсутствующий реквизит среди тысяч объектов очень сложно. Проанализируем возможности фильтрации:
В окне сравнения есть кнопка «Фильтр». Мы рекомендуем установить следующие настройки для поиска объектов на удаление:
После этого в дереве останутся только те элементы, которых нет в источнике. Это позволяет точечно принять решение по каждому реквизиту: нужно ли его удалять или оставить как специфическую доработку текущей базы.
Если мы выполняем обновление типовой конфигурации через «Поддержку», система включает режим трехстороннего сравнения. В нем участвуют:
В этом режиме 1С видит историю изменений. Если реквизит был удален поставщиком (он был в старой версии, но его нет в новой), система сама предложит его удалить, понимая, что это не ваша ошибка, а штатное изменение архитектуры. В этом случае флажки удаления часто выставляются автоматически, но их всегда стоит перепроверить.
Удаление реквизита в метаданных — это критическая операция. Разберем основные риски:
НомерТелефона были записаны данные клиентов, после удаления реквизита и обновления базы данных (F7) эти данные будут стерты из SQL-таблицы навсегда.Перед тем как приступать к объединению с удалением, обязательно выполните следующие действия:
// 1. Сделайте архивную копию базы (.dt или средствами SQL)
// 2. Проверьте наличие данных в удаляемых полях через запрос
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ Справочник.Контрагенты ГДЕ УдаляемыйРеквизит ЕСТЬ НЕ NULL";
Подводя итог, можно сказать, что механизм удаления при объединении требует осознанного подхода. Используйте настройки «Действия» для массового управления объектами, не забывайте про ручное сопоставление по UUID и всегда проверяйте фильтром, что именно система собирается отправить «под нож».