Данная статья содержит общие рекомендации по настройке фильтров конектора DIRECTUM и 1С 8.x и дополняет информацию из документации системы DIRECTUM. Необходимость её написания появилась в связи с множеством вопросов, возникающих у администраторов при первом использовании данного механизма. Фильтр задается в каждой конкретной записи справочника «Настройка обмена данными с интегрированными системами» по кнопке Фильтр.
Загрузка данных из 1С в DIRECTUM
При загрузке данных из 1С в DIRECTUM, обмен данными производится через xml-файл формата интегрированной системы. Затем, посредством XSL-преобразования, данные переводятся в xml-файл формата DIRECTUM. Поэтому текст фильтра задается в соответствии с синтаксисом языка XPath, по следующему шаблону:
<Имя реквизита 1С><логическое выражение><значение реквизита 1С>.
Пример 1. Необходимо, чтобы в DIRECTUM загружались только те записи справочника Организаций системы 1С, наименования которых не равно «ИвановКо», а ИНН равен «1101122440». Текст фильтра будет следующим:
Description!='ИвановКо' and ИНН='1101122440'
Пример 2. Необходимо, чтобы в DIRECTUM загружались только те записи справочника Организаций системы 1С, ИНН которых не заполнен, и наименование содержит «ОАО». Текст фильтра будет следующим:
ИНН='' and contains(Description, 'ОАО')
Трудности в задании фильтров могут возникнуть при необходимости использования фильтрации по дате. Дата в xml-файле выгрузки из 1С содержится в формате
contains(<имя реквизита>,'2008')
contains(<имя реквизита>,'2008-01')
contains(<имя реквизита>,'2009-02-11')
или
<имя реквизита>='2009-02-11T00:00:00'
Если же требуется отфильтровать по промежутку, то необходимо воспользоваться методом, описанным в примере 3.
Пример 3. Необходимо, чтобы в DIRECTUM загружались только те записи справочника Организаций системы 1С, дата государственной регистрации которых находится между 12 марта 2010г. и 11 апреля 2010г. Текст фильтра будет следующим:
concat(
substring(ДатаРегистрации,1,4),
substring(ДатаРегистрации,6,2),
substring(ДатаРегистрации,9,2)
)<'20100411'
and
concat(
substring(ДатаРегистрации,1,4),
substring(ДатаРегистрации,6,2),
substring(ДатаРегистрации,9,2)
)>'20100312'
Такая функция приводит дату к формату YYYYMMDD, к которому, с помощью логических операторов <(<) и >(>), можно задать критерии фильтрации. Так же, можно использовать операторы <=(<=) - логическое «меньше либо равно» и >=(>=) - логическое «больше либо равно».
Загрузка данных из DIRECTUM в 1С
При выгрузке данных из DIRECTUM в 1С, система DIRECTUM сначала создает список выгружаемых данных в соответствии с указанными фильтрами, а затем данные переводятся в xml-файл. Поэтому текст фильтра указывается в формате where-условия SQL-запроса, при этом, вместо имен полей, участвующих в условии, следует указывать имя реквизита DIRECTUM в следующем формате:
'[<Имя реквизита DIRECTUM>]'<Логическое выражение><Значение реквизита DIRECTUM>
Пример 4. Ситуация аналогична примеру 2, но выгрузка происходит в обратном направлении, из DIRECTUM в 1С. Текст фильтра будет следующим:
'[ИНН]'='' and '[Наименование]' like '%ОАО%'
Все необходимые имена реквизитов (и их значения) можно посмотреть в xml-файле, который формируется интегрированной системой при выгрузке.
Пример:
…
ИвановКо
<ИНН>1101122440ИНН>
<КПП>119988551КПП>
<НаименованиеПолное>Иванов и КомпанияНаименованиеПолное>
<ЮрФизЛицо>ЮрЛицоЮрФизЛицо>
<ИностраннаяОрганизация>falseИностраннаяОрганизация>
<ДатаРегистрации>2010-04-01T00:00:00ДатаРегистрации>
…
При работе с фильтрами не забывайте, что после создания нового фильтра необходимо сохранить XSL-запрос кнопкой Создать XSL, после чего сохранить настройки. Так же, учтите, что выгрузятся только те записи, что были созданы или изменены после даты последнего обмена DIRECTUM и интегрированной системы.
Спасибо Петру за этот материал, регулярно к нему обращаюсь, когда дело доходит до настройки фильтров при интеграции Директум и 1С. Хочу немного дополнить:
Чтобы при загрузке данных из 1С в Директум в справочники Директум не попадали записи Папок(Групп), необходимо в фильтре добавить условие:
IsFolder!='true'
или IsFolder!=true()
Действительно спасибо, статья отличная. У меня только вопрос: в какой момент применяются фильтры? В момент выгрузки из интегрированной системы, в момент преобразования или в момент экспорта в DIRECTUM?
Также хочу дополнить примером: если нужно загружать только записи, которые НЕ содержат 'ОАО' в наименовании (Description). Для этого можно использовать функцию not:
not(contains(Description, 'ОАО'))
Решил поделится собственным опытом:
1. Имена реквизитов 1С, указываемые в фильтре, чувствительны к регистру (Code и code - это не одно и тоже);
2. Если в иерархическом справочнике необходимо синхронизировать только верхний уровень, то в фильтре надо задать такую строку:
P.S. Точнее надо посмотреть как 1С выгрузила данные в xml-файл и взять оттуда имя реквизита и значение (значение заключить в кавычки).
3. Почитать об XPath можно здесь: http://ru.wikipedia.org/wiki/XPath
Подскажите в фильтре можно использовать конструкцию OR?
мне нужно отфильтровать записи работников у которых есть ДатаУвольнения и она меньше определенной даты
делаю так:
Как показала практика or можно использовать, только нужный мне фильтр будет выглядеть следующим образом:
Авторизуйтесь, чтобы написать комментарий