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

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

При сопровождении нескольких информационных баз 1С нередко возникает необходимость настроить перенос данных за определенный период без изменения конфигураций поставщика и без создания постоянных планов обмена. Типичные примеры таких задач: сбор кассовых и банковских документов из филиальных баз «1С:Бухгалтерия предприятия» в единую базу казначейства, перенос в устаревшую «1С:Управление производственным предприятием» или выгрузка контура учета ГОЗ в отдельную базу-копию.

При этом перед разработчиком встают три ключевые проблемы:

  1. Как выполнить перенос без внедрения дополнительного программного кода в модули конфигураций (что часто требует «Конвертация данных 3.0»).
  2. Как защитить документы в базе-приемнике от случайной перезаписи при повторной выгрузке, если пользователи уже вручную скорректировали или провели их.
  3. Как сопоставить нормативно-справочную информацию (контрагентов, договоры, статьи затрат) и избежать дублирования элементов.

Разберем по шагам наиболее эффективные варианты решения этой задачи.

Вариант 1. Использование «Конвертации данных 2.0» и универсальной обработки XML

Если конфигурации-источники нельзя снимать с типовой поддержки или вносить изменения в метаданные, оптимальным инструментом остается конфигурация «Конвертация данных 2.0» (КД 2). В отличие от третьей версии, правила КД 2 полностью автономны: они выгружаются в один файл правил XML и исполняются типовой внешней обработкой V8Exchan8.epf («Универсальный обмен данными в формате XML»).

Рассмотрим общий порядок действий:

  1. Выгружаем описания метаданных конфигурации-источника и конфигурации-приемника с помощью обработки MD83Exp.epf.
  2. Загружаем описания метаданных в базу «Конвертация данных 2.0».
  3. Создаем правила конвертации объектов (ПКО) только для требуемых документов (например, ПлатежноеПоручение, ПоступлениеНаРасчетныйСчет, СписаниеСРасчетногоСчета, ПриходныйКассовыйОрдер, РасходныйКассовыйОрдер).
  4. Сохраняем правила в файл XML.
  5. В базе-источнике открываем обработку V8Exchan8.epf, указываем файл правил, на вкладке «Выгрузка данных» задаем период выгрузки и при необходимости накладываем отбор по организации. Выгружаем данные в файл данных XML.
  6. В базе-приемнике через ту же обработку загружаем сформированный файл.

Вариант 2. Защита существующих документов от перезаписи в базе-приемнике

Частая проблема периодических выгрузок без планов обмена заключается в отсутствии квитирования: если в источнике документ просто переоткрыли или перепровели, повторная выгрузка за период способна затереть изменения, внесенные бухгалтером в базе-приемнике. Чтобы этого избежать, настроим правила конвертации объектов в КД 2.

Проанализируем штатные возможности и программные обработчики:

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

Посмотрим на пример кода в обработчике события ПередЗаписьюОбъекта для ПКО документа в КД 2:


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

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


// Пример переноса даты документа в открытый период
ГраницаЗакрытогоПериода = НачалоМесяца(ТекущаяДата());

Если Объект.Дата < ГраницаЗакрытогоПериода Тогда
    Объект.Дата = ГраницаЗакрытогоПериода;
    Объект.Комментарий = Объект.Комментарий + " [Перенесен из закрытого периода при обмене]";
КонецЕсли;

Вариант 3. Исключение дублирования справочников и ручное сопоставление

Когда справочники (например, контрагенты или договоры) ведутся в приемнике вручную, автоматическое создание элементов по реквизитам источника гарантированно порождает дубли. Чтобы предотвратить нежелательное создание новых элементов при загрузке документов:

  1. В ПКО соответствующего справочника устанавливаем флаг «Не создавать новый объект в приемнике, если он не найден». В результате, если поиск по ИНН/КПП или наименованию не дал результатов, новый элемент создан не будет, а в реквизите документа останется пустая ссылка.
  2. Для реализации пользовательского сопоставления используем обработчик Поля поиска. В нем можно программно обратиться к типовому регистру сведений СоответствияОбъектовИнформационныхБаз (если конфигурация построена на БСП):

// Поиск соответствия в регистре БСП
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Соответствия.УникальныйИдентификаторПриемника КАК СсылкаПриемника
    |ИЗ
    |    РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК Соответствия
    |ГДЕ
    |    Соответствия.УникальныйИдентификаторИсточника = &УИДИсточника";
Запрос.УстановитьПараметр("УИДИсточника", Идентификатор);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СсылкаНаОбъект = Выборка.СсылкаПриемника;
    ПрекратитьПоиск = Истина;
КонецЕсли;

Вариант 4. Альтернативы без правил конвертации

Рассмотрим две типовые альтернативы, которые часто оказываются удобнее написания правил с нуля:

  1. Перенос между полностью идентичными конфигурациями («Выгрузка и загрузка данных XML»): Если перенос выполняется между одинаковыми релизами «1С:Бухгалтерии предприятия 3.0» (например, для выделения контура ГОЗ), целесообразно использовать внешнюю обработку ВыгрузкаЗагрузкаДанныхXML.epf. Она позволяет задать отбор по периоду и организации, сохраняет точные внутренние идентификаторы (GUID), не требует планов обмена и гарантирует идентичность структуры данных.
  2. Штатная синхронизация через универсальный формат (EnterpriseData): Если обе конфигурации работают на базе БСП, можно воспользоваться механизмом «Синхронизация через универсальный формат — Другая программа». При этом не обязательно держать обмен на постоянном расписании. Отключив регламентные задания, можно запускать синхронизацию вручную в интерактивном режиме: встроенный мастер предоставит удобный визуальный интерфейс для ручного сопоставления ненайденных контрагентов и номенклатуры, исключая появление дублей.
← На главную