Как отключить перезапись уже загруженных объектов при повторной синхронизации данных между 1С:УНФ 1.6 и 1С:БП 3.0?

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

При работе с двумя конфигурациями 1С, такими как 1С:Управление нашей фирмой (УНФ) и 1С:Бухгалтерия Предприятия (БП), синхронизация данных является критически важным процессом. Часто возникает вопрос, как избежать перезаписи объектов, которые уже были загружены в базу-приемник (БП 3.0) при последующих обменах, особенно если требуется “догрузить” данные за уже синхронизированный период. Давайте рассмотрим эту проблему подробнее и выясним, какие существуют решения.

Понимание стандартного механизма синхронизации

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

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

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

Рекомендуемый подход к ведению учета: Обычно, при использовании связки УНФ и БП, УНФ выступает в роли основной системы для оперативного и управленческого учета, а БП используется для формирования регламентированной бухгалтерской отчетности. При таком подходе, ввод первичных документов осуществляется в УНФ, а в БП загружаются уже обработанные данные, необходимые для бухгалтерии. Это помогает избежать дублирования информации и конфликтов.

Управление объемом и поведением синхронизируемых данных

Хотя прямого флажка «не перезаписывать уже загруженные объекты» в типовых настройках нет, существуют методы, позволяющие контролировать процесс синхронизации и косвенно влиять на перезапись:

1. Ограничение обмена по дате

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

  1. Дата начала обмена: Установив дату начала обмена, вы указываете системе, что нужно регистрировать к выгрузке только документы, созданные или измененные после этой даты. Документы, созданные ранее, не будут участвовать в обмене.
  2. Дата запрета загрузки (в базе-приемнике): В некоторых конфигурациях можно установить дату запрета загрузки данных. Документы, относящиеся к периоду до этой даты, не будут загружаться. Этот механизм часто используется после сдачи регламентированной отчетности, чтобы избежать изменений в уже закрытых периодах.

Анализируем ситуацию: При повторной синхронизации за уже синхронизированный период, установка новой «Даты начала обмена» может не сработать так, как вы ожидаете, если цель — исключить перезапись уже существующих объектов, но добавить новые за тот же период. Если вы просто сдвинете дату обмена вперед, новые документы за прошлый период не попадут в обмен. Если вы установите дату обмена назад, объекты, которые были изменены в УНФ с момента предыдущего обмена, будут перезаписаны в БП, что не соответствует вашему требованию. Для предотвращения повторной отправки лишних данных можно использовать обработку для отмены регистрации документов в плане обмена за выбранный период.

2. Ограничение по видам документов и НСИ

Настройки синхронизации позволяют гибко регулировать состав передаваемой информации:

  1. Выбор видов документов: Вы можете настроить, какие именно виды документов будут выгружаться из УНФ в БП (например, только приходные накладные, или только реализации). Это позволяет избежать передачи ненужной информации.
  2. Ограничение НСИ: Передача нормативно-справочной информации (НСИ) также может быть ограничена. Например, можно выгружать только ту НСИ, которая непосредственно используется в передаваемых документах.

3. Односторонний обмен

Если УНФ является единственным источником данных для БП, и из БП ничего не должно выгружаться обратно в УНФ, обязательно настройте односторонний обмен. В настройках синхронизации данных в 1С:БП установите переключатель на «Не отправлять» данные. Это предотвратит возможные конфликты и дублирование при попытке БП выгрузить свои данные.

4. Сопоставление данных и префиксы информационных баз

Одной из ключевых задач при настройке синхронизации является корректное сопоставление элементов в обеих базах. Это достигается путем использования уникальных ключевых реквизитов:

  1. Ключевые реквизиты: Для организаций — наименование, ИНН, КПП; для контрагентов — ИНН, КПП; для номенклатуры — код, наименование, артикул. Система сопоставляет объекты по этим данным.
  2. Префиксы ИБ: Критически важно установить префикс информационной базы при настройке синхронизации. Префикс (например, УНФ- для УНФ и БП- для БП) добавляется к номерам документов и кодам списков. Это позволяет создавать уникальную нумерацию объектов в каждой базе и помогает системе однозначно идентифицировать, из какой базы пришел тот или иной объект, предотвращая коллизии при сопоставлении.

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

