Рекомендации по настройке фильтров коннектора DIRECTUM к 1С 8.x

12 8

Данная статья содержит общие рекомендации по настройке фильтров конектора 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С содержится в формате и для корректной работы сложного фильтра требуется преобразование в более простой формат. Приведем несколько примеров простых фильтров по дате:

  • Фильтрация по году. Необходимо выгрузить все записи за 2008 год:

 contains(<имя реквизита>,'2008') 

  • Фильтрация по месяцу. Необходимо выгрузить все записи за январь 2008 года: 

 contains(<имя реквизита>,'2008-01') 

  • Фильтрация по конкретной дате. Необходимо выгрузить все записи за 11 февраля 2009 года: 

 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?

Дмитрий Тарасов
Действительно спасибо, статья отличная. У меня только вопрос: в какой момент применяются фильтры? В момент выгрузки из интегрированной системы, в момент преобразования или в момент экспорта в DIRECTUM?

Из интегрированной системы выгружаются все изменения, которые произошли с момента последнего обмена. Т.к. фильтр у нас появляется в XSL-шаблоне, то применяется он уже в момент XSL-преобразования к выгруженной из интегрированной системы XML-ке. Ну и то что получилось после преобразования и действия фильтров уже грузится в директум.
Ксения Останина

Также хочу дополнить примером: если нужно загружать только записи, которые НЕ содержат 'ОАО' в наименовании (Description). Для этого можно использовать функцию not:

not(contains(Description, 'ОАО'))

Сергей Радыгин

Решил поделится собственным опытом:

1. Имена реквизитов 1С, указываемые в фильтре, чувствительны к регистру (Code и code - это не одно и тоже);

2. Если в иерархическом справочнике необходимо синхронизировать только верхний уровень, то в фильтре надо задать такую строку:

Parent='00000000-0000-0000-0000-000000000000'

P.S. Точнее надо посмотреть как 1С выгрузила данные в xml-файл и взять оттуда имя реквизита и значение (значение заключить в кавычки).

3. Почитать об XPath можно здесь: http://ru.wikipedia.org/wiki/XPath

Анатолий Придыбайло

Подскажите в фильтре можно использовать конструкцию OR?

мне нужно отфильтровать записи работников у которых есть ДатаУвольнения и она меньше определенной даты

делаю так:

ДатаУвольнения = '0001-01-01T00:00:00' or ДатаУвольнения >= '2015-08-19T00:00:00'


 

Анатолий Придыбайло

Как показала практика or можно использовать, только нужный мне фильтр будет выглядеть следующим образом:

ДатаУвольнения = '0001-01-01T00:00:00' or 
concat(
substring(ДатаУвольнения,1,4),
substring(ДатаУвольнения,6,2),
substring(ДатаУвольнения,9,2)
)>'20150819'

Авторизуйтесь, чтобы написать комментарий