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