Программное управление перезаписью объектов (Метод "Отладчика")

Форумное обсуждение справедливо указывает на то, что для специфических сценариев, когда требуется более тонкое управление, например, полное исключение перезаписи для определенных объектов, может потребоваться программная доработка. Упоминание «отладчика» намекает на необходимость вмешательства в стандартный механизм обмена данными.

Принципы программной доработки:

Для реализации задачи «догрузить без перезаписи» на программном уровне мы можем использовать возможности механизмов обмена данными, в частности, типовые подсистемы «Обмен данными» и «Конвертация данных 2.0».

  1. Модификация правил конвертации данных:

    Инструмент Конвертация данных 2.0 предоставляет широкие возможности для настройки правил обмена. В нем можно создавать и модифицировать правила конвертации объектов, которые определяют, как данные из одной конфигурации преобразуются для другой. В правилах конвертации объектов (ПКО) существуют события, которые мы можем перехватить:

    • ПередЗагрузкойОбъекта: Это событие происходит непосредственно перед попыткой загрузки объекта в базу-приемник. Здесь мы можем написать код, который проверяет наличие объекта в базе-приемнике.
    • ПриЗагрузкеОбъекта: Выполняется после загрузки объекта, но до его записи.

    Пример логики для события ПередЗагрузкойОбъекта в ПКО:

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

    1. Получить данные входящего объекта из источника.
    2. Попытаться найти соответствующий объект в базе-приемнике по ключевым реквизитам (например, по номеру, дате, виду документа и организации).
    3. Если объект найден и при этом не требуется его обновление (например, в УНФ не было существенных изменений), мы можем отменить загрузку текущего объекта.
    
    // Примерный код в событии "ПередЗагрузкойОбъекта" для ПравилаКонвертацииОбъекта "Документ.РеализацияТоваровУслуг"
    
    // Параметры:
    // ОбъектИсточник  - Объект, который загружается из файла
    // ОбъектПриемник - Объект, который будет создан или найден в базе-приемнике
    // Отказ         - Булево, если Истина, то загрузка объекта будет отменена
    
    // Допустим, мы хотим предотвратить перезапись, если документ с таким же номером и датой уже существует
    // и не помечен на удаление.
    
    Если ТипЗнч(ОбъектИсточник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
    
        // Попробуем найти существующий документ в базе-приемнике
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    РеализацияТоваровУслуг.Ссылка
            |ИЗ
            |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            |ГДЕ
            |    РеализацияТоваровУслуг.Номер = &Номер
            |    И РеализацияТоваровУслуг.Дата = &Дата
            |    И РеализацияТоваровУслуг.Организация = &Организация"; // Добавляем организацию для более точного поиска
    
        Запрос.УстановитьПараметр("Номер", ОбъектИсточник.Номер);
        Запрос.УстановитьПараметр("Дата", ОбъектИсточник.Дата);
        // Для параметра &Организация нужно будет найти соответствующую организацию в базе-приемнике.
        // Это можно сделать, используя дополнительные параметры конвертации или по ключевым реквизитам
        // объекта-организации, который уже был или будет сконвертирован.
        // В данном примере упростим, предполагая, что Организация уже сопоставлена.
        
        // Получаем организацию из входящего объекта и ищем ее в базе-приемнике.
        // Здесь требуется более сложная логика, т.к. ОбъектИсточник.Организация - это ссылка из базы-источника.
        // Нужно найти соответствующую ссылку в базе-приемнике.
        // Примерно так (это упрощение, без учета всех деталей конвертации ссылок):
        // ОрганизацияПриемник = НайтиСоответствиеСсылок(ОбъектИсточник.Организация); 
        // Запрос.УстановитьПараметр("Организация", ОрганизацияПриемник);
        
        // Для демонстрации предположим, что Организация уже корректно установлена в объекте-приемнике
        // или мы можем ее найти каким-то другим способом.
        // Если прямая ссылка недоступна, придется искать по ИНН/КПП.
        // Пусть ОрганизацияУНФ = ОбъектИсточник.Организация;
        // ОрганизацияБП = УправлениеОбменомДанными.НайтиОбъектПоКлючуОбъектаВДругойИБ(ОрганизацияУНФ);
        // Если ОрганизацияБП = Неопределено Тогда
        //     ОрганизацияБП = Константы.ОсновнаяОрганизация.Получить(); // Или другая логика поиска
        // КонецЕсли;
        // Запрос.УстановитьПараметр("Организация", ОрганизацияБП);
    
        // Более надежный способ получить объект "Организация" из Приемника для параметра
        // Мы знаем, что ОбъектПриемник (который еще не записан) уже имеет заполненное поле Организация.
        Если ОбъектПриемник.Свойство("Организация") Тогда
            Запрос.УстановитьПараметр("Организация", ОбъектПриемник.Организация);
        Иначе
            // Если поле Организация отсутствует или не заполнено, что маловероятно для документа
            Отказ = Истина; // Или обработать ошибку
            Возврат;
        КонецЕсли;
    
    
        Результат = Запрос.Выполнить().Выбрать();
    
        Если Результат.Следующий() Тогда
            // Документ с таким номером и датой уже существует в базе-приемнике.
            // Мы не хотим его перезаписывать, если он не был изменен в источнике.
            // Дополнительно можно сравнить какие-либо реквизиты, чтобы убедиться,
            // что это тот же самый объект и он не требует обновления.
            
            // Например, если в ОбъектеИсточник есть какой-то хэш или дата изменения,
            // можно сравнить их с существующим объектом в Приемнике.
            
            // В простейшем случае, если нашли по номеру/дате/организации, просто отменяем загрузку.
            Отказ = Истина; // Отменяем загрузку текущего объекта
            Сообщить("Документ " + ОбъектИсточник.Номер + " от " + ОбъектИсточник.Дата + " уже существует. Загрузка отменена.");
        КонецЕсли;
    КонецЕсли;
    

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

  2. Использование универсального обмена данными:

    Если требуется глубокое вмешательство, можно использовать универсальный обмен данными XML и самостоятельно модифицировать выгружаемый или загружаемый XML-файл. Однако этот путь значительно сложнее и требует детального понимания структуры обмена.

  3. Использование отладчика для анализа:

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

    • В модулях обмена данными, отвечающих за загрузку объектов (МенеджерОбменаДанными, ОбменДаннымиВызовСервера).
    • В обработчиках событий правил конвертации (если вы их уже модифицировали или хотите понять, как они работают).
    • В коде, который отвечает за поиск существующих объектов в базе-приемнике перед их загрузкой.

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

Важные моменты и рекомендации

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

  1. Создание резервных копий: Всегда делайте полные резервные копии обеих информационных баз (УНФ и БП) перед началом настройки или изменением правил обмена. Это позволит откатиться к исходному состоянию в случае возникновения непредвиденных проблем.
  2. Специфика переноса данных: Учитывайте, что не все документы из УНФ переносятся в БП. Например, документы управленческого учета, учета имущества, зарплаты, специфические операции («Приходная накладная» с видом операции «Возврат от переработчика») обычно не переносятся, так как они не имеют прямого отношения к регламентированному учету.
  3. Актуальность версий: Функционал синхронизации постоянно развивается. Убедитесь, что у вас установлены актуальные версии конфигураций УНФ и БП, а также платформы 1С:Предприятие. Новые версии могут содержать улучшения и новые настройки обмена.
  4. Тестовая среда: Всегда тестируйте новые настройки или доработки на тестовых копиях баз данных, прежде чем применять их на рабочих системах.

Таким образом, хотя прямого переключателя «отключить перезапись» нет, мы можем достичь желаемого результата путем комбинирования настроек ограничения по дате, выбора объектов для обмена и, при необходимости, программной доработки правил конвертации данных. Последний подход требует знаний в области программирования 1С и работы с Конвертацией данных, но предоставляет максимальную гибкость.

← На главную