четверг, 5 сентября 2013 г.

Call-центр\IP PBX Oktell: Oktell и 1С


IP PBX Oktell

Рассматриваются версии 1С 8.0 и выше, с установленным сервером БД MS SQL.
ВАЖНО: Лицензионное соглашение не позволяет использовать недокументированные фирмой "1С" средства для построения решений на платформе 1С:Предприятие. Это означает, что средства СУБД (или любые другие внесистемные средства) можно использовать только в том случае, если документация по продуктам линейки "1С:Предприятие" (включая ИТС) содержит явную рекомендацию использовать данное средство для решения данной задачи.
Во всех остальных случаях лицензионное соглашение позволяет использовать для построения решений только штатные средства платформы. В частности, можно обращаться к данным информационной базы только при помощи объектов "1С:Предприятия", специально предназначенных для работы с данными (запросы, справочники, документы и т.д.). Нельзя обращаться к данным информационной базы напрямую, минуя уровень объектов работы с данными "1С:Предприятия" - например при помощи средств СУБД или при помощи внешних компонент, которые реализуют прямой доступ к СУБД. Это ограничение распространяется на любые действия с данными, в том числе на изменение их структуры, а так же на чтение или изменение самих данных информационной базы или служебных данных "1С:Предприятия".
Данное ограничение необходимо для обеспечения стабильности работы механизмов системы, осуществления поддержки и возможности перехода на новые версии "1С:Предприятия".

Получения (внесения) данных из (в) БД 1С для обработки в Oktell. В качестве примера рассмотрим задачу переключения входящего звонка на оператора Call-центра закрепленного за данным контрагентом.
  1. Открыть отчет в 1С с помощью которого можно сопоставить справочники 1С с таблицами в БД MS SQL.
   



Если открылась пустая форма, то необходимо открывать отчет через «Толстый клиент:обычное приложение». Например запустить конфигуратор 1С и в меню выбрать — «Отладка» — «Начало отладки» — «Толстый клиент (обычное приложение) : начать отладку».


Если данного пункта нет в выборе то необходимо зайти во вкладку «Сервис» - «Параметры» - вкладка «Общие» - установить точку на строке «Управляемое приложение и обычное приложение»

После чего откроется необходимый отчет.
     2)Найти необходимые данные в таблицах. В нашем случае используются таблицы:
  • «Справочник. Контрагенты»:

  • «РегистрыСведений. Контактная информация»:

  • «Справочник. Пользователи»

Данные таблицы связаны следующим образом (связи описаны через «ИмяПоля»):
«Справочник. Контрагенты».Ссылка ←→   «РегистрыСведений. Контактная информация».Объект
«Справочник. Контрагенты».ОсновнойМенеджерПокупателя ←→  «Справочник. Пользователи».Ссылка
Соответственно из таблицы «РегистрыСведений. Контактная информация» получаем содержимое поля «Представление» в котором содержатся контактные данные по контрагенту. Из таблицы «Справочник. Пользователи» получаем содержимое поля «Наименование» в котором содержатся менеджеры контрагента (в таблице «Справочник. Контрагенты» будет указан менеджер который выбран в качестве основного)
ВНИМАНИЕ! Тип контакта можно получить из таблицы «Справочник.ВидыКонтактнойИнформации» по полю «Наименование» использовать следующую связь между таблицами:

«РегистрыСведений. Контактная информация».Вид ←→ «Справочник.ВидыКонтактнойИнформации».Наименование

3)Составим запрос для получения имени основного менеджера, по номеру (CallerID), закрепленного за контрагентом. Настроим сценарий.


SQL запрос написанный через выражение:
"select @user_oktell_out="+[manager_1c___user]+"
from " +[table_name___user]+ "
where " +[id___user_1c]+ "=
(
select " + [manager_1c___contrag] + "
from " + [table_name___contrag] + "
where " + [id___contrag] + " in
 (
  select " + [id___contact] + "
  from " + [table_name___contact] + "
  where REPLACE (REPLACE (REPLACE (REPLACE (cast(" + [number_1c___contact] + " as nvarchar), ' ', ''), '-', ''), '(', ''), ')', '')
  like '%' + cast(" + [caller_id] + " as nvarchar) + '%'
  and
  " + [type_number_1c___contact] + "=
  (select " + [id___type_number] + " from " + [table_name___type_number] + " where "+ [number_1c___type_number] + "='" + [type_number_1c___type_number] + "')
 )
)"


Пример корректно заполненного запроса:
select @user_oktell_out=[base1s].[dbo].[_Reference77].[_Description]
from[base1s].[dbo].[_Reference77]
where[base1s].[dbo].[_Reference77].[_IDRRef]=
(
select[base1s].[dbo].[_Reference62].[_Fld642RRef]
from[base1s].[dbo].[_Reference62]
where[base1s].[dbo].[_Reference62].[_IDRRef] in
 (
  select[base1s].[dbo].[_InfoRg6747].[_Fld6748_RRRef]
  from[base1s].[dbo].[_InfoRg6747]
  where REPLACE (REPLACE (REPLACE (REPLACE (cast([base1s].[dbo].[_InfoRg6747].[_Fld6754] as nvarchar), ' ', ''), '-', ''), '(', ''), ')', '')
  like '%' + cast(89271231233 as nvarchar) + '%'
  and
  [base1s].[dbo].[_InfoRg6747].[_Fld6750_RRRef]=
  (select[base1s].[dbo].[_Reference33].[_IDRRef] from[base1s].[dbo].[_Reference33] where [base1s].[dbo].[_Reference33].[_Description]='Телефон контрагента')
 )
)

