Как правильно сопоставить "Виды цен" с разными Уникальными Идентификаторами (ГУИД) при обмене между 1С:Розница 2.2 и 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Торговля и дистрибуция
← На главную

При обмене данными между различными конфигурациями 1С, такими как 1С:Розница 2.2 и 1С:Бухгалтерия 3.0, часто возникают ситуации, когда логически одинаковые объекты, например "Виды цен", имеют разные Уникальные Идентификаторы (ГУИД) в базах источника и приемника. Это создает трудности при сопоставлении данных, поскольку стандартный механизм обмена в первую очередь ищет объекты по ГУИД. В этой статье мы подробно рассмотрим, как решить эту проблему, обеспечив корректную синхронизацию "Видов цен" и других ссылочных объектов, даже если их ГУИДы не совпадают.

Представим ситуацию: в базе "Розница" существует "Вид цен" с наименованием "Розничная" и своим ГУИДом. В базе "Бухгалтерия" также есть "Вид цен" с наименованием "Розничная", но с другим ГУИДом. Наша задача — настроить обмен так, чтобы при выгрузке данных из "Розницы" в "Бухгалтерию" система корректно сопоставила "Розничную" цену из источника с уже существующей "Розничной" ценой в приемнике, а не создавала новый дублирующий элемент или не ссылалась на неверный объект.

Понимание природы Уникального Идентификатора (ГУИД) в 1С

Первое и самое важное, что необходимо понять, — это природа Уникального Идентификатора (ГУИД) в системе 1С. ГУИД является фундаментальным, неизменным свойством любого ссылочного объекта базы данных (справочника, документа, плана видов характеристик и т.д.).

Невозможность прямого изменения ГУИД существующего объекта. Мы должны осознать, что ГУИД объекта не может быть изменен после его создания. Это постоянный, внутренний идентификатор, который система использует для уникальной идентификации элемента в пределах базы данных. Если мы попытаемся вручную или программно изменить ГУИД у существующего объекта, система не позволит это сделать. Единственный способ получить объект с новым или желаемым ГУИДом — это удалить старый объект и создать новый, при этом указав нужный ГУИД в момент создания. Однако такой подход чреват потерей всех связей и ссылок на старый объект, что редко является приемлемым решением в работающей системе.

Таким образом, идея "изменить УникальныйИдентификатор" в приемнике, чтобы он совпал с источником, является ошибочной в отношении существующего объекта. Вместо этого, нам нужно научить систему обмена правильно искать и сопоставлять объекты, используя другие критерии, если ГУИДы не совпадают.

Настройка правил поиска объектов в "Конвертации данных"

Основным инструментом для настройки гибкого обмена данными в 1С является конфигурация "Конвертация данных" (КД). Именно в правилах конвертации объектов (ПКО) мы можем задать альтернативные механизмы поиска объектов в базе-приемнике. Разберем этот процесс по шагам.

Шаг 1: Открытие Правил Конвертации Объектов (ПКО)

  1. Откройте конфигурацию "Конвертация данных".
  2. Загрузите правила обмена, которые используются для синхронизации между "Розницей" и "Бухгалтерией". Обычно это файл с расширением *.xml.
  3. Найдите и откройте Правило Конвертации Объектов (ПКО) для объекта, который нас интересует, в данном случае, это справочник "Виды цен номенклатуры" (или аналогичный, в зависимости от конфигураций).

Шаг 2: Настройка Полей Поиска

В открытом ПКО перейдите на вкладку "Поля поиска". Это ключевой раздел, где мы определяем, как система будет искать соответствующий объект в базе-приемнике.

  1. Добавление полей для поиска. Мы можем указать, по каким реквизитам, помимо ГУИД, система должна искать объект. В случае "Видов цен", наиболее логичными и надежными полями для поиска являются "Наименование" и, возможно, "Код".
  2. Нажмите кнопку "Добавить" и выберите реквизит Наименование объекта-приемника. Убедитесь, что для этого поля указан флажок "Источником является текущий объект" или что соответствующий реквизит источника правильно сопоставлен.
  3. Повторите шаг для реквизита Код, если вы хотите использовать его как дополнительный критерий поиска.

Шаг 3: Активация комбинированного поиска

Самый важный пункт в настройке "Полей поиска" — это флажок "Продолжить поиск по полям поиска, если по идентификатору объект-приемник не найден". Установите этот флажок.

