Более подробная инструкция по использованию обаботки
ExImDocs.ertВступление.
Эта обработка была задумана для разовой односторонней переброски информации между базами 1С с разной конфигурацией. Основным требованием к ней была простота изготовления.
Обработка вот уже почти год (на 06.2001) находится в стадии отладки, но все еще не всегда работает. Однако, как и год назад, будет совершенно неверным утверждать, что она всегда не работает.
Изначально я собирался использовать ее только для компоненты "Оперативный учет", но потом решил добавить и перенос ручных операций. Но только для одинакового плана счетов. Так по крайней мере подсказывает практика, - для переноса проводок между разными планами счетов всегда требуется учитывать массу дополнительных условий. Для простого это слишком сложно.
Краткое содержание.
Ниже будут перечислены несколько общих вопросов, возникающих при обмене данными в 1С и пояснено, как с ними обходится обработка.
Затем будет описан общий принцип работы.
Потом будет детально рассмотрена диалоговая форма.
Вопросы
.При переносе информации особенно часто возникают следующие проблемы.
1) Синхронизация данных.
Тут все просто. Справочники - по коду. Если код уникален в пределах подчинения, то по полному коду. Если нет кода (длина кода в конфигураторе равна 0), то по наименованию. Документы и ручные операции - по дате и номеру. Если при загрузке находится "синхронизованный" элемент, то он обновляется, изменяются загружаемые реквизиты, у документов с многострочной частью предварительно удаляются строки.
2) Несовместимость данных.
Скажем, превышена длина кода или многоуровневость справочника, или длина номера документа. В этом случае мы сразу отказываемся работать, пока конфигурации не будут приведены в соответствие. С периодом уникальности номеров документов поступаем менее строго. Если будет загружаться поток документов, скажем с одним и тем же номером и одной и той же даты, то никаких сообщений выдано не будет, просто в базе останется самый последний документ из потока, (каждый следующий будет записываться поверх предыдущего и уцелеет только последний).
3) Взаимные (перекрестные) ссылки.
Реквизит может иметь значение, которого еще нет в базе. Например - накладная ссылается на счет-фактуру, а та еще не загружена, не вычитана из файла данных. Или имеется ссылка друг на друга в двух элементах какого-либо справочника... Эта задача никак не решалась. Просто надо несколько раз подряд загрузить данные, "размножаться" они не будут, а взаимные ссылки потихоньку заполнятся.
4) Рекурсивность.
Например, мы перебрасываем документы, а в них есть валюта, а у валюты есть история курса... Хотелось бы просто указать, что хотим перенести документ. А все остальное обработка поймет сама. Этого, увы, нет. Т.е. надо указать, что мы хотим перенести документ такого-то вида, а кроме того, хотим перенести справочник валют... При этом валюты будут выгружены все, а не только задействованные в документах.
5) Фильтрация.
Например, мы перебрасываем документы только общего и финансового учета... Или элементы какой-то определенной группы справочника. Какие-то фильтры в этой обработке есть, но только при выгрузке.
Хочу еще раз повторить - задача ежедневного переноса данных не ставилась, а потому - никакой оптимизации не проводится, коллизии не разрешаются, актуальность данных не отслеживается...
Правда, на свой страх и риск применять ее в этом режиме все-таки возможно, я специально сделал особый случай фильтра на реквизит типа "дата", но об этом ниже, там, где про фильтры будет написано.
Принцип работы
.В одной базе (доноре) мы производим выгрузку данных. Для этого указываем, какие виды документов и справочников (и какие именно их реквизиты) мы хотим перебросить и за какой период. Для справочников период имеет смысл, если речь идет о периодических реквизитах.
Далее производим выгрузку, т.е. формируем файл с данными,
в этом файле с данными помимо собственно данных, хранится еще и их структура.В базе, куда производится загрузка (в базе-акцепторе) мы сначала загружаем структуру из файла данных и "анализируем" ее, т.е каждому структурному элементу указываем соответствующий в нашей конфигурации. Таким образом получается таблица соответствия, в одной колонке которой описан структурный элемент в базе-доноре, а в другой - соответствующий ему структурный элемент в базе-акцепторе.
Обработка берет какое-нибудь данное, например, реквизит "курс" справочника "Валюта
" и пытается понять, что с ним делать. Для этого она ищет в первой колонке строку "Справочник.Валюта.Курс". Если не находит, то ничего не делает. Если находит, то смотрит, что ему соответствует. Например, ему соответствует пустая строчка. Тогда она тоже ничего не делает.А вот если ему будет соответствовать строка "Справочник.Валюты.Текущ_Курс", то становится понятно, - элементу справочника "Валюты" надо установить реквизит "Текущ_Курс" таким же, каким был в базе-донора реквизит "Курс" справочника "Валюта"...Вот собственно и все.
Диалоговая форма
Теперь о том, как все это осуществить.
Во первых, прочитав этот текст, или часть его, можно нажать на кнопку "пример" и посмотреть, что при этом произойдет. (Ничего плохого не должно). Обработка попросит указать "скорость процессора" (в "единицах" Р200, Р400...). Чем больше указать, тем дольше будет длиться попытка показа кнопок.
Правее "примера" находится несколько очень важных кнопок, первая, с вопросом, попытается открыть местную почтовую программу и предложит что-нибудь нам написать. Следующая - попробует напустить браузер на нашу домашнюю страничку и, наконец, третья, самая главная, без лишних вопросов закроет форму.
Слева, если нажата галочка выгрузка, видна кнопка "Эксп", а если галочка "выгрузка" не нажата, то видна другая кнопка. "Имп". О них я еще расскажу. Пока же зажжем галочку "выгрузка".
Но, - вернемся наверх. Четыре стандартные кнопки нам вряд ли понадобятся, "Открыть настройку","Сохранить настройку" - им сохранять почти нечего, а описания и подсказки - убоги. Но все равно, ткнем в одну из них и укажем режим "сохранять автоматически". Это почти всегда полезно.
Тепперь посмотрим в центр. Там - здоровая таблица значений, с 4-мя колонками.
"Рек" - здесь находится описание реквизита
"М" - для служебного пользования.
"Фильтр" - для фильтрующего значения
"М1" - практически не используется, только иногда.
Сейчас она (таблица) нам нужна для того, чтобы указать, что мы хотим выгрузить.
Указание происходит просто - в колонке "Рек" надо поместить описание реквизита. Над таблицей находится длинный и густой ряд кнопок, сейчас нам, для дальнейшего объяснения, необходимо нажать левую, "инит".
Таблица должна заполниться строчками вроде
"Справочник.Валюта.Код"
"Справочник.Валюта.Курс"
Строка "Справочник.Валюта.Код" означает, что надо выгрузить сам элемент типа "справочник", вида "валюта". "Справочник.Валюта.Курс" означает, что из его реквизитов нас интересует курс. Если мы просто укажем "Справочник.Валюта.Курс", т.е. что надо переносить курс валют, а строку "Справочник.Валюта.Код" выбросим, то это будет неправильно. Таким образом, строки "Справочник.Валюта.Код" и "Справочник.Валюта.Наименование", т.е. строки с такими обязательными реквизитами справочника, как код и наименование, являются более важными, чем строки с остальными реквизитами, они несут дополнительную информацию. О том, что надо не только перенести код или наименование, но надо создать соответствующий элемент справочника! Т.е. в каком-то смысле они являются "служебными", что и отражено буквой "С" в колонке "М".
Аналогично для документов, - служебными являются строки с реквизитами "НомерДок" и "ДатаДок".
Двойным щелчком левой кнопки мыши по таблице или нажатием
= кнопка "=" - мы можем редактировать данную строку. Например, вместо строки "Справочник.Валюта.Код" можно подобрать из открывшегося списка строку "Документ.Заказ.НомерДок".
В большой конфигурации после нажатия кнопки "инит" получится довольно много строчек, без дополнительного инструмента возиться с ними пришлось бы довольно долго. Но кое-какой инструмент все-таки есть. Это следующие кнопки.
У - кнопка "У" - она удаляет тип данных, на котором находится курсор. Если стоим на справочнике, то будут удалены все справочники. Если на документе - все документы. (Имеются в виду, конечно, не документы и справочники в нашей базе данных, а лишь изображения их структуры в таблице).
-- - кнопка "--" - удаляет вид документа или справочника, на котором находится курсор. Т.е. стоим на строке "Справочник.Валюта.Курс", после нажатия не останется никакого упоминания о справочнике
"Валюта".- - кнопка "-" - удаляет текущую строку.
! - кнопка "!" - оставляет только данный вид документа или справочника.
+ - кнопка "+" - добавляет строку и открывает для выбора список с метаданными. Позиционирование в списке устроено так, что подбирая несколько реквизитов подряд мы каждый раз оказываемся на последнем выбранном, что немного облегчает задачу, но удобнее, безусловно, пользоваться кнопкой "++", а лишние строки потом удалить.
++ - кнопка "++" - добавляет вид документа или справочника, т.е. сразу набор строк, перечисляющий все реквизиты выбранного документа или справочника.
(Замечание. После первого нажатия любой из вышеперечисленных кнопо отклик будет немного замедлен, т.к. именно в этот момент происходит инициализация метаданных, т.е подготавливается тот самый список, из которого потом мы будем подбирать строки для таблицы.)
Кнопки "кон" и "авс" производят некоторое упорядочивание в таблице. Вторая - по алфавиту, это если и нужно, то только для удобства. А первая - по некоторому принципу подчиненности, собственно не важно как, важно, что такое упорядочивание все равно будет сделано автоматически, непосредственно перед выгрузкой данных в файл. Оно, конечное упорядочивание, обеспечивает выгрузку справочников-владельцев раньше, чем подчиненных им справочников. В принципе, нам самим ей пользоваться совсем не нужно.
Дальше видна еще галочка "проводить", которая относится к загрузке, потому сейчас неинтересна, две даты для выбора периода - это, наверное, понятно и кнопка "0". Однако, этот "0" - это отдельная история, связанная с фильтрами, скажу о ней чуть ниже, а то мы совсем запутаемся.
Так что сразу обратимся к верхнему ряду кнопок формы.
Они объеденены в три рамки. "настройка", "см. данные" и "данные". Для выгрузки нам сейчас больше всего нужна "настройка".
В рамке "настройка" находится поле для ввода имени файла настройки таблицы выгрузки. Указать файл можно с помощью кнопки "..." справа от поля.
Пользоваться так - указали имя файла, набрали таблицу, орудуя различными кнопками, нажали "сх", таблица при этом запишется в файла настройки, - и можно закрыть обработку и заняться чем-нибудь еще. Потом, снова открыв форму и указав имя файла настройки таблицы выгрузки, мы нажимаем кнопку "вс". И таблица восстановится из файла настройки. Таким образом можно изготовить множество настроек на разные случаи жизни.
Почти все с выгрузкой, уже можно нажимать "Эксп", осталось только указать имя файла данных - в поле рамки "данные".
Выгрузив, можно посмотреть, что получилось. Это предлагается сделать одним из 3-х способов. Либо нажать на кнопку "тз" рамки "см. данные", тогда dbf-файл данных будет зачитываться в некую таблицу, после чего будет показан. Либо нажав "тхт", тогда данные будут заноситься в текстовый файл, после чего он будет показан. Либо, наконец, самый правильный способ, но он предполагает наличие програмы для работы с файлами формата dbf - dbu.exe.
Однако вернемся к фильтрам.
Фильтры.
Фильтр устанавливается по одному на любой реквизит. Если задано несколько фильтров, то они действуют по по принципу "и". Для реквизита типа "дата" можно задать значение фильтра "не ранее", подразумевается, что не ранее даты начала периода.
Значение фильтра устанавливается либо кликом левой кнопки мыши в колонку "фильтр", либо через "помощник фильтра", поле ввода внизу, под колонкой "фильтр". Помощником я его назвал потому, что иногда он помогает. Скажем, я хочу установить фильтр по какой-то группе справочника, для этого я должен либо указать код этого справочника, ткнувшись в колонку "фильтр", наименование при этом проставится автоматически,
(хотя это и не нужно, а может и не проставится, не помню). Либо просто ткнуть в поле-помощник фильтра, он посмотрит, на какой строке таблицы у нас курсор и просто выдаст для подбора соответствующий справочник или другой тип данных. Причем в первом случае у нас будет отфильтрован именно данный элемент-группа, выполнением условия фильтра вовсе не будет считается принадлежность к этой группе. Для установки условия вхождения группу надо подбирать "помощником". При этом в поле М1 будет надпись "гр".Если фильтр устанавливается на реквизит шапки документа, то документ с неправильным значением реквизита не образуется.
Если фильтр ставится на реквизит табличной части документа, то строка с неправильным значением реквизита не образуется.
Именно помощником устанавливается для дат значение фильтра "не ранее". Для этого случая придуман специальный совет.
Совет.
Если Вы собираетесь регулярно перебрасывать информацию из базы в базу, то полезно завести у всех справочников реквизит "ДатаПоследнегоИзменения", а в процедурах ПриЗаписи() и ПриПереносеЭлементаВДругуюГруппу(,) устанавливать его значение равным рабочей дате. Тогда можно с пользой пользоваться значением фильтра "Не раньше".
Пожалуй все и про фильтр. Осталось только заметить, что фильтр заметно замедляет выгрузку, но его можно отключить, а точнее, не включать. Для этого достаточно не нажимать галку "фильтровать при выгрузке".
Нет, про фильтр не все.Вдруг пришлось столкнуться лично с этим гадким фильтром. Оказывается, я его сделал только для справочников. А оказалось, что нужен он для документов. Пришлось доделывать.
Итак - 27/04/2002 - Добавлена возможность на
условие фильтра по дате "не раньше" для
реквизитов документов.
В сочетании с рекурсивной выгрузкой это может
служить уже примлемым вариантом для постоянного
обмена между
базами. постараюсь пояснить:
Заводим реквизит. который при записи документа ставит текущую дату. Т.е. при каждом обновлении содержимого документа эта дата должна передвинуться. Что это дает? А то, что при выгрузке документов можно вообще не думать о справочниках, указав галку "рекурсивно", период тоже поставить от "минус бесконечности" до "плюс" ее, а в фильтре указать дату, такую что, все документы, измененные после нее должны попасть в выгрузку.
Приходится признать, счто для
документов изменены правила фильтра - теперь это
не попадание в период, а нахождение не ранее
указанной даты. Демо-пакетная обработка снабжена
функцией корректировки файла настройки выгрузки,
т.е. указанную дату несложно
изменить сразу для всех реквизитов с заданным
именем.
Для пакетного режима - теперь
обработка возвращает таблицу значений с
объектами, которые она загрузила,
чем можно воспользоваться для дальнейшей "постзагрузочной
обработки". (Фраза вырвана из контекста, но
пригодится).
И мы как-то забыли о кнопке "0". Кнопка "0"
стирает значение фильтра. Т.е выключает его.
Переходим в базу-акцептор. Открываем обработку, указываем имя файла данных и нажимаем кнопку "вс", что чуть левее
. При этом погаснет галочкуа "выгрузка". А если мы не будем восстанавливать структуру из файла данных, а восстановим ее из файла настройки таблицы, то погасить галочку надо будет руками.При этом левая половина таблицы соответствия заполнится структурой, выгруженной из базы-донора.
Осталось только установить соответствие и произвести загрузку. Больше у нас нет практически никаких возможностей влиять на процесс. Можно, правда, нажать галочку "проводить", это приведет к попытке проведения свежезагруженных документов... Даты ни на что не влияют. Загружается та информация, которая передана в файле данных.
Итак, осталось установить соответствие реквизитов. Для этого можно нажать кнопку "анал", при этом все совпадающие по полному названию объекты метаданных найдут свое место в таблице;
Если конфигурации одинаковы, то на этом работа по установке соответствия будет закончена, т.к. все ясно и так. Если конфигурации разные, то придется вдумчиво подбирать то, что вы хотите "отождествить". В конце концов работа будет закончена.
Однако мы еще можем удалить часть строчек, уменьшая, таким образом, объем загружаемой информации. Скажем, если мы удалим строку
"Справочник.Валюта.Курс" "Справочник.Валюты.Текущ_Курс",
а строку
"Справочник.Валюта.Код
" "Справочник.Валюты.Код"оставим, то курс грузиться не будет, хотя сам справочника будет создан, а вот если и строку
"Справочник.Валюта.Код
" "Справочник.Валюты.Код"удалить, то справочник с валютами будет проигнорирован.
Осталось только нажать
"Имп".Ах да, еще заполнитель реквизитов. Ну тут совсем просто - нажимаем галочку "проставка реквизитов" и, примерно так же, как мы устанавливали значение фильтра
, подбираем значение, которое надо проставить.Периодические реквизиты устанавливаются на конечную дату, ту, которая справа, ("по"
)Важное отличие - увидев пустое поле обработка обнулит значение реквизита. Т.е. перед тем, как запустить проставку, надо внимательно изучить таблицу, не осталось ли там лишних строчек.
Коды и наименования она не трогает.
Ну и самое главное - перед загрузкой или проставкой реквизитов всегда необходимо создавать резервную копию!!!