Для того, чтобы получить выходную переменную @user_oktell_out необходимо так же использовать дополнительный параметр Parameter_Definition, в котором укажем:
"@user_oktell_out nvarchar(50) OUTPUT"

Для выполнения данного запроса используем следующий код SQL:
exec sp_executesql @zapros,
      @Parameter_Definition,
      @user_oktell_out OUTPUT

ВНИМАНИЕ! После смены конфигурации 1С имена таблиц изменятся, в связи с этим запросы со стороны Oktell составляются динамические (имена таблиц и полей хранятся в таблице абонентов Oktell для удобства изменения).

4)Модифицируем процедуру выбора оператора
Процедура(ссылка на вики) устанавливает в приоритетном порядке того оператора (остальные операторы call-центра добавляются с меньшим приоритетом), который указан как основной менеджер у контрагента.
Пример:
В 1С у контрагента основной менеджер Дмитрий
Операторы Call-центра: Иван, Дмитрий, Сергей
Процедура составит список: Дмитрий, Иван, Сергей. Где порядок перечисления имен и указывает какой приоритет у операторов при распределении звонка (первое имя с наибольшим приоритетом, последнее соответственно с наименьшим)
USE [oktell]
GO
/****** Object:  StoredProcedure [dbo].[A_TaskManager_OperatorsAll_Get_Custom]    Script Date: 08/16/2013 03:12:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER  Procedure [dbo].[A_TaskManager_OperatorsAll_Get_Custom]
@idtask uniqueidentifier = '00000000-0000-0000-0000-000000000000',
@idlist uniqueidentifier = '00000000-0000-0000-0000-000000000000',
@idabonent int = 0,
@idline uniqueidentifier = '00000000-0000-0000-0000-000000000000',
@dtnow datetime = null
as
begin

select distinct t1.id
from
(
select ID id from a_users
where [Name]=(select top 1 number
from table_oper_switch
where callerid= (select top 1 [AbonentNumber] from [oktell_cc_temp].[dbo].[A_Cube_CC_EffortConnections]
where [IdExtLine]=@idline order by datetimestart desc )

order by id desc)

) t1 inner join
(
select u.Id
from A_Users u
Inner join A_UserParams up on u.Id = up.Iduser
where up.IsOperator = 1
) t2 on t1.id != t2.id

union all

select distinct t2.id
from
(
select ID id from a_users
where [Name]=(select top 1 number
from table_oper_switch
where callerid= (select top 1 [AbonentNumber] from [oktell_cc_temp].[dbo].[A_Cube_CC_EffortConnections]
where [IdExtLine]=@idline order by datetimestart desc )

 order by id desc)

) t1 inner join
(
select u.Id
from A_Users u
Inner join A_UserParams up on u.Id = up.Iduser
where up.IsOperator = 1
) t2 on t1.id != t2.id

end

5)Выберем процедуру во вкладке «Ресурсы» при редактировании задачи.
Выберем «Вариант обхода операторов» - «Пользовательская процедура»


Создания таблиц необходимых:
Таблица table_compare:

Необходима для хранения названий полей и таблиц из БД 1С.

USE [oktell]
GO

/****** Object:  Table [dbo].[table_compare]    Script Date: 08/16/2013 12:17:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[table_compare](
[Id] [int] IDENTITY(1,1) NOT NULL,
[id_1C] [nvarchar](2000) NULL,
[number_1C] [nvarchar](2000) NULL,
[type_number_1C] [nvarchar](2000) NULL,
[name_table_1C] [nvarchar](2000) NULL,
[meaning_name_1C] [nvarchar](2000) NULL,
[manager_1C] [nvarchar](2000) NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Пример заполнения таблицы:
id_1C
number_1C
type_number_1C
name_table_1C
meaning_name_1C
manager_1C
[base1s].[dbo].[_Reference62].[_IDRRef]
NULL
NULL
[base1s].[dbo].[_Reference62]
Таблица контрагентов
[base1s].[dbo].[_Reference62].[_Fld642RRef]
[base1s].[dbo].[_InfoRg6747].[_Fld6748_RRRef]
[base1s].[dbo].[_InfoRg6747].[_Fld6754]
[base1s].[dbo].[_InfoRg6747].[_Fld6750_RRRef]
[base1s].[dbo].[_InfoRg6747]
Таблица с контактными данными по контрагенту
NULL
[base1s].[dbo].[_Reference33].[_IDRRef]
[base1s].[dbo].[_Reference33].[_Description]
Телефон контрагента
[base1s].[dbo].[_Reference33]
Таблица с типами контактных данных
NULL


Таблица table_oper_switch
Необходима для связи между данными полученными из БД 1С и хранимой процедурой выбора оператора A_TaskManager_OperatorsAll_Get_Custom.
USE [oktell]
GO

/****** Object:  Table [dbo].[table_oper_switch]    Script Date: 08/16/2013 12:24:33 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[table_oper_switch](
[Id] [int] IDENTITY(1,1) NOT NULL,
[number] [nvarchar](2000) NULL,
[callerid] [nvarchar](2000) NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO