Инструмент обмена данными между БД с идентичными конфигурациями (OLE)


Обработка поможет вам сделать обмен данными, а потом проверить идентичность баз, сравнив их.
Обработка не требует изменения конфигурации и является универсальной (т.е. подходит для любой конфигурации).
За основу этой обработки взята обработка "Универсальный OLE-перенос объектов между БД с идентичными конфигурациями" (wolfsoft) http://www.1partner.nnov.ru http://avprog.ru/projects/1120/
Добавлено:
1. Возможность сравнить объекты двух баз при помощью OLE с последующим выводом отчета с информацией о том, какие реквизиты не идентичны.
2. Отчет после выгрузки, обо всех изменениях сделанных в базе приемнике (создан новый объект, изменено значение реквизита с ... на ..., проведен, удален и т.д.)
3. Выгрузка только измененных объектов.
4. ...

Инструмент обмена данными между БД с идентичными конфигурациями (OLE)

За основу к написанию этой обработки взята обработка "Универсальный OLE-перенос объектов между БД с идентичными конфигурациями" (wolfsoft) www.1partner.nnov.ru и www.avprog.ru/projects/1120/.
Рекомендуется почитать описание этой обработки по указанному адресу или в прилагаемом файле. Заслуга автора оригинальной обработки не только в том, что она качественно и быстро переносит данные, но и в понятном, грамотно написанном коде, взяв за основу который, можно легко написать свою, что собственно и сделано.
Некоторые изменения оригинальной обработки:
Добавлена возможность сравнить объекты базы источника и базы приемника:
Результаты выводятся в виде таблицы, где перечислены объекты с разницей в реквизитах, а также значения этих реквизитов в базе источнике и в базе приемнике.
Прямо из таблицы о результатах сравнения можно производить действия над объектами базы приемника: провести/сделать не проведенным, удалить/снять пометку удаления или перенести из базы источника.
При сравнении документов, проверяется также существование в базе приемнике документов, которых нет на заданную дату в базе источнике.
 Выгрузка объектов