Как это работает:

  1. Система обмена сначала попытается найти объект в базе-приемнике по его Уникальному Идентификатору (ГУИД). Если такой ГУИД найден, объект считается сопоставленным.
  2. Если объект по ГУИД не найден (что и происходит в нашей ситуации с разными ГУИДами для логически одинаковых "Видов цен"), система не создаст новый объект автоматически. Вместо этого она перейдет к следующему шагу.
  3. Система попытается найти объект в базе-приемнике по тем полям, которые мы указали в разделе "Поля поиска" (например, по Наименованию).
  4. Если объект найден по наименованию (или коду), то система сопоставит его с объектом-источником. Это означает, что все изменения из источника будут применены к этому уже существующему объекту в приемнике, и новый объект не будет создан.
  5. Если объект не найден ни по ГУИД, ни по заданным полям поиска, только тогда система создаст новый объект в базе-приемнике, присвоив ему ГУИД из базы-источника.

Пример настройки кода в правилах конвертации (схематично):

Хотя в "Конвертации данных" это настраивается через интерфейс, а не прямым кодом в обработчике, для понимания мы можем представить логику так, как если бы мы писали код в правиле выгрузки свойства:


// В правиле выгрузки свойства, например, "ВидЦены"
// Вместо прямого присвоения ГУИД, мы полагаемся на настроенные правила поиска в ПКО
Если Источник.ТипЦен.Наименование = "Розничная" Тогда
    // Если в ПКО для "Видов цен" настроен поиск по наименованию,
    // система сама найдет или создаст нужный объект в приемнике
    Значение = Источник.ТипЦен; 
Иначе
    Значение = Источник.ТипЦен;
КонецЕсли;

Обратите внимание, что строка Значение = Приемник.ВидЦен ("Розница"), предложенная в сообщении, сама по себе не решает проблему сопоставления по ГУИД. Эта конструкция лишь пытается получить ссылку на вид цен с наименованием "Розница" в базе-приемнике. Если таких видов цен несколько или система не может однозначно его идентифицировать, либо если логика поиска в правилах обмена не настроена на поиск по наименованию, это может не дать желаемого результата или привести к ошибкам. Для надежного сопоставления необходимо именно настроить "Поля поиска" в "Конвертации данных".

Использование стандартного обмена и сопоставления данных

Помимо тонкой настройки в "Конвертации данных", стандартные механизмы обмена между типовыми конфигурациями 1С часто предоставляют упрощенные инструменты для сопоставления. При первой настройке обмена между "1С:Розницей" и "1С:Бухгалтерией" система обычно предлагает этап "Сопоставление данных". В этом окне пользователи могут вручную или автоматически сопоставить одноименные, но разно-ГУИДные объекты, такие как "Виды цен". Мы рекомендуем внимательно пройти этот этап при первоначальной настройке обмена.

Также мы можем использовать обработку "Универсальный обмен данными в формате XML". Эта обработка позволяет выгружать и загружать данные, используя настроенные нами правила конвертации. Если в сообщении 10 упоминается, что "нельзя менять в конфиге XML планы обмена со стороны Розницы", это может означать, что нельзя изменять файлы обмена, которые входят в поставку конфигурации. Однако, создавать собственные, внешние правила обмена (файлы КД) и использовать их через "Универсальный обмен данными в формате XML" обычно возможно и является стандартной практикой для решения таких задач.

Альтернативные и продвинутые методы сопоставления

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

Метод "Схлопывания" дублей (Поиск и удаление дублей)

Этот метод, упомянутый в сообщениях, является своего рода обходным путем и может быть полезен в определенных ситуациях. Мы рассмотрим его по шагам:

  1. Перенос нужного вида цен из "Розницы" в "Бухгалтерию". Выполните обмен данными, при котором "Вид цен" из "Розницы" будет выгружен в "Бухгалтерию". Поскольку ГУИД в "Бухгалтерии" для аналогичного вида цен отличается, и если у вас не настроены поля поиска, система, скорее всего, создаст новый элемент "Вид цен" в "Бухгалтерии" с ГУИДом из "Розницы". В итоге в "Бухгалтерии" окажутся два "Вида цен" с одинаковым наименованием, но разными ГУИДами.
  2. Использование обработки "Поиск и удаление дублей". В "Бухгалтерии" откройте стандартную обработку "Поиск и удаление дублей" (обычно находится в разделе "Администрирование" или "НСИ и администрирование").
  3. Настройте поиск. Выберите справочник "Виды цен номенклатуры" и настройте поиск дублей по полю "Наименование".
  4. "Схлопните" дубли. Обработка покажет вам оба "Вида цен" с одинаковым наименованием. Мы должны выбрать один из них как "оригинал", который будет сохранен, а второй — как "дубль", который будет помечен на удаление. В нашем случае, если нам нужен именно ГУИД из "Розницы", мы выберем новоприбывший элемент как "оригинал". Система автоматически заменит все ссылки на "дубль" ссылками на "оригинал".

