Нередко на практике возникает задача разделения контуров учета: в исходной базе 1С:Бухгалтерия предприятия ведется как официальный, так и управленческий учет с использованием дополнительных организаций и нетиповых механизмов, а для контролирующих органов требуется регулярно формировать абсолютно чистую копию базы на типовой конфигурации. При этом важно избежать постоянной доработки правил обмена при каждом обновлении конфигурации и исключить попадание лишних данных.
Рассмотрим, как решить эту проблему, какие механизмы платформы «1С:Предприятие 8» использовать и на какие архитектурные нюансы следует обратить внимание при реализации обмена.
Проанализируем основные требования и препятствия, возникающие при реализации такого сценария:
Разберем вариант, который позволяет обойтись минимальным объемом кода и не требует переписывания правил при каждом обновлении. В основе подхода лежит использование механизмов регистрации изменений платформы «1С:Предприятие 8» совместно с сериализацией данных в XML.
Выделим ключевые компоненты этой схемы:
Полный) или создается собственный нераспределенный план обмена, в состав которого включаются только типовые объекты. Это позволяет платформе автоматически регистрировать номера сообщений и измененные ссылки в системных таблицах регистрации изменений.ВыбратьИзменения(). В процессе выборки программно проверяется принадлежность объекта к разрешенной организации.СериализаторXDTO или ФабрикаXDTO) и передаются в базу-приемник через общую папку, FTP или веб-сервис.Посмотрим на пример процедуры формирования файла обмена в базе-источнике с фильтрацией по организации и контролем регистрации:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаВыгрузки);
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
Данные = ВыборкаИзменений.Получить();
// Проверяем принадлежность объекта к разрешенным организациям
НужноВыгружать = Истина;
Если Метаданные.Документы.Содержит(Данные.Метаданные()) ИЛИ Метаданные.Справочники.Содержит(Данные.Метаданные()) Тогда
Если Данные.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
Если Данные.Организация = ФиктивнаяОрганизация Тогда
НужноВыгружать = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если НужноВыгружать Тогда
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
Иначе
// Пропускаем объект без передачи в сообщение
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Данные);
КонецЕсли;
КонецЦикла;
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Рассмотрим важные технические нюансы, с которыми можно столкнуться при реализации механизма:
ФабрикаXDTO добавит их в XML. При десериализации в чистой типовой базе возникнет ошибка разбора структуры данных. Чтобы избежать этого, нетиповой функционал рекомендуется выносить в расширения конфигурации (CFE) или предварительно очищать XDTO-пакет от расширенных свойств перед записью.ЛюбаяСсылка или субконто на счетах бухгалтерского учета могут содержать ссылки на нетиповые справочники. Попадание таких значений в типовую базу приведет к появлению объектов вида «Объект не найден». Рекомендуется выполнять проверку ссылочных типов перед выгрузкой и заменять нетиповые значения на Неопределено или пустые ссылки типовых типов.Проанализируем другие доступные способы реализации поставленной задачи:
СинхронизацияДанныхЧерезУниверсальныйФормат. Данный механизм поддерживается фирмой «1С» при обновлениях, позволяет штатно наложить фильтр по организациям и обеспечивает совместимость даже при частичном несовпадении версий конфигураций.