Выгружаются не все объекты подряд, а только те которых либо нет в базе приемнике, либо реквизиты не соответствуют реквизитам этого же объекта в базе источнике. Все идентичные объекты остаются нетронутыми.
После выгрузки Вашему вниманию предстает отчет обо всех изменениях, сделанных в базе приемнике (выгруженных новых объектах, измененных уже существующих, объектах сделанных не проведенными, удаленными, перепроведенными и т.д.) с указанием что именно изменилось (какой реквизит поменялся, как поменялось состояние документа (проведен, не проведен).
Настройки:
Возможность загружать схему при открытии и подключать приемник при открытии. Для этого надо поставить соответствующие галочки на закладке "настройка", указать файл с схемой и прописать параметры подключения базы приемника. Далее надо сохранить настройку (в смысле на панели инструментов обработки).
Есть возможность проводить документы после выгрузки только в определенном периоде. Полезно, например, при выгрузке большого числа новых документов, которые потом можно будет провести со сдвигом ТА.
Изменен интерфейс
Возможность выгрузки объектов после заполнения таблицы объектов (кнопка "+++ с выгрузкой"). А также возможность выгрузки объектов без заполнения таблицы.
Возможность заполнения таблицы элементами справочника с фильтром по родителю, по владельцу, по группе владельцев.
Другие изменения.

Методология обмена данными

Мне понадобилось произвести обмен данными для синхронизации свернутой базы с рабочей. Пока я сворачивал базу пользователи активно работали. В результате, хотя я и просил их делать как можно меньше изменений задним числом и менять/создавать справочники, без этого не обошлось. Отличия данных в базах оказалось достаточно велико.
Создавались/изменялись новые ТМЦ (а их всего около 10 000), новые цены (на каждый ТМЦ около 20 цен и значение цена — периодический элемент, который очень часто меняется) и многие другие справочники. Также оказалось, что достаточно много документов изменялись задним числом, переносились на другие даты, кроме того было создано много новых документов (1000 документов в день, примерно). И все это теперь надо перенести в свернутую базу, как можно более качественно и быстро.
Настроим обработку:
Прописать параметры подключение к приемнику (путь, пользователь, пароль). Путь к базе приемника должен быть без пробелов (!).
Указать имя файла для сохранения схемы переноса.
На закладке «Настройка» - нажать на «Загрузить структуру».
Просмотреть в таблице ниже правила обмена. Проверить/изменить ключи для справочников. Ключом справочника может быть любой реквизит с установленным флажком «Сортировка», а также Код и Наименование.
Проверить уникальность ключей нажав на соответствующую кнопку. Проверка происходит только в той базе, в которой она запускается. То есть в базе приемника необходимо тоже открыть обработку и проверить уникальность. Для правильной работы базы необходимо, чтобы все ключи во всех справочниках обеих баз были уникальны.
 Нажать на «сохранить схему переноса» и установить флажки на «Загрузить схему при открытии» и «Подключить приемник при открытии». Так мы избавимся от лишних действий при открытии/закрытии обработки.
Если новых документов придется переносить много и их проведение займет много времени, то рекомендую установить период новых документов.
Установить флажки «Проводить/"распроводить" только старые», «Помечать на удаление непроведенные только новые». При этом, те документы которые попадают в период новых не будут проводится и делаться непроведенными после выгрузки. При установленном флажке «Помечать на удаление непроведенные только новые» будут помечаться на удаление только те документы, которые попадают в период новых и не проведены в базе источнике. Таким образом после выгрузки можно будет быстро провести все не помеченные документы за период новых документов со сдвигом ТА. Если период новых документов не указан, значит действия флажков распространяются на все документы.
Установим флажок «Не показывать сообщения об изменениях удаленных» что позволяет убрать из отчета сообщения обо все изменениях помеченных на удаление объектов. Причем если произошла ошибка при обработке помеченного на удаление объекта, то такое сообщение все равно войдет в отчет. Также войдут в отчет сообщения об установке пометки на удаления.
На панели инструментов обработки сохраняем настройку с установленным флажком «Использовать при открытии».
На закладке «Выгрузка» подключить приемник.
Выгрузка документов за период свертки минус несколько дней.
На закладке «Выгрузка» установить период переноса документов и период переноса периодических реквизитов справочников. Не обязательно указывать обе границы периода.
Вид документа — выбрать - <> и нажать «+++ с выгрузкой». Можно нажать просто «+++», а потом «Выгрузить». Тогда есть возможность указать какие именно мы хотим выгружать документы, а какие нет. Учтите, что после выгрузки таблица с документами не очищается. Это надо делать вручную (кнопка ХХХ).
Выгрузка объекта:
Документы в базе приемнике ищутся по номеру в том периоде нумератора, в котором находится документ в базе источника. Если у документа отключен контроль уникальности номера, то программа предполагает, что может быть только один помеченный на удаление и один не помеченный на удаление документы с одинаковыми номерами.
Справочники ищутся по ключу заданному в схеме переноса.
Если документ не найден, то создается новый, если найден, то обработка начинает перебор всех реквизитов на предмет различий в них.
Если дата документа в базе приемнике отличается от даты в базе источнике, то документ в базе приемнике делается не проведенным и изменяется дата и время этого документа. Далее если документ попадает в период действия флажка «Проводить/”распроводить” документы», то этот документ проведется.
Если объект ссылается на документ, справочник или операцию, то производится выгрузка значения этого реквизита. Получаем рекурсию. Еще в оригинальной обработке была встроена защита от «бесконечной» рекурсии. Потенциально существует опасность бесконечной рекурсии только в случае, если значение ключа элемента справочника замыкается на этот же элемент (в последующих версиях попробую устранить эту проблему).
Имейте ввиду, что при выгрузке в вашей базе могут быть выгружены даже документы годичной давности, даже если они не попадают в период выгрузки. Это происходит, если есть какая-то прямая или косвенная ссылка на них с тех объектов, которые вы хотите выгрузить. Однако если объекты одинаковы в обеих базах, то никаких действий над ними производится не будет, что значительно ускоряет обмен данными.
После каждой выгрузки просматривайте отчет о выгрузке на предмет наличия красных строк. Так отмечаются действия, которые не удалось выполнить. Такие сообщения выводятся в табло.
Сравнение документов - с помощью закладки «сравнение» можно убедится, что все данные перенеслись правильно и исправить, в случае если это не так.
Выбор объектов для сравнения производится аналогично как и на закладке «Выгрузка».
После нажатия кнопки «Сравнить» появляется отчет с результатами. Колонка «состояние» отражает состояние объекта в базе источника и в базе приемнике. Галочка — документ проведен, крестик — объект помечен на удаление, пустая ячейка — объект записан.
Можно перенести выборочный объект в базу приемник прямо из отчета по нажатию на кнопку «Перенести в приемник». При этом вам будет предоставлен отчет о сделанных изменениях, но в отчет о сравнении не обновится (!).
Перенос справочников
Сравнение справочников.
Сравнение итогов по регистрам и/или бух. счетам.

Общие замечания по эксплуатации обработки
Перенос значений тип «число». Поскольку перенос значений построен посредством ole есть следующие ограничение: переносятся только 15 цифр в числе не считая знака (+/-) и дробной точки. Остальные числа после запятой обрезаются. Причем 1.87 может передать 1.86999999999999. В обработке сравнение происходит с учетом этого.
При подключении базы приемника обработка может надолго «зависнуть» выкинув окно «Подключиться/Повторить». В большинстве случаев надо просто подождать. OLE сервер автоматически начал реиндексацию базы приемника. После окончания (когда винчестера перестанут шуметь и лампочки на блоке мигать) можно нажать одну из этих кнопок.
Не следует сразу же после выгрузки/сравнении выходить из обработки. Практика показала, что некоторое время (1 мин.) надо подождать. Если выйти сразу сразу — база приемника часто требует реиндексации. Возможно это только у меня.
Иногда появляется ошибка в табло “err“ «Неизвестная ошибка» в строке, где используется какой-либо метод ole объекта. Причина появления ошибки так и осталась невыясненной. Возможно это из-за использования большого числа внешних компонент. В таком случае можно повторить выгрузку, если не поможет — выйти из обработки и 1С и вновь попробовать выгрузку.
!!! Общие замечания по функциональности программы !!!
В этом разделе буду перечислять все недостатки обработки, которые надеюсь будут выявлены и со временем ликвидированы.
В отчетах о сравнении и выгрузке значения агрегатных типов данных приемника выводятся просто как ”OLE”.[1.31.1.6]
При сравнении документов, проверка существования в базе приемнике документов отсутствующих в базе источнике проводится строго на дату документа в базе приемнике.[1.31.1.2]
При сравнении справочников не проверяется присутствие в базе приемнике элементов, отсутствующих в базе источнике, а также лишних значений периодических реквизитов в базе приемнике.[1.31.1.6]
Если в базе приемника в периодическом реквизите на некоторую дату есть значение введенное вручную и значение введенное документом, то, значение введенное вручную не будет найдено. [1.31.1.6]
При установленном флажке «Проводить документы» результаты проведения не попадают в отчет о выгрузке, а только выводятся в окне сообщений.[1.31.1.4]
Потенциально существует опасность бесконечной рекурсии при переборе реквизитов справочников только в случае, если значение ключа элемента справочника замыкается на этот же элемент (в последующих версиях попробую устранить эту проблему).
Возможен случай, если при записи объекта происходит ошибка и объект не будет записан. В этом случае в отчет о выгрузке сообщение об ошибке не попадет. (Чтобы исключить данную ситуацию необходимо дополнительно после обмена производить сравнение баз).
История
[1.31.1.2]    08.05.2009
!!! Не переносилась время документов как новых, так и найденных в приемнике при установленном флажке «Только необходимое».
!!! Не удалялись лишние строки документов и проводки операций в базе приемнике, которых нет в базе источнике
*** При включенном флажке «Проводить документы» обработка делает непровденные в базе источнике документы такими же и в базе приемнике.
*** При сравнении документов, проверка существования в базе приемнике документов отсутствующих в базе источнике проводится в периоде нумератора.
[1.31.1.3]    08.05.2009
*** Изменен алгоритм вывода отчета о выгрузке. Отчет стал более понятным и наглядным.
[1.31.1.4]
+++ Добавлен флажок на закладку «Настройка» - «Помечать на удаление не проведенные». При выгрузке позволяет пометить на удаление в базе приемнике те документы которые в базе источнике не проведены. Полезно при отключенном флажке - «Проводить документы», чтобы потом не запутаться, какие  надо проводить, а какие нет.
!!! Иногда не переносились реквизиты типа «Счет». Исправлено.
*** Удален флажок «Только необходимые». Теперь в любом случае переносится будут только измененные объекты.
+++ Добавлен реквизит «Период новых документов». Документы с этой даты включительно считаются новыми. При установленном флажке «проводить документы» будут проводится только старые документы. При установленном флажке «Удалять не проведенные», будут удалятся только старые документы.
*** Если в документе был изменен какой-то реквизит, то документ будет перепроведен (если он попадает под действие флажка «Проводить документы»).
***Документы перепроводятся, не в конце обмена данными, а сразу после перенесения каждого документа.
!!! В отчет о выгрузке строки с реквизитами объекта, могли быть как ниже, так и выше строки с наименованием объекта. Исправлено.
*** Проведенные документы, у которых была изменена дата и/или время, больше не будут оставаться после этого изменения непроведнными (если они попадают по действие флажка «Проводить документы»).
*** Если документ в ходе выгрузки был проведен, перепроведен (после замены некоторых реквизитов), сделан не проведенным, удален или восстановлен, то результат этого будет показан в отчете о выгрузке. Причем, если строка выделена красным, то действие не было произведено.
*** Изменено описание.
[1.31.1.5] 13.05.09
!!! При установленном флажке «Помечать на удаление непроведенные новые» старые документы не помечались на удаление/не отменялись с удаления вообще. Исправлено.
!!! В некоторых случаях не переносились реквизиты типа «Счет».
[1.31.1.6] 22.05.09
+++ Периодические реквизиты справочников полностью синхронизируются (т.е. Из базы приемника удаляются значения на даты, которых нет в базе источнике и добавляются те, которых нет в базе приемнике). При этом учитывается также, что на одну дату могут присутствовать значение введенное вручную и несколько значений введенные документами.
+++ В отчетах агрегатные объекты из базы приемника выводятся не как ”OLE”, а в виде [владелец] наименование — для справочников и ВидДокумента НомерДокумента ДатаДокумента для документов.
!!! При выборе ключа справочника на закладке «Настройка» можно было выбрать реквизит без флага «сортировка», что вызовет ошибку при сравнении или выгрузке.
*** Убрал все лишние сообщения из табло. Теперь в табло сообщений будет появляться только сообщения об ошибках.
*** Изменено описание.
*** Много других мелких изменений и исправлений ошибок.
[1.31.1.7] 20.05.2010
+++ Если у документа нет контроля уникальности номера, то обработка подразумевает, что с одинаковыми номерами может быть только два документа — один помеченный на удаление и один не помеченный. т. е. В это случае поиск документа в базе приемнике идет не только по номеру и периоду нумератора, но и по пометки удаления.
+++ Флажок «Не сообщать об изменениях в удаленных». При установленном флажке не показывает сообщения об изменениях помеченных на удаление объектов. Сообщения об ошибках, а так же об установке пометки на удаление показываться будут.
!!! В случае если ключ справочника = код. Существует возможность, что код будет равен «» и тогда, если в реквизите объекта источника, стоит такой элемент, а в реквизите объекта приемника этот элемент не выбран (Пустое значение), то возникала ошибка и обработка останавливалась. Ошибка устранена.
+++ Сделана возможность проверить уникальность выбранных ключей. Для правильной работы обработки необходимо, чтобы все справочники в обеих базах были уникальны по ключам.
Благодарности
1. Wolfsoft - 

-