Преимущества: Этот метод позволяет "передать" ГУИД из одной базы в другую, если нам нужно, чтобы конкретный ГУИД стал основным. Все ссылки на старый объект в приемнике будут переведены на новый. Недостатки: Это ручная или полуавтоматическая операция, которая требует внимания и может быть длительной для большого количества дублей. Также она не подходит для постоянной синхронизации, а скорее для разовой "очистки" данных.

Создание нового объекта с заданным ГУИД при его отсутствии

Хотя изменить ГУИД существующего объекта невозможно, мы можем управлять ГУИДом при создании нового объекта. Этот метод является наиболее сложным и требует глубоких знаний "Конвертации данных", включая работу с обработчиками событий ПКО.

  1. Выгрузка ГУИД из источника. В ПКО для "Видов цен" мы можем добавить свойство "УникальныйИдентификатор" и настроить его выгрузку из источника в параметр, который будет доступен в обработчиках в приемнике.
  2. Обработчик события "ПередЗаписью" или "ПриПоискеПоИдентификатору" в ПКО. В обработчике мы можем реализовать логику, которая сначала попытается найти объект по переданному ГУИД. Если объект не найден, а объект-приемник еще не создан (то есть, это первый этап создания нового элемента), мы можем программно установить его ГУИД, используя переданное значение.

// Пример логики в обработчике "При загрузке" в ПКО (очень упрощенно и концептуально)
// Для реального использования требуется более сложная логика в "Конвертации данных"
// Например, в событии "ПередЗагрузкойДанных" или "ПриПоискеПоИдентификатору"
// если новый объект создается:
Если ОбъектПриемника.ЭтоНовый() Тогда
    // Предполагаем, что ГУИД из источника передан через параметр или свойство
    Если Параметры.Содержит("ГУИДИсточника") Тогда
        ОбъектПриемника.УникальныйИдентификатор = Параметры.ГУИДИсточника;
    КонецЕсли;
КонецЕсли;

Преимущества: Позволяет создать новый объект в приемнике с точно таким же ГУИДом, как в источнике, что может быть критично для определенных сценариев (например, при переносе специфических метаданных). Недостатки: Высокая сложность реализации, требует очень внимательного тестирования. Не рекомендуется без крайней необходимости и глубокого понимания механизма обмена.

Общие рекомендации при работе с обменами данными

Независимо от выбранного метода сопоставления ГУИДов, мы настоятельно рекомендуем придерживаться следующих практик:

  1. Создание резервных копий. Перед выполнением любых изменений в правилах обмена или перед началом синхронизации данных, особенно если это первое сопоставление или вы используете продвинутые методы, крайне важно создать полные резервные копии обеих информационных баз. Это поможет избежать потери данных в случае некорректной настройки или ошибок.
  2. Тестирование на копии базы. Всегда тестируйте новые или измененные правила обмена на тестовых копиях баз данных, прежде чем применять их на рабочих системах.
  3. Мониторинг журнала регистрации и синхронизации. После выполнения обмена внимательно изучайте "Журнал регистрации" в обеих базах, а также "Монитор синхронизации данных" (если он доступен в вашей конфигурации). Это поможет выявить возможные ошибки, предупреждения или некорректно сопоставленные объекты.
  4. Документирование изменений. Фиксируйте все изменения, внесенные в правила обмена, чтобы в будущем понимать логику работы и упростить поддержку системы.

Таким образом, проблема сопоставления "Видов цен" с разными ГУИДами при обмене между 1С:Розница 2.2 и 1С:Бухгалтерия 3.0 эффективно решается не путем изменения ГУИДа (что невозможно), а путем гибкой настройки правил поиска в "Конвертации данных" по другим атрибутам, таким как наименование, или с помощью обработки "Поиск и удаление дублей" для разового "схлопывания". Мы должны выбирать метод, исходя из сложности задачи и требований к автоматизации процесса.

← На главную