(C) Осипов Сергей Александрович, Москва 2003 год
Оглавление
Введение
Теоретические предпосылки
Настройки
Интерфейс
Параметры обмена
Выгружать
Алгоритмы этапов работы
FAQ и примеры
Нужно выгрузить только накладные с определенным номером
Описание импорта из XLS/MXL.
Дополнительные сведения и рекомендации.
Приложения.
Лицензия.
Введение
Обработка предназначена для обмена данными (справочниками и документами) между базами 1С, с одинаковыми или разными конфигурациями. Для обмена используется универсальный формат XML с очень простой структурой, что позволяет передавать данные для 1С практически из любого источника данных.
По умолчанию поддерживаются следующие источники: документы Excel, MXL-таблицы.
Для указания правил обмена используются конфигурационные файлы (также на XML). Настройки очень гибкие и позволяют отфильтровать выгружаемые и загружаемые объекты по каждому виду объектов, без изменения кода обработки.
Обработка может быть применена для решения широкого спектра задач:
- Периодический обмен информацией в распределенных системах (замена УРБД).
- Выгрузка проводок из торговли в бухгалтерию и другие подобные обмены.
- Генерация документов в других базах по документам в исходной.
- Восстановление данных из резервных копий за 1-2 дня.
- Начальное заполнение данными при переносе справочников в другую конфигурацию (через импорт из Экселя).
- Автоматическая забивка однотипных рутинных данных с помощью импорта из Экселя.
Теоретические предпосылки
Для хранения данных во внешнем XML-файле используется простая, логичная и удобная структура.
Файл состоит из набора объектов–узлов Objects, хранящихся в узле Object.
Каждый объект содержит уникальный в пределах файла идентификатор (ID) и список свойств.
Каждое свойство имеет значение и тип.
Типы бывают следующими:
- Простые типы – число, строка, дата (Num, Str, Dat).
- Агрегатные типы – ссылка на другой объект в пределах файла, тип Agr.
- Группы – объединяют несколько свойств в одно, тип Group.
- Списки – содержат упорядоченный список свойств, тип List.
Такая структура позволяет описать любые данные. Пример структуры вы можете посмотреть в прилагающемся файле Struct.xml.
Для вычисления уникальных идентификаторов каждого объекта в 1С используется функция ЗначениеВСтрокуВнутр().
Для выгружаемых объектов выгружаются значения всех полей (выгрузка по значению). Состав полей можно регулировать фильтром. Если значение объекта представляет собой также объект, то выгружается также и этот объект в сокращенном виде (выгрузка по ссылке), чтобы потом его можно было найти в базе-приемнике.
- Для справочников при выгрузке по значению выгружается все реквизиты и история периодических реквизитов, а по ссылке – только значения всех реквизитов. Периодические реквизиты в обоих случаях выгружаются по значению на рабочую дату.
- Для документов при выгрузке по значению выгружается все реквизиты шапки и табличная часть, а по ссылке – только всех реквизитов шапки.
- Реквизиты-объекты объектов, выгружаемых по ссылке, также выгружаются по ссылке. Поэтому даже один выгружаемый документ может повлечь за собой большое количество ссылок.
- Состав выгружаемых реквизитов для ссылки может корректироваться. Например, если у товара есть уникальный код, то для ссылки достаточно этого кода, остальные реквизиты для экономии места можно отключить.
На этапе выгрузки пользователь обработки указывает виды объектов для выгрузки и фильтры, чтобы выгружались только нужные ему объекты. В результате получается XML-файл.
Этот файл можно в дальнейшем конвертировать конвертором (стандартным или собственной разработки), а можно и без конвертирования передать на загрузку. Конвертор представляет собой ert-обработку, которая может использовать набор функций работы с XML (смотрите приложение «ФункцииКонвертора.TXT»).
На этапе загрузки важно указать правила сопоставления объектов. Правила сопоставления очень мощные, это изюминка обработки. Для объекта можно использовать сразу несколько правил и если одно не подходит, искать другим способом, а также делать проверку сопоставления. Можно также отфильтровать загружаемые объекты, защитить от записи некоторые объекты.
Загрузка строится из двух этапов – поиска (сопоставления объектов) и, собственно, загрузки. Поиск никаким образом не меняет данные, с его помощью можно оценить качество указанных вами правил поиска.
По умолчанию правила загрузки настроены таким образом, что из списка загрузки выбираются объекты переданные по значению, объекты переданные по ссылке не изменяются, но если объект по ссылке не найден он заводится как новый и ему присваиваются все указанные в выгрузке значения свойств. Эти правила можно изменить.
Результаты выгрузки и загрузки отражаются в протоколе.
Настройки
В отличие от первого поколения, где основные настройки делались в коде обработки, настройки указываются интерактивно пользователем в таблице и их можно сохранять/загружать в различных файлах (смотрие скриншот формы, он может частично не соответствовать оригиналу, т.к. форма постоянно дорабатывается, но общий принцип соблюден).
Существуют множество опций, уточняющих поведение программы при выгрузке-загрузке.
Для начала работы с конфигурацией нужно нажать кнопку «Заполнить», которая заполняет таблицу присутствующими в конфигурации видами объектов
В главной форме на закладке «Настройки» можно устанавливать параметры для каждого объекта по отдельности или сразу нескольким выбранным объектам.
Сначала нужно выбрать параметр из списка слева (щелкнуть дважды мышью или нажать на нем кнопку Enter).
Если устанавливается значение для одного объекта, нужно щелкнуть мышью в колонк.
Затем нужно выбрать объекты, и далее нажать одну из кнопок установки параметров. Если дважды щелкнуть на ячейке таблицы, также можно установить параметры, но только для текущего вида.
Интерфейс
Обработка может запускаться в автоматическом режиме, без участия пользователя. В случае работы с пользователем команды управления сосредоточены на закладке «Файл». Здесь указаны пути к файлам загрузки, выгрузки, к обработке конвертора.
- Кнопки «Запомнить/Восстановить» используются для сохранения/восстановления настроек.
- Кнопка «Выгрузить» запускает выгрузку.
- Кнопка «Поиск» запускает поиск.
- Кнопка «Загрузить» запускает загрузку. Загрузку можно запускать только после поиска.
- Кнопка «Конвертировать» запускает конвертор из файла выгрузки в файл загрузки.
- Кнопка «См» и «Печать» напротив надписи «Объекты» показывает и распечатывает текущее состояние таблицы Объекты (например для проверки результатов поиска) запускает выгрузку.
Параметры обмена
Обработка может быть весьма гибко настроена с помощью правил обмена, заполняемых пользователем.
В таблице приведены параметры, использующиеся при выгрузке и загрузке.
Параметр – название правила.
Варианты значения – варианты значений параметра. Если указан вариант «Условие», то можно указывать любое условие, которое будет вычисляться прежде, чем применится правило. Так как условия записываются на языке 1С, то они могут использовать следующие переменные и функции:
- Об – текущий объект
- НомОб – номер объекта в таблице Объекты
- Св – название свойства
- Ссылка – текущее значение ссылки, его можно изменить с помощью вызова УстСсылка(Зн)
- Зн – значение свойства
- Подч – элемент справочника, подчиненного данному
- УстДок – 1, если периодический реквизит установлен документом, 0 – вручную
- ДатаНачала, ДатаКонца – период выгрузки
- РабочаяДата() – рабочая дата
Кроме того, можно использовать специальные функции:
- УстСсылка(Зн) – устанавливает новое значение ссылки
- ВзятьПуть() – возвращает путь вида «Системные/Главные/Наименование».
- ПоискПоНаименованию()
- ПоискПоКоду()
- ПоискПоПолям(П1,П2,П3, ….)
- ПоискПоНомеру()
- ЛогНе(Зн) – инвертирует значение, возвращает из не-нуля ноль, из ноля единицу
- УстПериодНачДата() - устанавливает дату начала выгрузки периодических реквизитов (по умолч. ДатаНачала)
- УстПериодКонДата() - устанавливает дату конца выгрузки периодических реквизитов (по умолч. ДатаКонца)
- МодЗн(Зн)
- МодСв(Свойство)
- МодЕще(Свойство,Зн)
Однако не всегда параметры и специальные функции имеют смысл, поэтому в таблице указано, какие из них можно использовать в каждом правиле.
Кроме этого, практически везде можно использовать дополнительные функции, код которых написан в обработке:
- ИмяВСпр(Имя,Вид) – возвращает элемент справочника Вид с наименованием Имя.
- КодВСпр(Имя,Вид) – возвращает элемент справочника Вид с кодом Имя.
- ВидОбъекта(Об) – возвращает вид элемента Об или «», если вида нет или значение пустое.
Правила записи условий:
При записи условий можно использовать операторы и функции 1С, т.к. для вычисления условий используется мощная встроенная функция 1С – Шаблон.
Результатом вычисления выражения должно быть число, которое при равенстве нулю интерпретируется как ложь, в остальных случаях, как истина. Например:
:1=1 Истина :1=0 Ложь 1*0*1*(1+1) Ложь (аналог операции И) 1+1+1+0 Истина (аналог операции ИЛИ)
Если вы хотите записывать простые условия ,которые дают не числовое, а логическое значение, в привычном для вас виде, то в начале условия ставьте знак «:», например :Об.Код=«00076». Такое условие автоматически заменится на ?(Об.Код==«00076»,1,0).
При вычислении условий может происходить побочный эффект, например устанавливаться некоторые переменные, поэтому важен порядок и состав вычисляемых выражений.
Можно указывать порядок непосредственно с помощью функции 1С ?(Условие, ЕслиИстина, ЕслиЛожь).
Общее правило такое – если результат выражения число, то можно его просто так записать в условии, а если результат – логическое значение, то надо начать его с двоеточия.
Правила загрузки |
|||
Правило |
Варианты значений |
Описание |
Прим |
Поиск |
Условие |
Правило сопоставления объектов. Параметры: нет Функции:
В случае поиска по полям корректно обрабатывается сравнение агрегатных типов, т.е. например для Единиц правило может быть таким: Правила можно комбинировать, например: {ЛогНе(ПоискПоПолям(«Артикул»)){ЛогНе(ПоискПоНаименованию()){ПоискПоКоду():}}} |
|
ОбЗагр |
Правило |
Условие загрузки объекта. По умолчанию :(Ссылка=0) ИЛИ (Род=1) , т.е. из потока объектов загружаются те, которые переданы по значению, или те, которые переданы как значения свойств переданных по значению объектов. Варианты: :(Ссылка=0) – только переданные по значению объекты :(Ссылка=1) – только переданные по ссылке объекты :(Род=0) – объекты только из основного потока
Параметры: |
|
ОбЗащ |
Правило |
Условие загрузки объекта поверх существующего. Контролируются только существующие объекты, ведь новые объекты должны заполниться. Если истинно, то объект загружается. Параметры: По умолчанию защищаются все существующие объекты, которые загружаются по ссылке. |
|
СвЗагр |
|
Условие загрузки свойства. Параметры: |
|
Проводить |
Условие |
Проводить документ. Пустое условие: не проводить Функции: Только в этом режиме можно поменять дату & время проведенных документов. После окончания загрузки у документов устанавливается нужная дата & время, и они последовательно проводятся. Можно допровести документы вручную на закладке «Проведение» |
|
Удалять |
Условие |
Помечать на удаление объекты, которые должны быть помечены на удаление. Пустое условие: не удаляются. |
Нет еще |
Мод |
Условие |
Модифицирует значение свойства и название свойства объекта перед его выгрузкой, удобно для номера документа и т.п. Параметры: Свойство, Зн. Функции: МодЗн(Зн) – модифицирует значение, МодСв(Свойство) – модифицирует имя свойства при выгрузке, МодЕще(Свойство,Зн) – добавляет в выгрузку реквизит, вычисляемый на основе текущего. Например, чтобы заменить свойство «Код» на свойство «Артикул» и значение на 1000 больше, можно использовать следующее правило: МодЕще(Св,Зн) |
Не работает МодЕще |
Код |
Условие |
Правило, по которому вычисляется код(номер документа). По умолчанию код сначала назначается таким, как он указан в выгрузке, если нарушается уникальность кода, то пробуем установить новый код, если и это не помогает, то объект не записывается и помечается как плохой. Это правило позволяет уточнить порядок назначения кода. Параметры: Об, Код – каким должен быть код |
Нет еще |
КакНовые |
Условие |
Работает на этапе поиска. Помечает объект как не найденный, даже если он найден, следовательно объект будет заведен как новый. |
|
Новые |
- или + |
+ загружаются только новые, существующие не оформляются Для + правило :Найден=0 Для – правило :Найден<>0 |
|
Алгоритмы этапов работы
Этап выгрузки объектов:
На этапе выгрузки источник объектов перебирает объекты всех видов, которые указаны к выгрузке, определяет как нужно их выгружать и выгружает в соответствии с настройками.
Алгоритм выгрузки объектов:
- Перебираются все указанные в настройках виды объектов, у которых стоит признак выгрузки Выгружать=1. Если в автоматическом режиме выгружается список объектов, то перебираются только элементы списка.
- Каждый объект выгружается по значению (Ссылка=0).
- При выгрузке определяется, был ли уже выгружен объект. Если не был выгружен, тогда выгружается с. Иначе, если был выгружен с Ссылка=1, а сейчас Ссылка=0, то объект удаляется из выгрузки и выгружается заново с Ссылка=1. В силу непонятного глюка компоненты XML объект не удаляется физически из выгрузки (при удалении программа вылетает), а ему присваивается ID=0. При загрузке объекты с ID=0 безусловно игнорируются.
- Для объекта вычисляется ОбВыгр (см. таблицу). Если правило истинно, объект выгружается.
- Объект помещается в выгрузку, ему устанавливается ID и флажок Link.
- Выгружаются свойства объекта. Для проверки выгрузки свойства используется функция СвВыгр, в которой можно указать и Link. По умолчанию свойства выгружаются с Link=1.
- По окончании выгрузки полученный XML файл сохраняется на диск.
Этап загрузки объектов:
Процедура загрузки состоит из поиска и оформления объектов. На этапе поиска программа пытается сопоставить объекты из файла с объектами базы данных, при этом в текущей базе данных не производится никаких изменений.
На этапе оформления заводятся новые элементы и изменяются свойства существующих.
Алгоритм поиска объектов:
- Все объекты из файла загружаются в таблицу. Каждому объекту устанавливаются флаги: Найден=0; Плохой=0; Об=0; Link=0;
- Если объект плохой, т.е. Плохой=1, то он пропускается.
- Если объекта нет в конфигурации, то устанавливается флаг Плохой=1.
- Если объект еще не найден, т.е. Найден=0, обрабатывается параметр Поиск и выдается объект, который можно сопоставить объекту из файла. Если сопоставление возможно, Найден=1 и в Об запоминается сопоставленный объект и его Link.
- В процессе обработки параметра Поиск могут рекурсивно вызываться поиски свойств объекта, если они нужны для поиска объекта.
- В результате работы для каждого объекта имеем флаг Найден и объект Об.
Этап оформления объектов:
Т.к. 1С накладывает жесткие ограничения на уникальность кода элемента, номера документа и наличие владельца у элемента, процедура загрузки объектов делится на этап заведения и оформления.
На этапе заведения заводятся новые элементы справочников и документы. При этом у справочников устанавливается только владелец, родитель и код, а у документов – только дата и номер.
На этапе оформления проставляются реквизиты объектов.
Алгоритм заведения объектов:
- Перебираются все объекты из исходного файла.
- Если (Заведен=1) ИЛИ (Плохой=1) ИЛИ (Найден=1) тогда переходим к следующему объекту.
- Вычисляем параметр ОбЗагр. Если ложь, помечаем объект как Плохой=1 и переходим к следующему. Если правило не указано, вычисляется УслУмолч.
- Устанавливаем Новый=1, заводим новый объект соответствующего типа.
- У справочника заводим его родителя или владельца. У объекта устанавливаем код (номер). Пробуем записать. В случае невозможности записи из-за требований контроля уникальности меняем код (номер).
- Если объект не удалось записать, помечаем его как Плохой=1, иначе как Заведен=1.
Алгоритм оформления объектов:
Т.к. все объекты уже присутствуют в базе (кроме плохих), то можно установить значение любого свойства, даже агрегатного.
При загрузке табличной части оставляется (добавляется) столько строк в документ, сколько должно быть строк. Старые значения строк не удаляются, если не замещаются новыми значениями. Если в табличной части в выгрузке 0 строк, то табличная часть не удаляется.
- Перебираются все объекты из исходного файла.
- Если Плохой=1, то объект пропускается.
- Вычисляется ОбЗагр. Если ложь, объект пропускается. Если правило не указано, вычисляется УслУмолч.
- Перебираются все свойства объекта из файла.
- Для каждого свойства проверяем параметр СвЗагр. Если истина, то устанавливаем значение свойства.
Этап конвертации:
Загрузка операций:
Операции загружаются построчно. Номер строки игнорируется. Строки загружаются последовательно.
При выгрузке счета также выгружается информация о его видах субконто. Затем, при загрузке субконто в счет, для текущего вида субконта счета и Т.к. часто одинаковые субконто идут в счетах в различном порядке, при загрузке субконто номер i в счет, в выгрузке ищется информация о том, какое
FAQ и примеры
Для уяснения возможностей обработки и быстрого старта приводятся наиболее типичные или интересные приемы работы.
Выгрузка отдельного документа:
В ОбВыгр укажите СокрЛП(Об.НомерДок)=«1». Учтите, что атрибут НомерДок всегда возвращается как строка.
Выгрузка между различными конфигурациями с сохранением отсутствующих в базе-получателе реквизитов:
Если у объекта-получателя есть атрибут «Примечание» неограниченной длины, а теряются реквизиты Рекв1, Рекв2, …, в Мод укажите ?(Св=«Рекв1», МодСв(«Примечание»)+МодЗн(Строка(Рекв1)+Строка(Рекв2)+Строка(Рекв3)) ,0). Т.е. Рекв1 будет при выгрузке переименован в примечание а его значение будет преобразовано в строку, составленную из реквизитов.
Изменение типа объекта при выгрузке:
Если в исходной базе номенклатура называется «Товары», а в получателе «Номенклатура» можно записать Мод для справочника «Товары» так:
?(Св=«Вид», МодЗн(«Номенклатура») )
Загрузка только новых (только существующих):
Правило ОбЗагр укажите так:
Найден=0
или Найден=1 соответственно.
Сделать, чтобы проводки документа загрузились в другой базе, как ручные операции без документа:
- Нужно изменить вид объекта с документа на ручную операцию, для этого правило Мод укажите ?(Св=«Вид», МодЗн(«Операция»))
- Нужно отключить вывод всех реквизитов шапки и табличной части. Для этого правило СвВыгр укажите
: (Св<>”Реквизиты” ) И (Св<>”Таблица”)
Т.е. правило гласит, что свойства Реквизиты и Таблица не выгружаются, а значит и их подсвойства тоже.
Использовать несколько Мод для нескольких реквизитов:
?(Св=«Вид», МодЗн(«Номенклатура»),0) +
?(Св=«Вид», МодЗн(«Номенклатура»),0)
Помните, что Мод и возвращает числа и их можно складывать (или) или умножать (и).
Мне нужно перенести номенклатуру, а тут столько много параметров, как бы попроще:
Все просто, нужно у номенклатуры установить свойства:
- Выгружать 1
- Поиск ПоискПоНаименованию() (Если хотите по наименованию синхронизировать)
И все, можно переносить.
Мне нужно перенести приходные накладные, а тут столько много параметров, как бы попроще:
Все просто, нужно у приходной накладной установить свойства:
- Выгружать 1
У всех справочников установите:
- Поиск ПоискПоНаименованию() Если хотите по наименованию синхронизировать
- Новые «-» Чтобы новые элементы не заводились, будут дырки
И все, можно переносить.
Нужно выгрузить только накладные с определенным номером
В свойстве ОбВыгр указать :
Найти("-1|1-2.7-1007|100-2-1010|99-1-1010|",СокрЛП(Об.НомерДок)+"|")<>0
Описание импорта из XLS/MXL.
Так как данные в XLS и MXL представляют собой таблицы в которых хранится некий текст, процедура импорта сделана единообразно. MXL работает более быстро, а большие объемы информации иногда трудно перенести из MXL в XLS без ухищрений (например через сохранение в промежуточном HTML-файл). Поэтому в дальнейшем импорт будет рассматриваться на примере таблиц EXCEL. Таблицы в MXL должны быть подготовлены точно так же.
Импорт заключается в том, что данные из файла Excel (специальным образом организованного) преобразуются в файл XML, в формате, который можно загрузить с помощью данной обработки.
Пример таблицы для импорта указан в файле Импорт.xls
Каждая строка представляет значение одного или нескольких свойств одного объекта.
В первой строке указываются названия свойств, во второй строке – их тип.
Начиная с третьей строки указываются значения свойств.
Последней колонкой считается первая колонка без названия, последней строкой – первая строка, у которой ни в одной колонке нету данных.
Колонки серого цвета обязательно должны присутствовать (для справочников и документов):
ID |
Уникальный ключ объекта, к которому относятся свойства |
List |
Список объекта, в который попадают свойства |
Load |
Ссылка 1 – по ссылке, 0 – по значению |
Также, для загрузки в 1С, нужны колонки Тип и Вид. Возможно Наименование, Код, ДатаДок, НомерДок и т.п.
Тип свойства во второй строке можно указывать как Num, Str, Dat, Agr.
Внимание! Для объектов типа Agr должен указываться в значении свойства его ID. Отсюда следует, что этот объект должен также быть описан отдельной строкой с этим ID. Например если у вас в колонке «ВидТовара» стоит «штучный», то должна быть отдельная строка, где ID=”штучный”, Вид=«ВидыТоваров», Тип=«Перечисление».
Пустые значения ячеек пропускаются.
Если вам нужно организовать табличную часть у документа, используйте список «Таблица». Посмотрите, как это сделано в примере. Строки табличной части не обязательно должны идти вместе, но их порядок определяет результирующий порядок в документе.
Справочники и документы могут идти в любом порядке, загрузка поймет и загрузит их в нужном порядке.
Думаю, мне удалось реализовать очень удобный механизм импорта данных, конечно к нему нужно немного приспособиться, но зато потом все будет очень даже удобно.
Дополнительные сведения и рекомендации.
Обработка для своей работы требует компоненты v7plus.dll в каталоге базы, а также наличия в системе MSXML-парсера от Miscrosoft не ниже 3.0. В Win2k Workstation он имеется по умолчанию, для Win98 и W2k Server его нужно скачать с сайта http://msdn.microsoft.com/downloads/default.asp (поиск по MSXML).
Файлы обмена удобно просматривать в любом интернет-браузере, для редактирования очень рекомендую программу XMLSpy.
Приложения.
- UniData.ert – shareware версия обработки.
- “Struct.xml” – файл с примером структуры XML-документа, участвующего в обмене.
- “Тест загрузки из XLS.xls” – файл, демонстрирующий универсальную загрузку данных из EXEL.
- “Тест загрузки из MXL.mxl” – файл, демонстрирующий универсальную загрузку данных из MXL.
- “Конвертор из XLS.ert” – конвертор из XLS в XML для целей загрузки в 1С из EXCEL. В нем также содержится блок функций «Функции конвертора», которые можно использовать в своих конверторах.
Лицензия.
Обработка зафиксирована в 2004 году и не дорабатывается. Можете спокойно развивать ее под своим авторством, если требуется со ссылкой на первоисточник.