Автоматизация с помощью CRM системы
Функции и преимущества CRM системы index.crm
Описание особенностей внедрения CRM системы index.crm
Разработка и стоимость CRM системы index.crm Внедрение CRM систем Екатеринбург
О компании О системе Тест-драйв Документация Цены CRM бесплатно! Внедрения Обучение Статьи FAQ БЛОГ
На главнуюКонтактная информацияКарта сайта CRMОбратная связь
Документация:
Документация по CRM системе index.crm
Основы системы index.CRM
Справочники в CRM системе
Управление записями справочников
Свойства клиента
Товары и услуги
Автоматизация управления персоналом
Журналы документов в CRM
Контакты
Работа с предложениями
Управление продажами в CRM системе
Виды отчетов в CRM системе
Интерфейс администратора
Автоматизация документооборота с помощью CRM
Примеры использования index.crm
Функциональные подсистемы CRM
Преимущества index.crm:
Преимущества CRM системы index.crm для руководителя
О CRM системе index.crm для начальника отдела продаж
Автоматизация с помощью CRM системы ИТ-специалисту
Стоимость CRM системы index.crm стоимость владения
Построение корпоративных информационных систем на платформе index.CRM

Приглашаем к сотрудничеству партнеров по продвижению нашего продукта.

Партнерстово и сотрудничество по CRM системе index.crm
Внедрение CRM систем
ТУР
по системе
Наш партнер: CRMONLINE

Руководство администратора

Содержание

    Общая структура системы index.crm
  ЧАСТЬ 1. ПРАВА ДОСТУПА
    Предоставление доступа в Интерфейс администратора
    Способы авторизации
    Создание, изменение свойств, удаление пользователей
    Назначение прав доступа
      Права доступа групп
      Контроль прав на уровне операций
      Правила доступа подразделений
      Пересчет прав
      Эффективные права
  ЧАСТЬ 2. НАСТРОЙКА ПАРАМЕТРОВ РАБОТЫ СИСТЕМЫ
    Константы
    Параметры монитора и планирования, настройка уведомлений
    История значений
    Удаление объектов
    Настройки поиска
    Импорт/экспорт. Интеграция с 1С
    Служебные справочники
  ЧАСТЬ 3. УПРАВЛЕНИЕ СТРУКТУРОЙ СИСТЕМЫ
    Управление структурой справочников и журналов документов
    Параметры фильтрации и сортировки
    Создание модулей системы
    Создание пользовательских сценариев
  Приложение. Основные модули системы

Общая структура системы index.crm

 

Система index.crm построена на версии 3.0 стандартного ядра компании index.art. Первая часть настоящего руководства посвящена описанию возможностей настройки прав доступа. Во второй части описывается работа с дополнительными средствами администрирования, такими как импорт/экспорт данных, настройка различных параметров функционирования системы. Третья часть посвящена возможностям изменения структуры системы и реализации бизнес-процессов, доступных при помощи Интерфейса администратора (без вмешательства в программный код системы). Дальнейшую информацию по расширению функциональных возможностей системы можно найти в Документации программиста.

 

ЧАСТЬ 1. ПРАВА ДОСТУПА

 

Предоставление доступа в Интерфейс администратора

 

Интерфейс администратора в index.crm доступен пользователям, обладающим правами "вебмастера". Идентификаторы таких пользователей задаются в файле /include/defines.ext следующим образом:

$CONSTANTS["webmaster"]=Array(1);

В скобки в правой части можно добавить, через запятую, идентификаторы дополнительных пользователей, которые получат доступ к интерфейсу. Идентификатор пользователя можно узнать в БД или в справочнике "Персонал".

 

Интерфейс администратора содержит несколько разделов, относящихся к конфигурированию системы. Ниже описываются возможности работы с этими разделами.

 

Способы авторизации

 

Index.CRM поддерживает три способа авторизации: собственный, по логину-паролю; средствами контроллера домена Active Directory; средствами веб-сервера Apache. На практике обычно используются первый или второй способ. Первый способ не нуждается в настройке; создание пользователей и задание для них паролей описываются ниже. При авторизации средствами Active Directory необходимо задать параметры соединения с контроллером домена в файле /include/defines.ext:

 

$ldap_host="" // IP-адрес сервера

$ldap_realm="" // название домена

$ldap_rdn="" // префикс для поиска пользователей (например, cn=Users)

 

При таком способе авторизации логины пользователей (см. далее) должны точно соответствовать логинам, заданным на сервере Active Directory. Пароль в index.CRM задавать не нужно - проверка пароля осуществляется средствами контроллера домена, и пользователи для входа в систему должны будут вводить те же самые реквизиты, которые они используют для входа в домен. Контроллер домена используется только для проверки пароля, т.е. все остальные параметры безопасности, включая принадлежность к группе, задаются в самой системе index.CRM (при необходимости, в эту схему могут быть внесены изменения).

 

Собственно способ авторизации также устанавливается в этом файле, переменной $auth_mode, которая может принимать значения AUTH_SITE (авторизация по логину-паролю), AUTH_LDAP и AUTH_APACHE.

 

Создание, изменение свойств, удаление пользователей

 

Создание новых пользователей происходит в справочнике Персонал самой системы (НЕ в Интерфейсе администратора!). Для создания нового пользователя нужно выбрать в левой части страницы контейнер (подразделение), в котором должен находиться создаваемый сотрудник, перейти на закладку Персонал, ввести имя нового сотрудника, и нажать кнопку Создать. Сотрудник появится в дереве слева. Необходимо выбрать его, и в правой части страницы откроется форма свойств пользователя. Здесь нужно задать для него логин и выбрать группу, к которой будет принадлежать сотрудник (от этого, а также от того, в каком подразделении он находится, будут зависеть его права доступа к системе). Если вы находитесь в системе с правами пользователя, имеющего доступ к Интерфейсу администратора - ниже формы свойств сотрудника, в области с заголовком "Вы можете:", появится ссылка "Установить пароль пользователю". При нажатии на нее в новом окне откроется страница Интерфейса администратора, где можно будет задать пароль для пользователя.

Чтобы переместить сотрудника в другое подразделение, необходимо выбрать в дереве слева то подразделение, где он находится в данный момент, перейти на закладку Персонал, отметить переключатель напротив имени пользователя, и в расположенном ниже дереве выбрать то подразделение, куда нужно перенести сотрудника. Затем нужно нажать кнопку "Перенести в:", расположенную над деревом.

Корректный способ удаления пользователей заключается в установке в свойствах сотрудника переключателя "Уволен", и переносе таких сотрудников в специальный контейнер, который можно создать для этой цели в справочнике Персонал. При этом в системе останется вся информация, связанная с этим сотрудником. Если же удалить пользователя полностью (как запись справочника), то, например, в контактах, сделанных этим человеком, поле "Менеджер" станет пустым.

 

На странице свойств пользователя доступны также две закладки - "Дневник" и "План". Работа с содержимым этих закладок рассматривается в Документации пользователя.

Указанные закладки доступны только сотрудникам, которые являются руководителем выбранного пользователя. Алгоритм определения руководителя заключается в следующем. В свойствах каждого сотрудника присутствует переключатель "Руководитель подразделения". Если она установлена, сотрудник будет считаться руководителем для всех остальных пользователей этого подразделения (даже если у них этот переключатель тоже установлен), а также для всех пользователей подразделений, вложенных в данное. Кроме того, каждый пользователь считается руководителем для самого себя. Исключение составляет использование закладки "План" - пользователь не может редактировать собственный план, если только он не является привилегированным администратором, имеющим доступ к Интерфейсу.

Алгоритм определения руководителей имеет значение только для двух функциональных блоков системы - контроля рабочего времени и планирования показателей (закладки "Дневник" и "План"). Для работы всех остальных функций, в т.ч. системы назначения задач, этот алгоритм не используется.

 

Назначение прав доступа

 

Права доступа устанавливаются в нескольких аспектах - к модулям системы (справочникам, журналам документов, отчетам) в целом, к выполнению отдельных операций над записями, к отдельным полям справочников. Права доступа к справочникам и журналам документов, в свою очередь, назначаются путем создания правил доступа двух типов - по группам и по подразделениям. Рассмотрим последовательно все способы назначения прав доступа.

 

Права доступа групп

 

Это - наиболее очевидный и наиболее востребованный способ назначения прав, который позволяет решить бОльшую часть задач администрирования, связанных с правами.

Создание, редактирование и удаление групп пользователей осуществляется через раздел "Права доступа" -> "Группы пользователей" Интерфейса администратора. Кроме выполнения указанных операций, здесь можно увидеть список пользователей, состоящих в каждой группе.

Назначение прав осуществляется через раздел "Права доступа" -> "Права доступа групп" Интерфейса администратора. В списке слева необходимо выбрать группу, для которой будут устанавливаться права. Справа появится список журналов документов, отчетов и справочников, на которые можно установить права.

Наиболее простым является назначение прав на отчеты. Для каждого отчета можно выбрать, будут ли иметь пользователи данной группы права на доступ к нему.

Для справочников и журналов документов задание прав начинается с установки прав доступа по умолчанию: нет, просмотр или полный. Если в справочнике или журнале документов присутствует одно или несколько полей, в которых содержится ссылка на пользователя системы (менеджер, автор и т.д.), можно отметить эти поля, и выбрать уровень доступа, который будет предоставляться, если выбранный в этом поле какой-либо записи пользователь соответствует текущему. Иными словами, сотрудник может иметь доступ по умолчанию к справочнику "Клиенты", равный "нет", в связи с чем он не будет видеть записей этого справочника; однако, если установить контроль принадлежности записи по полю "Менеджер", и в результате проверки предоставлять доступ "Полный", то сотрудник будет иметь полный доступ к тем клиентам, которые за ним закреплены (в свойствах которых он выбран в поле "Менеджер"). Если нужно предоставлять привилегированный доступ к клиенту сразу нескольким пользователям, можно создать дополнительные поля в справочнике ("Менеджер 2", "Менеджер 3" и т.д.), и установить контроль прав также по ним.

Пример настройки проверки прав доступа по нескольким полям, для журнала документов "Обращения к сотрудникам"


Для журналов документов существует еще один вид настройки доступа по умолчанию - "По клиенту". Если он выбран, то пользователь будет иметь такие же права к документам этого журнала, какие он имеет к клиенту, который выбран в свойствах документа.

 

Алгоритм проверки прав доступа по группе можно представить следующим образом:

 

Получить уровень доступа по умолчанию

Если доступ по клиенту (для журналов документов)

Получить уровень доступа к клиенту

Иначе, Если требуется проверить принадлежность записи:

Если принадлежность записи подтверждена:

Использовать уровень доступа к привилегированным записям

Конец Если

Конец Если

Если доступ = полный

Получить список доступных операций

Конец Если

 

Контроль прав на уровне операций

 

Если правило доступа по группе допускает при каких-то обстоятельствах, что пользователь может получить полные права доступа к записи, в форме настройки правила доступа появится три переключателя - Создание, Редактирование, Удаление. Если не отметить ни один, пользователю будут доступны все три операции с теми записями этого справочника или журнала, к которым он имеет полные права доступа. Если отмечен хотя бы один переключатель, то будут доступны только отмеченные операции.

Важно отметить, что вновь создаваемые записи будут автоматически присваиваться пользователю (он будет выбираться в поле "Менеджер", если таковое присутствует), чтобы он получал к ним привилегированные права доступа, если установлен контроль принадлежности записи.

 

Правила доступа подразделений

 

Правила доступа подразделений создаются в разделе "Права доступа" -> "Права доступа подразделений" Интерфейса администратора. Каждое правило характеризуется следующими параметрами:

  • Название правила;
  • Подразделение;
  • Модуль
  • Права
  • Проверять принадлежность записи
  • Поле для проверки принадлежности записи;
  • Права
  • Применить правило ко всем вложенным подразделениям.

Каждое правило действует на сотрудников определенного подразделения и применяется к определенному модулю. Таким образом, может потребоваться создание большого количества правил для различных модулей и подразделений. Для каждого модуля и подразделения может быть создано неограниченное число правил, в т.ч. несколько правил могут быть созданы для одной и той же комбинации модуля и подразделения. Правила создаются только для модулей-справочников и журналов документов.

Поле "Права" определяет права по умолчанию, которые будут иметь сотрудники данного подразделения к записям данного модуля. Также, как и в случае прав по группе, можно установить проверку принадлежности записи подразделению (не пользователю) по какому-либо полю. Поле должно являться ссылкой на справочник Подразделения, в системе такие поля обычно отображаются в виде дерева (как поле "Подразделение, обслуживающее организацию" в справочнике "Клиенты"). Можно выбрать права, которые будут предоставлены сотрудникам подразделений, на которые действует правило, к записям, прошедшим проверку принадлежности. Наконец, можно установить переключатель "Применить правило ко всем вложенным подразделениям".

Важно понимать, каким образом происходит определение правил, которые должны применяться в каждом конкретном случае. Для пользователя определяется список всех подразделений, к которым он относится, путем прохода вверх по дереву подразделений начиная от того, в котором он относится (т.е. если иерархия подразделений включает цепочку "Главный офис" - "Отдел продаж" - "Группа А", и пользователь находится в контейнере "Группа А", то на него будут действовать правила, созданные для всех трех подразделений, если в свойствах правил, относящихся к "Главному офису" или "Отделу продаж", установлен переключатель "Применить ко вложенным подразделениям".

Правила доступа по группе и по подразделениям применяются последовательно, и выбирается наиболее строгий вариант доступа. То есть, если планируется разграничивать доступ к справочнику "Клиенты" в основном на уровне подразделений, на уровне групп следует предоставить всем группам полный доступ - ограничивать его будут правила доступа по подразделению. Алгоритм сочетания прав доступа по группе и подразделению выглядит следующим образом:

 

Получить уровень доступа по группе

- определить уровень по умолчанию;

- определить привилегированный уровень, если он больше,

использовать его.

Получить уровни доступа по всем применимым правилам

- определить уровень по умолчанию;

- определить привилегированный уровень, если он больше,

использовать его.

Выбрать минимальный уровень из всех правил по подразделениям и группе

 

Пересчет прав

 

Для улучшения быстродействия при отображении списков записей и предоставлении доступа к ним index.CRM использует кэширование прав доступа. Это означает, что в базе данных хранится полный набор информации о правах доступа каждого пользователя к каждой записи - кэш. Фрагменты кэша автоматически пересчитываются при создании/удалении/изменении записей и пользователей, но после изменения прав доступа кэш надо пересчитывать вручную. После того, как вы выполнили всю требуемую настройку прав, нужно зайти в раздел "Права доступа" -> "Вычисление прав доступа" Интерфейса администратора, и нажать присутствующую там кнопку пересчета. При большом объеме данных пересчет может занять длительное время. Также важно при большом объеме данных и кэша правильно настроить параметры работы с памятью MySQL - информация об этом приводится на нашем сайте в разделе "Решение проблем".

 

Эффективные права

 

Так как механизм прав доступа достаточно сложен, существует специальный инструмент для диагностики проблем, возникающих с ним. В разделе Интерфейса администратора "Права доступа" -> "Пользователи системы" можно выбрать определенного пользователя, и перейти на закладку "Эффективные права". Здесь можно выбрать справочник или журнал документов, затем - конкретную запись из него, нажать кнопку "Показать", и увидеть текстовое представление алгоритма, по которому определяются права доступа данного пользователя к этой записи. В описание включается применение всех действующих в данном случае правил. Обратите внимание на то, что в конце выводятся два значения прав доступа - рассчитанное по алгоритму, и хранящееся в кэше прав доступа. Если эти значения не совпадают - необходимо сохранить права доступа для какой-либо группы и выполнить пересчет прав.


ЧАСТЬ 2. НАСТРОЙКА ПАРАМЕТРОВ РАБОТЫ СИСТЕМЫ

 

В этой части руководства описывается работа с инструментами, доступными в меню "Конфигурация" и "Справочники" Интерфейса администратора - за исключением управления структурой модулей, настройки условий фильтрации и работы со скриптами (сценариями), о которых идет речь в следующей части.

 

Константы

 

Константы управляют различными аспектами поведения системы. Подробное описание действия каждой из констант приведено в соответствующих разделах Документации пользователя. Здесь мы приведем общий список констант с кратким указанием назначения каждой из них.

 

Блокировать документы до даты (YYYY-MM-DD)

Позволяет заблокировать для редактирования все документы, созданные до указанной даты.

Вести учет по нескольким организациям

Если деятельность компании ведется от имени нескольких юридических лиц, эта константа позволяет активировать соответствующую функциональность.

Время жизни сессии, ч.

Время неактивности, после которого сессия пользователя в системе автоматически прекращается (если подключен чат, эта константа практически не имеет значения, т.е. чат сам обращается к серверу с определенными интервалами). Если очистить значение константы, сессия не будет устаревать.

Выделять НДС

Определяет, использует ли компания общую или упрощенную систему налогообложения.

Высота списка

Высота списков записей в справочниках и журналах документов, по умолчанию.

Граница "старой" задолженности, дней

Для блока отслеживания просроченной задолженности

Граница просроченной задолженности по умолчанию, дней

Для блока отслеживания просроченной задолженности

Группы менеджеров

Содержит перечисление через запятую идентификаторов групп пользователей, которые могут быть выбраны в поле "менеджер" в свойствах любой записи, и выводятся в специфических отчетах по производительности менеджеров. Если очистить эту константу, выступать в роли менеджера сможет любой пользователь.

Дискретность планирования

Определяет период, на который устанавливаются значения планов по параметрам планирования.

Использовать чат

Включает/отключает окно чата на всех страницах системы.

Использовать штрих-коды

Включает встраивание штрих-кодов в стандартные печатные формы. На компьютерах пользователей должен быть установлен шрифт Free3of9.

Каталог с импортируемыми файлами

Каталог, откуда импортируются выгрузки 1С.

Конечный год

Максимальное значение года, которое выводится в выпадающих списках.

Максимальное число элементов в выпадающем списке

Определяет способ выбора значений поля в фильтре. Если набор значений (например, количество менеджеров для поля "Менеджер") меньше указанного числа, будет использоваться выпадающее меню, если больше - вводится подстрока.

Максимальный размер фото, X, пикс.

Максимальные размеры фото персоны

Максимальный размер фото, Y, пикс.

Начальный год

Минимальное значение года, которое выводится в выпадающих списках. Если установить слишком "старый" год, это может замедлить работу форм.

Наша фирма

Запись из справочника "Клиенты", в которой хранится информация о самой компании-владельце системы.

Показывать все задачи по клиенту

Позволяет обойти систему разграничения прав доступа и показывать в карточке клиента все задачи по нему, а не только те, к которым имеет права доступа текущий пользователь.

Показывать список клиентов всем пользователям

Позволяет обойти систему разграничения прав доступа и показывать в окне подбора клиентов всех клиентов, а не только тех, к которым имеет права доступа пользователь. Полезно для реализации функции "пробивки" наличия клиента в базе.

Поправка времени (сек.)

Вводит поправку времени системы относительно времени сервера, на котором она установлена. Полезно, если офис компании и сервер системы находятся в разных часовых поясах.

Разрешать групповые операции группам пользователей

Перечисление через запятую групп пользователей, которые смогут удалять группы записей и присваивать им значения.

Ставка НДС

Величина, в процентах, ставки НДС.

Финальная стадия процесса продаж

Числовое значение (см. Стандартные списки - Стадии продаж) стадии процесса продаж, на которой завершается анализ (для прогноза и воронки). Дальнейшие стадии могут использоваться для отражения послепродажной работы с клиентом.

Чат: хранить историю

Позволяет хранить и просматривать историю переговоров сотрудников

Чат: частота опроса (закрытое окно)

Интервал в секундах, с которым обновляется окно чата в закрытом состоянии. Косвенно является точностью определения времени прекращения сеанса работы в системе.

Чат: частота опроса (открытое окно)

Интервал в секундах, с которым обновляется окно чата в открытом состоянии.

Число элементов в списке

Число записей на страницу во всех списках в справочниках и журналах документов системы.

 

Параметры монитора и планирования, настройка уведомлений

 

Эти разделы Интерфейса администратора имеют похожую функциональность и определяют набор соответственно параметров монитора (на главной странице, внизу справа), параметров планирования (которые задаются в свойствах каждого пользователя) и уведомлений на главной странице. Для каждой записи в этих справочниках задается набор групп пользователей, которые будут иметь доступ к соответствующему параметру или уведомлению.

Для параметров монитора и планирования необходимо задать SQL-условие, по которому они вычисляются. Для этого необходимо знакомство с архитектурой и структурой базы данных системы, и знакомство с языком SQL. Запросы, являющиеся параметрами монитора, выполнятся ежедневно при первом запуске системы, и фиксируют текущие значения каких-либо показателей. Эти значения сохраняются в специальной таблице и затем отображаются в мониторе. В отличие от них, запросы, являющиеся параметрами планирования, выполняются каждый раз, когда открывается страница, содержащая значения этих параметров. В запросах на вычисление параметров планирования можно использовать специальные макросы, которые заменяются на конкретные значения в момент выполнения:

-         _USER_ - идентификатор текущего пользователя;

-        

_PERIOD_ - условие на период планирования, по полю date;

-         _PERIOD_START_ - дата начала периода;

-         _PERIOD_END_ - дата окончания периода.

Уведомления на главной странице представляют собой отдельные PHP-модули со своей логикой работы и шаблонами вывода. В этом разделе интерфейса администратора они только подключаются, а также определяются права доступа к ним.

 

История значений

 

В этом разделе Интерфейса администратора сосредоточена функциональность по управлению историей значений полей всех справочников и журналов документов. При изменении значения любого поля любой записи система сохраняет дату, время, автора изменения, и присвоенное значение. Это позволяет в дальнейшем отслеживать историю изменений и, при необходимости, редактировать ее. Кнопка просмотра истории значений (в виде серого кружка) расположена справа от всех полей в формах редактирования записей в самой системе, значения которых изменялись более, чем один раз. Если пользователь находится в системе с правами администратора, имеющего доступ к интерфейсу, в диалоговом окне просмотра истории он может нажать кнопку "Редактировать", которая откроет в новом окне соответствующую страницу интерфейса администратора.

Попасть на эту страницу можно и путем входа в раздел "Конфигурация" -> "История значений", выбора модуля в левой части страницу, затем выбора поля в правой части. После этого надо ввести идентификатор записи - узнать его можно, посмотрев на URL страницы в системе, где открыта данная запись (идентификатор записи равен значению параметра idi; может потребоваться переход на какую-либо закладку, чтобы этот параметр появился в строке URL).

После этого вы увидите таблицу, в которой присутствуют столбцы:

-         Отображаемое значение (актуально для полей, являющихся указателями на другие таблицы);

-         Значение (хранимое в базе данных);

-         Дата установки;

-         Кем установлено.

Вы можете изменить значения или даты их установки, а также удалить определенные записи из истории. Важно помнить, что история значений используется в некоторых случаях для печати документов, а также в работе отдельных отчетов. Например, если у клиента изменился адрес, то при печати товарных накладных, созданных до даты присвоения нового адреса, будет использоваться старый адрес, а в более новых накладных - новый.

 

Удаление объектов

 

Записи справочников и журналов документов, удаляемые из системы, не удаляются из базы данных, а только помечаются на удаление. Это позволяет использовать их значения: например, если удалить клиента (не стирая его из базы данных), название клиента по-прежнему будет отображаться в связанных с ним документах (например, в контактах с данным клиентом).

Особенно важна эта особенность для каталога товаров. Если удалить товар из каталога, но не удалять его из "корзины", то он по-прежнему будет содержаться в табличных частях всех счетов и продаж, куда ранее был добавлен. Если очистить корзину и удалить товар окончательно, он исчезнет из табличных частей, следовательно - изменится сумма документов, нарушится баланс взаиморасчетов с клиентом. Поэтому к окончательному удалению объектов, доступному в этом разделе Интерфейса администратора, следует подходить очень осторожно, и удалять только те объекты, на которые не осталось ссылок в других данных системы.

 

Настройки поиска

 

Для включения в системе возможности полнотекстового поиска администратор должен воспользоваться разделом "Конфигурация" -> "Настройки поиска" в Интерфейсе администратора. Форма в правой части страницы позволяет создать новые объекты поиска. Для этого нужно указать три параметра: русское название объекта (например, "Клиенты"), имя таблицы базы данных (например, "clients" - Узнать имя таблицы базы данных для того или иного модуля можно в разделе "Разделы разработчика" -> "Модули системы" Интерфейса администратора. Название таблицы отображается в поле "код" свойств модуля.) и переключатель "активен".

После того, как объект поиска создан, под формой свойств объекта появится форма с набором полей, по которым может осуществляться поиск (выводятся только поля типа "строка" и "текст"). Нужно отметить те поля, по которым будет производиться поиск, и нажать кнопку "Сохранить" внизу страницы.

После этого рядом с панелью инструментов списка объектов поиска появится кнопка "Необходимо перестроить индекс" (оранжевого цвета, с изображением восклицательного знака). На эту кнопку необходимо нажать - иначе индекс не будет построен, и поиск осуществляться не будет. После нажатия на кнопку появляется диалоговое окно "перестроить индекс", в котором перечислены поля, по которым будет строиться индекс, и есть возможность запустить процедуру его построения. При добавлении новых записей в проиндексированные таблицы или их изменении индекс будет обновляться автоматически.

Когда индекс построен, в пользовательской части системы появится строка "поиск объектов:" (слева от строки поиска клиентов в серой строке панели инструментов, присутствующей на всех страницах системы). Поиск производится по словам (поиск по подстрокам не производится). Система находит объекты, в проиндексированных свойствах которых встречаются слова, перечисленные в запросе. При этом учитывается морфология русского языка, то есть, если задано условие поиска "центр", будут найдены также объекты, содержащие слова "центра", "центром" и т.д. Если в запросе введено несколько слов, то сначала выводятся результаты, содержащие все введенные слова, затем - какие-либо из введенных слов.

 

Импорт/экспорт. Интеграция с 1С

 

Эта функциональность доступна в разделе "Конфигурация" -> "Импорт/экспорт" Интерфейса администратора. Интеграция с 1С часто настраивается индивидуально в конкретных внедрениях, зависит от набора переносимых данных и направления переноса. Ниже описана типовая последовательность действий при интеграции с 1С 8.1.

 

Для работы системы синхронизации документов ЖЕЛАТЕЛЬНО, чтобы контрагенты и номенклатура, хранящиеся в CRM и обеих копиях 1С, были синхронизированы по коду, а договоры - по номеру.

 

Перенос платежей из 1С 8.1

 

Для выгрузки платежей необходимо запустить 1C, открыть в ней меню Файл -> Открыть, выбрать обработку 1CtoCRM.epf. Выберите собственное юридическое лицо, период, за который происходит выгрузка, нажмите кнопку "Заполнить". На закладке "Оплата" вы увидите список выгружаемых платежей. ВНИМАНИЕ: наличные платежи пока не выгружаются! Выберите каталог, в который должен быть помещен файл выгрузки (обычно это специальная папка на сервере CRM, к которой предоставлен общий доступ). Нажмите кнопку "Выгрузить" - данные будут сохранены.

Затем необходимо зайти в CRM, Интерфейс администратора -> Конфигурация -> Импорт/Экспорт -> Импорт платежей из 1C, выбрать период, компанию, для которой производится выгрузка (если CRM настроена на работу с несколькими юридическими лицами). После нажатия кнопки "Импортировать" система выдаст список загруженных платежей. ВНИМАНИЕ! Все контрагенты, по которым импортируются платежи, должны быть синхронизированы по коду между 1C и CRM (обычно синхронизация происходит на стадии переноса счетов из CRM в 1C, об этом см. далее). Если какой-либо контрагент не найден, платеж по нему не будет импортирован.

Также в таблице импортируемых платежей осуществляется сопоставление платежей счетам. Для тех платежей, которым найдено соответствие (существует не оплаченный счет тому же контрагенту на ту же сумму), происходит автоматическое сопоставление платежа счету. Если не удается найти таким образом счет, администратор, выполняющий импорт, сможет сопоставить платежу счет вручную (для этого при импорте будет выведен список платежей, для которых не удалось обнаружить счет; рядом с каждым таким платежом расположено выпадающее меню, в котором будут перечислены все неоплаченные счета для данного контрагента). Также администратор сможет снять переключатель около тех платежей, которые переносить не нужно (например, они не относятся к основному виду деятельности). После подтверждения выполнения операции происходит импорт платежей в 1С.

 

Перенос данных в 1С 8.1

 

Каждая запись справочников "Клиенты" и "Каталог товаров и услуг" в CRM содержит поле "Код 1С", которое позволяет синхронизировать их с соответствующими справочниками 1C.

Для выполнения экспорта документов из index.CRM нужно зайти в Интерфейс администратора -> Конфигурация -> Импорт/Экспорт -> Экспорт в 1С, выбрать период, компанию, для которой производится выгрузка (если CRM настроена на работу с несколькими юридическими лицами), отметить типы данных (счета, продажи), которые нужно перенести.

После того, как данные будут выгружены, оператор 1C должен произвести их загрузку в 1C. Оператор должен открыть 1C, пункт меню Файл -> Открыть, указать обработку CRMto1C.epf. На закладке "Счета" или "Счет-фактуры" (при работе с этой закладкой фактически создаются два документа - "Счет-фактура" и "Реализация товаров и услуг" для каждого документа "Продажа" из CRM) нужно выбрать собственное юридическое лицо, к которому будут относиться создаваемые документы, и файл с выгрузкой (exp_schet.csv для счетов, exp_act_sf.csv для продаж; файлы обычно находятся в специальной папке на сервере CRM, к которой предоставлен общий доступ). Будет выполнен импорт данных, при котором система для каждого выгруженного из CRM счета или продажи выполнит следующую последовательность действий:

  1. Если в CRM был указан код контрагента 1C, то попробует найти его по коду;
  2. Затем попробует найти контрагента по наименованию;
  3. Если обе попытки не удались - создаст нового контрагента в 1C и выведет сообщение с его кодом. Этот код необходимо вписать в поле "Код 1C" в CRM для соответствующего клиента.
  4. Если импортируются продажи, и покупатель отличен от грузополучателя - та же процедура будет выполнена для грузополучателя. Система считает грузополучателем того клиента, который указан в продаже, а покупателем - его родительскую организацию, если таковая выбрана в свойствах клиента в CRM (если не указана, то грузополучатель и покупатель будут одним лицом).
  5. Затем будет предпринята попытка найти по наименованию (номеру) договор между покупателем и организацией, для которой выполняется импорт. Если в CRM в документе договор не выбран - используется "Основной договор". Если договор в 1С не найден - он будет создан, о чем обработчик выдаст сообщение.
  6. Далее, для каждого товара, перечисленного в табличной части документа, система выполнит поиск в справочнике номенклатуры 1C по коду (если указан), затем по краткому наименованию, при отсутствии товара - создаст его.

Внимание: если были внесены изменения в какие-либо счета и продажи "задним числом", т.е. уже после того, как документы были перенесены в 1C, эти изменения нужно будет сделать в 1C вручную. Для этого можно, например, при внесении изменений в CRM "задним числом" создавать задачи оператору 1C по коррекции соответствующих документов в этой системе.

 

Помимо интеграции с 1С, в системе присутствует возможность импорта списков клиентов из Excel. Работа этого инструмента рассматривается в Документации пользователя.

 

Служебные справочники

 

В меню "Справочники" Интерфейса администратора содержатся средства управления служебными справочниками: списками единиц измерения, видов контактов, типов задач, групп клиентов, а также так называемыми стандартными списками. Работа с последними рассматривается ниже, при рассмотрении вопросов управления структурой справочников и журналов документов, в разделе "Создание полей-указателей".

Управление первыми тремя видами служебных справочников тривиально, и сводится к созданию/редактированию/удалению записей, имеющих только одно свойство - название. Отличается от них работа по созданию типов задач: для каждого типа задач необходимо выбрать тип документа-результата (по умолчанию будет использоваться документ "Контакт"). Создание этого документа с подходящими параметрами (клиент, менеджер) будет автоматически помечать задачу как выполненную. Например, если при автоматизации деятельности юридической компании вы создали тип задач "Участие в судебном заседании", логично будет создать журнал документов "Отчет о заседании", и выбрать в свойствах указанного типа задач этот журнал в качестве хранилища документов-результатов.

 

ЧАСТЬ 3. УПРАВЛЕНИЕ СТРУКТУРОЙ СИСТЕМЫ

 

Управление структурой справочников и журналов документов

 

Задачи по управлению справочниками и журналами документов подразделяются на две категории: управление структурой (создание/редактирование/удаление) полей и управление условиями фильтрации.

 

Управление структурой справочников и журналов документов

 

Для этой цели предназначен раздел "Справочники" меню "Конфигурация". В левой части страницы отображается список модулей системы. После щелчка по какому-либо модулю в правой части страницы отображается страница, содержащая выпадающее меню со списком существующих полей и форму для создания нового поля.

Поля подразделяются на два основных типа: "предустановленные" (свойства которых определяются логикой системы) и созданные пользователем. Общее правило таково: если имя поля в явном виде используется в программных модулях, т.е. задействовано в логике работы системы, оно является предустановленным; если поле несет только информационный характер, оно является пользовательским.

Свойства предустановленных полей не могут быть изменены. При выборе такого поля в выпадающем меню на странице управления справочниками форма свойств поля отображается с заблокированными полями.

Свойства пользовательских полей могут изменяться, и зависят от типа поля. В общем случае, поле имеет следующие свойства:

-         Название, под которым поле отображается в системе;

-         Имя поля в базе данных (Задается один раз, при создании поля, и не может быть изменено. Отображается в заголовке таблицы редактирования свойств поля. Может состоять из английских букв, цифр и символа подчеркивания);

-         Тип (см. описание типов полей ниже);

-         Приоритет. Число, определяющее порядок следования полей в форме редактирования записи. Предустановленные поля всегда идут вперед пользовательских. Чем больше число, тем выше позиция поля в форме.

-         Флаг "Обязательно для заполнения". Если установлен, система требует обязательного ввода значения этого поля при создании/редактировании записи.

-         Флаг "Дополнительное поле". Если установлен, поле находится в скрытом блоке под формой редактирования записи, отображаемом при нажатии на ссылку "Дополнительные поля >>".

-         Значение по умолчанию. Если при создании записи значение этого поля не введено пользователем, полю будет присвоено значение по умолчанию.

-         Флаг "Индекс". Если установлен, в базе данных создается индекс по этому полю. Данный флаг нужно использовать с осторожностью, т.к. создание большого числа индексов может привести к снижению скорости работы системы. Фактически, имеет смысл создание индексов по полям, являющимся указателями на другие таблицы данных;

-         Условие показа. Некоторые поля могут отображаться в форме свойств записи только при определенных условиях. Здесь можно указать условие, при котором поле будет отображаться (если ничего не указано, поле будет отображаться всегда). Условие представляет собой SQL-выражение, которое включается в запрос на выборку текущей записи, и если оно принимает значение "истина" - поле будет показано. Например, если мы хотим, чтобы поле в справочнике клиентов показывалось только при определенном значении поля "группа" (=8), то условие показа будет выглядеть так: cgroup=8. При создании записи отображается полный набор полей.

 

В index.crm могут существовать поля следующих типов:

-         Строка (до 255 символов);

-         Пароль (хранится в зашифрованном виде, при вводе отображается звездочками);

-         Целое число;

-         Дата;

-         Дата и время;

-         Указатель (Поле, ссылающееся на данные какой-либо другой таблицы. Например, поле "менеджер" ссылается на данные таблицы users (пользователи). Выбор значения происходит при помощи выпадающего меню);

-         Указатель на большой массив (Поле, ссылающееся на таблицу, содержащую большое количество данных. Единственное отличие от поля "указатель" - то, что выбор значения происходит при помощи всплывающего окна, в котором осуществляется подбор записи по подстроке - например, выбор клиента);

-         Текст (многострочное поле ввода, без ограничений на длину текста);

-         Флаг (переключатель).

 

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

-         Таблица - имя таблицы базы данных, на которую ссылается поле (например, clients).

-         Поле-идентификатор - имя поля-идентификатора в таблице, на которую ссылается данное поле. Всегда равно id, кроме случая, когда ссылка идет на пользовательские справочники (таблица standard_list_options, редактируются при помощи раздела "Справочники" -> "Стандартные списки") - в этом случае имя идентификатора будет value.

-         Поле-название - имя поля, содержащего название записи. Обычно равно name (для справочников) или number (для журналов документов). Могут использоваться SQL-выражения.

-         Условие выборки. Для ввода этого условия требуется знание языка SQL. Условие может содержать произвольные логические выражения и обращаться к данным как исходной таблицы, так и той, на которую ссылается поле. Выражение должно иметь вид WHERE : (например, WHERE ugroup=2 для выборки только менеджеров из таблицы users). В условии можно использовать два специальных шаблона - _USERID_ для подстановки идентификатора текущего пользователя и _RECORD_ID_ для подстановки идентификатора исходной записи.

-         Порядок сортировки. Имя поля в таблице, на которую ссылается данное поле, или SQL-выражение для сортировки записей таблицы в выпадающем меню.

-         Диалог. Это свойство имеет значение только для полей типа "указатель на большой массив данных" и содержит имя диалогового окна, при помощи которого происходит выбор записи. Например, для выбора клиента имя диалога - /dialogs/FindClient.php. Для выбора записи из какой-либо другой таблицы может использоваться стандартный диалог /dialogs/ChooseRecord.php или диалог, созданный программистом по образцу FindClient.php.

 

Следует иметь в виду, что при удалении поля в разделе "Конфигурация" -> "Справочники" происходит физическое удаление соответствующего поля из базы данных и потеря хранившейся там информации.

 

Создание полей-указателей

 

Предположим, требуется создать поле, в котором можно будет выбрать значение из какого-либо другого справочника или журнала документов. Например, нужно создать в журнале документов "Контакты" поле "Товар" для хранения ссылки на товар, по поводу которого происходило общение. Товары хранятся в таблице goods. Нужно задать следующие свойства поля:

Название - Товар

Имя поля в SQL - good

Тип - указатель

Сохранить поле. Затем продолжить ввод свойств:

Таблица - goods

Поле-идентификатор - id

Поле-название - name

Порядок сортировки - name ASC

 

Отдельный случай - создание указателей на так называемые "Стандартные списки". Эти списки используются для хранения каких-либо перечислений - типов, видов чего-либо и т.д. Например, мы хотим присвоить клиенту свойство "Статус", которое может принимать значения "Обычный" и "Золотой". Для этого нужно сначала создать справочник, в котором будут храниться оба значения. В разделе "Справочники" -> "Стандартные списки" Интерфейса администратора нажимаем "Новая запись" и вводим название нового списка. После нажатия кнопки "Создать" наш список можно будет выбрать в перечне в левой части страницы. Нужно перейти на вторую закладку свойств списка, "Элементы списка". Здесь пользователь может ввести набор возможных значений перечисления. Например, введем в поле Текст слово "Обычный", в поле Значение - 1; после нажатия кнопки "Создать" выберем в выпадающем меню пункт "Новая запись", введем в поле Текст слово "Золотой", в поле Значение - 2. Список создан. На первой закладке ("Свойства списка"), в заголовке формы редактирования свойств списка, указан его идентификатор (например, 10). Это число нужно запомнить.

Следующий шаг - создание поля. Переходим в раздел "Конфигурация" -> "Справочники", выбираем справочник "Клиенты", заполняем форму свойств нового поля:

Название - Статус

Имя поля в SQL - status

Тип - указатель

Сохранить поле. Затем продолжить ввод свойств:

Таблица - standard_list_options

Поле-идентификатор - value

Поле-название - text

Условие - WHERE list=10 (идентификатор списка)

Порядок сортировки - text ASC

 

Указатели на большие массивы данных

 

Если для поля типа "Указатель на большой массив данных" используется диалог ChooseRecord.php, для его правильной работы необходимо указать параметры doctype=идентификатору модуля (см. раздел "Основные модули системы"), на таблицу которого ссылается поле, docname=название типа документов для отображения, condition=SQL-условие (в нем также можно использовать специальные шаблоны).

Рассмотрим пример. Пусть нам требуется добавить в справочник "Клиенты" поле "Продажа", которое будет хранить ссылку на какую-либо продажу, сделанную данному клиенту. Для этого нужно создать поле типа "Указатель на большой массив данных", и задать следующие параметры:

Таблица - sales

Поле-идентификатор - id

Поле-название - CONCAT(IFNULL(number,''), ' от ',date) (или можно просто number)

Условие выборки - WHERE client=_RECORD_ID_

Порядок сортировки - date DESC

Диалог - /dialogs/ChooseRecord.php?doctype=7&docname=Продажи&condition=client=_RECORD_ID_

 

Как мы видим, в URL диалога включены параметры doctype, docname и condition.

Поля "условие выборки", "порядок сортировки" и выражение condition в поле "диалог" являются частями SQL-выражений.

ПРИМЕЧАНИЯ:

1.                 В SQL-выражениях для задания строковых переменных можно использовать символы апострофа, но не двойной кавычки.

2.                 Для полей типа "указатель на большой массив данных", у которых в свойстве "Поле-название" указано сложное SQL-выражение, при вызове диалогового окна истории значений поля это выражение подменяется на идентификатор записи (id), соответственно, в диалоге истории выводится число (например, идентификатор продажи) вместо ее описания. Это сделано с целью защиты от SQL-инъекций, во избежание передачи SQL-выражения через запрос URL.

 

 

Права доступа на уровне полей

 

Система index.crm позволяет управлять правами доступа к справочникам на уровне отдельных полей. При редактировании поля, под формой его свойств находится таблица, в которой перечислены все существующие в системе группы пользователей. Администратор имеет возможность установить какой-либо уровень доступа для каждой группы. Таким образом, становится возможным создать индивидуальное представление справочника для пользователей каждой группы: каждый пользователь сможет видеть в справочнике только те поля, которые ему необходимы в соответствии с его ролью.

Общие права доступа к записи имеют больший приоритет, чем права доступа к какому-либо полю, поэтому, например, если для какой-то группы установлен полный доступ к полю "Название" в свойствах клиента, пользователь этой группы сможет изменить название только в том случае, если имеет полные права доступа к записи в целом.

 

Параметры фильтрации и сортировки

 

Каждый справочник или журнал документов может быть отфильтрован и отсортирован по различным параметрам. Эти параметры также участвуют в построении условий динамических фильтров, могут быть выведены в столбцы списка записей журнала или справочника.

Управление параметрами фильтрации производится в разделе "Конфигурация" -> "Условия фильтрации" Интерфейса администратора. После выбора справочника или журнала документов в таблице, расположенной слева, в правой части страницы открывается список полей данного модуля. При этом некоторые поля (пользовательские, а также те из предустановленных, которые описаны в самой системе) помечены звездочкой, их свойства не могут быть изменены. Для остальных полей имеется возможность ввести имя, под которым это поле будет появляться в диалоговых окнах фильтрации и сортировки, а также указать тип. Для использования при фильтрации и сортировке будут доступны только те поля, рядом с которыми отмечены переключатели. После внесения изменений в эту таблицу ее необходимо сохранить при помощи расположенной внизу кнопки.

Кроме свойств самих документов или элементов справочника, фильтрацию и сортировку можно осуществлять и по различного рода вычисляемым параметрам. Некоторые из них существуют в базовой версии системы - например, "Сумма продаж", "Баланс" для клиента. Значения этих параметров вычисляются динамически каждый раз при обращении к записи, на основании данных других модулей системы. Имеется возможность создавать такие параметры в Интерфейсе администратора; для этого требуется знание языка SQL. Необходимую для составления подзапросов информацию о структуре базы данных index.CRM можно получить во второй части настоящего руководства, а также в разделе "Конфигурация"=>"Справочники" Интерфейса администратора.

Создание параметров происходит на закладке "Подзапросы и вызовы функций" страницы редактирования параметров фильтрации справочника. Каждый подзапрос имеет следующие свойства:

- Название, под которым он будет фигурировать в системе;

- SQL-выражение для вычисления возвращаемого значения;

- Тип возвращаемого значения;

- Флаг "активен".

При сохранении подзапроса происходит проверка SQL-выражения, и в случае, если оно содержит ошибки, сохранение не производится.

При составлении выражения необходимо иметь в виду, что оно включается в запрос по выборке данных из таблицы справочника или журнала документов, т.е. в выражение такого вида:

SELECT *,[подзапрос] FROM clients WHERE :

Соответственно, подзапрос может содержать обращения к полям исходной таблицы (например, clients.status). Если подзапрос обращается к другой таблице базы данных, он должен быть заключен в скобки. Также подзапрос может содержать вызов stored функций SQL-сервера (создание этих функций производится внешними средствами).

Приведем пример. Пусть нам нужно добавить к свойствам клиента параметр "Число контактов". Подзапрос будет выглядеть так:

(SELECT COUNT(*) FROM contacts WHERE contacts.client=clients.id)

Тип результата - целое число.

 

Создание модулей системы

 

Новый модуль системы можно создать при помощи раздела "Конфигурация" -> "Конструктор модулей". При входе в этот раздел отображается форма выбора шаблона модуля. Возможно создание модулей следующих видов:

- Журнал простых документов (пример - журнал "Контакты");

- Журнал документов с табличной частью (пример - журнал "Счета");

- Простой справочник (пример - справочник "Клиенты");

- Иерархический справочник (пример - справочник "Каталог товаров и услуг").

Автоматическое создание отчетов в системе не предусмотрено. Программист может создать отчет на основе любого существующего отчета с наиболее подходящей формой настройки параметров.

 

При создании модуля в системе создаются следующие элементы:

- одна или несколько таблиц базы данных (в зависимости от шаблона);

- описания полей таблицы (таблица list_props);

- условия фильтрации записей модуля (таблица filters_conditions);

- скрипт PHP, содержащий класс, соответствующий данному модулю (находится в папке /include, называется [имя модуля].php);

- шаблон программного модуля (таблица templates).

 

Если модуль системы создается программистом - сотрудником компании-дилера, можно указать номера, присвоенные данному модулю (запрашиваются в index.art): идентификаторы документа и модуля, а также число, с которого начинается нумерация условий фильтрации. Если эти номера не вводить, они будут присвоены автоматически, но перенос созданного модуля на другие копии системы будет невозможен.

Также программист имеет возможность сразу создать пакет. Для этого нужно отметить переключатель, расположенный внизу формы, и ввести номер пакета (полученный в index.art). Пакет будет сохранен в каталог _update в корневой директории системы. Полную информацию об использовании пакетов можно найти в третьей части настоящего руководства.

 

После того, как модуль создан по шаблону, к нему можно добавить дополнительные поля (см. "Конфигурирование справочников"), создать условия фильтрации, прикрепить формы для вывода на печать, создать типы задач, имеющих результатом создание документа данного типа. Программист может внести и более глубокие изменения, касающиеся логики работы модуля, в PHP-файл.

 

Свойства модуляc

 

Модули всех типов имеют следующий набор свойств, задаваемых при автоматическом создании:

-         Название модуля и таблицы БД (английский). Это название используется для обозначения модуля внутри системы - как имя файла, класса, основной таблицы БД, поэтому обязательно должно содержать только английские буквы. Пример: contacts.

-         Название модуля (русский). Это название используется для отображения модуля в меню системы. Пример: Контакты.

-         Название одного элемента (русский). Это название используется для обозначения одной записи, относящейся к данному модулю. Пример: Контакт.

-         Есть поле "клиент". Переключатель, обозначающий, что документы данного модуля имеют свойство "Клиент".

-         Есть поле "менеджер". Переключатель, обозначающий, что документы данного модуля имеют свойство "Менеджер".

-         Название поля "менеджер". Если был отмечен предыдущий переключатель, нужно ввести название поля "менеджер" в БД. Пример: manager. Для некоторых журналов документов имя пользователя, работающего с документом, имеет другой смысл, нежели manager, поэтому для сохранения логичности структуры базы данных предусмотрена эта возможность - ввести, например, название owner или author.

-         Есть шаблон печати. Если отметить этот переключатель, в шаблоне модуля будет предусмотрена форма выбора шаблона печати - "Печать в виде:".

 

Журнал простых документов

 

В дополнение к стандартным, при создании журнала простых документов можно указать следующие параметры:

-         Хранить время. Все журналы документов обязательно имеют поле date, которое хранит дату документа (по умолчанию - дату создания). Если отметить этот переключатель, это поле будет хранить не только дату, но и время.

-         Есть поле "номер". Если отметить этот переключатель, в БД будет создано поле number, имеющее смысл "номер документа".

 

Журнал документов с табличной частью

 

В дополнение к параметрам простого документа, для этого журнала можно задать:

-         Таблица, из которой берутся элементы для табличной части. Обычно происходит привязка товаров, но возможны и другие варианты - подбор пользователей и т.д. Пример: goods для товаров, users для пользователей.

-         Таблица разделов для привязываемых элементов. Если происходит привязка элементов иерархического справочника (такого, как товары или пользователи), нужно указать имя таблицы, в которой хранятся родительские элементы. Например, для товаров это categories, для пользователей - branches.

-         Название поля-ссылки на родительскую таблицу. Если происходит привязка элементов иерархического справочника, сюда нужно ввести название поля, которое ссылается из таблицы дочерних элементов на родительскую. Например, для товаров это category, для пользователей - branch.

-         Поле-название в привязываемой таблице. Название поля, в котором хранится имя записи (или SQL-выражение). Пример: name.

-         Поле-название в родительской таблице. То же для родительских таблиц иерархических справочников. Пример: name.

-         Хранить цену. Переключатель, обозначающий, что каждый товар в табличной части имеет цену, которую надо хранить в документе.

-         Хранить количество. Переключатель, обозначающий, что каждая запись табличной части имеет количество, которое надо хранить в документе.

 

Простой справочник

 

При создании простых справочников можно отметить переключатель "Названия записей уникальны". В этом случае в PHP-файл будет включена проверка на уникальность записей при их создании через справочник.

 

Иерархический справочник

 

Иерархические справочники хранят данные в двух таблицах: родительской и дочерней. Родительская таблица хранит список контейнеров, каждый из которых может содержать вложенные контейнеры или дочерние элементы. Примером иерархического справочника является модуль "Персонал", где данные о пользователях (таблицы users) хранятся в контейнерах-подразделениях (таблица branches).

 

При создании иерархического справочника такие параметры, как название таблицы БД, наличие полей, находящиеся в верхней части формы, относятся к родительской таблице БД. Параметры дочерней таблицы задаются в нижней части формы:

-         Название дочерней таблицы БД. Пример: items.

-         Название объектов (русский). Слово для обозначения объектов дочерней таблицы. Пример: Товары.

-         Название одного объекта (русский). Слово для обозначения объектов дочерней таблицы. Пример: Товар.

-         Название поля-ссылки на родительскую таблицу. Название поля в таблице БД, которое хранит идентификатор родительской записи. Пример: category.

-         Есть поле "клиент" в дочерней таблице. Переключатель, обозначающий, что записи дочерней таблицы имеют свойство "Клиент".

-         Есть поле "менеджер" в дочерней таблице. Переключатель, обозначающий, что записи дочерней таблицы имеют свойство "Менеджер" (ссылку на пользователя).

-         Название поля "менеджер" в дочерней таблице. Если отмечен предыдущий переключатель, нужно ввести название поля в БД (например, manager, author, owner:).

 

Создание пользовательских сценариев

 

Для работы с этим разделом документации требуются хотя бы минимальные знания языков SQL и PHP.

 

Для упрощения работы пользователя, автоматизации выполнения наиболее рутинных операций возможно создание в системе пользовательских сценариев - фрагментов квази-PHP-кода, вызываемых вручную пользователем либо инициируемых по определенным событиям. Сценарии создаются в разделе "Конфигурация -> Скрипты" Интерфейса администратора. Для каждого скрипта можно задать название, под которым он будет фигурировать в системе, выбрать страницу, с которой его можно будет запускать (либо со всех страниц), ввести код скрипта. На третьей закладке страницы свойств скрипта можно выбрать, какие группы пользователей смогут запускать этот скрипт.

Если текущий пользователь обладает правом запуска каких-либо скриптов с данной страницы системы, в строке панели инструментов системы, слева от формы поиска клиента, появится выпадающее меню выбора скрипта. Если пользователь выберет там какой-либо скрипт, начнется его выполнение.

 

Автоматический запуск скриптов

 

На второй закладке страницы редактирования скрипта находится форма, с помощью которой можно настроить запуск этого скрипта по расписанию. Если в этой форме выбран какой-либо переключатель, кроме первого ("Не запускать автоматически"), скрипт будет запускаться в соответствии с указанным расписанием, но не чаще 1 раза в сутки для каждого пользователя. Возможны следующие варианты задания расписания:

-         Ежедневно. Скрипт будет выполняться при первой перезагрузке страницы после указанного времени (см. ниже).

-         Еженедельно. Скрипт будет выполняться в указанный день недели, при первой перезагрузке страницы после указанного времени.

-         Ежемесячно. Скрипт будет запускаться в указанное число месяца (если нужно, чтобы скрипт запускался в последний день месяца независимо от конкретного числа, укажите любое значение, превышающее 31), при первой перезагрузке страницы после указанного времени.

Ниже этих переключателей располагаются поля "часов" и "минут", обозначающие время суток, начиная с которого будет автоматически запускаться скрипт. Эти поля действуют при выборе любого из перечисленных выше пунктов.

-         При входе в систему. Скрипт будет выполняться сразу после входа пользователя в систему (один раз в сутки!). Если пользователь не входил в систему в день, указанный в расписании, автоматический запуск будет пропущен.

Запуск по расписанию может быть привязан к пользователям:

-         К одному конкретному пользователю. Скрипт будет автоматически запускаться только для выбранного пользователя.

-         Для любого пользователя. Скрипт будет автоматически запускаться для любого (только одного - первого, кто перезагрузит страницу во время, удовлетворяющее условиям запуска) пользователя, принадлежащего к группе, для которой разрешен запуск этого скрипта.

-         Для всех пользователей. Скрипт будет автоматически запускаться в соответствии с условиями расписания по одному разу для каждого пользователя, входящего в группы, которым разрешен запуск скрипта.

 

ВНИМАНИЕ! Автоматически запускающиеся скрипты, а также скрипты-обработчики событий, могут отменять перенаправления с одной страницы на другую в системе. Это касается только интерактивных скриптов, т.е. взаимодействующих с пользователем при помощи объекта Dialog (см. ниже). Следует иметь это в виду и предупредить о возможных последствиях пользователей. Наиболее типичные случаи, когда в системе используется перенаправление - выбор периода в журналах документов, последовательность диалоговых окон при регистрации контакта и последующей постановке задачи. Если во время выполнения одной из этих операций наступит время автоматического запуска какого-либо скрипта, либо сработает скрипт-обработчик выполнения задачи, последовательность перехода будет прервана, и управление получит скрипт. Если скрипт является не интерактивным, он будет выполнен, но последовательность перехода по страницам не прервется.

 

PHP-код скриптов

 

Скрипты написаны на квази-PHP коде. Это означает, что используется синтаксис PHP, с некоторыми ограничениями. Скрипты могут обращаться ко всем объектам CRM-системы при помощи объектного программного интерфейса, описанного ниже. Для работы с объектами index.CRM необходимо иметь сведения о структуре таблиц БД. Информацию о том, какая таблица БД соответствует тому или иному модулю, можно получить в данном руководстве. Информацию о названии полей этих таблиц можно получить при помощи любого инструмента работы с базой данных (MySQL-Front, phpMyAdmin и др.), или в разделе "Конфигурация -> Справочники" Интерфейса администратора (при выборе поля его название выводится в заголовке формы свойств поля).

Здесь мы рассмотрим особенности создания PHP-кода скриптов.

 

1.                 Из скрипта нельзя напрямую обращаться к базам данных, файловой системе и другим ресурсам. Все, что может скрипт - использовать ресурсы, предоставляемые объектной моделью index.crm.

2.                 Скрипт не может обращаться к глобальным переменным и объектам системы.

3.                 В случае использования блочного оператора if { : } else { : }, оператор else должен быть расположен в той же строке, что и закрывающая скобка оператора if. Это связано с особенностями интерпретации скрипта (он выполняется построчно).

4.                 Однострочные выражения, следующие за операторами if, for, while должны следовать в той же строке, что и оператор, либо быть заключены в фигурные скобки.

5.                 В скрипте нельзя создавать функции PHP (в общепринятом смысле), но можно создавать обработчики тех или иных событий, описываемые как функции. В конце описания функции обязательно должен присутствовать комментарий // end function ::

function accept() {

:

} // end function accept

6.                 PHP-код скрипта представляет собой последовательность операторов, вызываемых при его старте, и набор обработчиков тех или иных событий, инициируемых компонентами системы (закрытие диалогового окна, завершение задачи и т.д.). Обработчики не могут быть вложены друг в друга.

7.                 Для прерывания выполнения скрипта в любой точке следует вызвать функцию end_script("Статус");. Строка "Статус" будет отображена в окне системы.

8.                 Идентификатор текущего пользователя доступен в переменной $user.

 

Для тех, кто не знаком с языком PHP, кратко опишем его синтаксис.

1.                 Переменные не объявляются, тип переменной определяется ее значением. Названия переменных предваряются знаком $.

2.                 В остальном (операторы, вызовы функций, средства объектно-ориентированного программирования и др.) язык аналогичен C/C++. Каждое выражение должно оканчиваться точкой с запятой (;). Блоки операторов объединяются при помощи фигурных скобок { }.

3.                 Объекты создаются при помощи оператора new: $var=new Object(); При создании объекта в скобках могут быть указаны параметры, которые передаются в конструктор объекта.

4.                 К переменным и методам объекта можно обращаться при помощи оператора ->. Пример: $object->value или $object->function();

 

Служебные функции

 

При создании сценариев можно использовать следующие вспомогательные функции:

 

end_script($result,$errorcode);

Прекращает выполнение скрипта и выводит сообщение об успешном выполнении $result или сообщение об ошибке $errorcode в строку статуса (если это возможно). При этом происходит перезагрузка страницы.

 

report_error($error);

Выводит сообщение о фатальной ошибке $error (в синем окне посередине страницы) и останавливает работу системы.

 

make_date($dialog,$name);

Получает дату из поля $name диалога Dialog (параметр $dialog; описание объекта Dialog см. ниже) и возвращает дату в формате SQL (YYYY-MM-DD).

 

date_interval($days,$hours,$minutes);

Добавляет к текущему времени $days дней, $hours часов и $minutes минут и возвращает дату и время в формате SQL (YYYY-MM-DD HH:MM). Все параметры могут быть пропущены.

 

Объект Item

 

При помощи этого объекта скрипт имеет возможность обращаться к записям справочников и документам. При создании объекта в скобках указывается название одной записи данного модуля (например, "Контакт"). Второй, опциональный параметр - идентификатор (или название - значение поля name) записи, к которой надо получить доступ. При создании объекта автоматически проверяются права доступа к данному модулю и записи того пользователя, от имени которого запущен скрипт.

$object=new Item("Контакт",10);

$client=new Item("Клиент","ООО "Рубикон"");

Для иерархических справочников можно обратиться либо к элементу-контейнеру, либо к дочернему элементу:

$object=new Item("Категория");

$object=new Item("Товар");

Если второй параметр конструктора Item пропущен, создается пустой объект, который может быть использован для создания новой записи.

Конструктор объекта загружает в его свойства все поля таблицы БД, в которой хранится объект. То есть если таблица, в которой хранится информация о контактах (в нашем примере), имеются поля person и date, к ним можно будет обратиться так:

$object->person

$object->date

Все свойства доступны и на чтение, и на запись. Проверка прав доступа производится только при попытке записать сделанные изменения в базу данных.

 

Существует особенность, касающаяся работы с полями-свойствами объекта Item, являющимися указателями на другие объекты. При загрузке в объект Item существующей записи в эти свойства помещаются идентификаторы соответствующих записей, и их можно использовать для создания новых объектов Item, для того чтобы работать с теми записями, на которые ссылается текущий объект. При присвоении значения таким полям можно использовать как идентификаторы, так и названия, например:

$object->user="Администратор";

При этом система сама преобразует имя в идентификатор. Конечно, такая операция возможна только для справочников, содержащих уникальные имена. Если ссылка идет на журнал документов, свойству требуется присваивать идентификатор документа.

 

Метод Save() записывает объект в базу данных, либо обновляя свойства существующей записи, либо создавая новую. При этом происходит проверка прав доступа пользователя к модулю и конкретной записи.

 

Метод Delete() удаляет (точнее, помечает на удаление) объект.

 

Метод GetId() возвращает идентификатор текущей записи. В частности, может использоваться для получения информации о новой записи после ее создания.

 

Метод GetUID() возвращает уникальный идентификатор данного экземпляра класса. Метод полезен для различения экземпляров класса, относящихся к объектам одного типа.

 

Метод GetAccess() возвращает уровень доступа текущего пользователя к данной записи: 0 - нет доступа, 1 - только чтение, 2 - полный доступ.

 

Метод GetHistory($field,$date) возвращает значение поля $field, которое оно имело на дату $date. $Field - имя поля в базе данных (например, name). $Date - дата в формате даты SQL (YYYY-MM-DD; например, 2007-12-31).

 

Метод GetProperty($name) возвращает значение какого-либо вычисляемого выражения, соответствующего текущей записи. Параметр $name - имя выражения, соответствующее какому-либо условию фильтрации для данного модуля. Например, для справочника "Клиенты" может быть получено следующее значение: $client->GetProperty("Сумма продаж");

Условия фильтрации создаются в разделе "Конфигурация -> Создание условий фильтрации" Интерфейса администратора.

 

ВНИМАНИЕ! Существует особый экземпляр объекта Item, называемый $object. Этот объект соответствует записи, выбранной в справочнике или журнале документов, на момент запуска скрипта. Например, пользователь зашел в справочник "Клиенты" и выбрал некоего клиента, затем запустил выполнение сценария. Объект $object, экземпляр класса Item, будет доступен в сценарии, и будет соответствовать выбранному клиенту.

 

Объект TablePart

 

Данный объект предназначен для доступа к табличной части документов. Конструктор объекта имеет два параметра:

TablePart($item,$linkage);

Первый параметр - объект Item, соответствующий документу, к табличной части которого мы хотим получить доступ. $Linkage - название модуля, записи которого привязываются в табличной части. Пример использования:

$sale=new Item("Продажа");

$table=new TablePart($sale,"Товар");

 

Табличная часть характеризуется привязанными записями (для определенности их можно называть товарами, т.к. чаще всего речь идет именно о товарах), каждая из которых имеет некоторые параметры. Для товаров в табличной части предложений, счетов, продаж параметры - количество и цена за единицу.

Для каждого привязанного товара создается отдельный объект Item и помещается в массив items, являющийся членом объекта TablePart. Таким образом, к первому товару табличной части можно обратиться так:

$table->items[0]

 

Параметры товаров имеют имена, соответствующие названиям полей в таблице, хранящей табличную часть документа (по принципу именования index.CRM, название этой таблицы составляется из названий обеих связываемых таблиц; например, табличная часть продаж хранится в таблице sales_goods). Для документов Предложение, Счет и Продажа, входящих в базовую версию index.CRM, имена параметров - amount (количество) и price (цена за единицу). Получить значение параметра для какого-либо товара можно при помощи метода

GetParam($item,$param);

Первый параметр - объект Item (который можно взять из массива Items, либо создать отдельно), второй - название параметра. Метод возвращает значение параметра.

Пример использования:

$table->GetParam($table->items[0],"amount");

 

Установить значение параметра можно при помощи метода

SetParam($item,$param,$value);

Параметры $item и $param - как в предыдущем методе, $value - значение, присваиваемое параметру.

Например, чтобы увеличить цену товара на 10%, нужно сделать следующий вызов:

$table->SetParam($table->items[0],"price",$table->GetParam($table->items[0],"price")*1.1)

 

Добавить новый товар в табличную часть можно методом

AddItem($item);

Пример:

$item=new Item("Товар","Сахар");

$table->AddItem($item);

 

Для удаления товара из табличной части предназначен метод

RemoveItem($item);

Пример:

$table->RemoveItem($table->items[0]);

 

Полностью очистить табличную часть документа можно при помощи метода Clear();

$table->Clear();

 

Метод CopyFrom предназначен для копирования табличной части из одного документа в другой. При этом документы могут быть разного типа (например, копирование из счета в продажу). Параметр, передаваемый в метод - объект Item, соответствующий записи, из которой копируется табличная часть. Пример использования:

$table->CopyFrom(new Item("Счет",1));

 

Метод Compact() предназначен для нормализации табличной части документов. Этот метод работает только в том случае, если привязываются именно товары. Он сливает двойные записи, суммируя количество и вычисляя усредненную цену товаров. Метод полезен в случае, если в табличную часть добавлен товар, который там уже присутствовал ранее (возможно, по другой цене). Пример использования:

$item=new Item("Товар","Сахар"); // Добавляем первый товар

$table->AddItem($item);

$table->SetParam($item,"amount",1);

$table->SetParam($item,"price",10);

$item=new Item("Товар","Сахар"); // Добавляем второй товар

$table->AddItem($item);

$table->SetParam($item,"amount",1);

$table->SetParam($item,"price",5);

$table->Compact();

В результате табличная часть будет содержать один прикрепленный товар ("Сахар"), в количестве 2 шт., с ценой 7,5 руб.

 

После завершения модификации табличной части необходимо сохранить ее методом Save():

$table->Save();

 

Объект Find

 

При помощи этого объекта сценарий может осуществлять навигацию по справочникам и журналам документов, находить нужные записи. Конструктор модуля содержит один параметр - название одной записи данного модуля (например, "Клиент").

Find($name);

 

Метод FindByFilter позволяет установить условие для фильтрации записей.

FindByFilter($condition);

Метод возвращает количество найденных записей. Параметр $condition представляет собой SQL-выражение (без слова WHERE). Если параметр состоит из нескольких выражений, вся строка должна быть заключена в скобки. Параметр может быть пустым для нахождения всех записей. Пример использования:

$find=new Find("Контакт");

$client=new Item("Клиент",1);

$find->FindByFilter("client=".$client->GetId());

 

Метод FindByDynamicFilter позволяет использовать для выборки запрос, ранее созданный пользователем (инструмент "Динамические фильтры").

FindByDynamicFilter($name);

Возвращает количество найденных записей. Параметр $name - название динамического фильтра (например, "Мои клиенты").

 

В обоих случаях система включает в результаты запроса только те записи, к которым имеет доступ текущий пользователь.

 

Метод GetNextId() возвращает идентификатор следующей записи, удовлетворяющей условиям фильтра.

 

Метод GetNextRecord() возвращает объект Item, соответствующий следующей записи, удовлетворяющий условиям фильтра.

 

Эти методы могут использоваться в цикле для перебора всех записей, удовлетворяющих условиям какого-либо фильтра.

 

Объект ScriptEvent

 

Этот объект предоставляет доступ к задачам. Конструктор объекта имеет один необязательный параметр - идентификатор события (если не указан, будет создано новое событие):

ScriptEvent($id);

Доступ к задаче может быть получен только в том случае, если текущий пользователь является лицом, ее назначившим, исполнителем или контролером.

Как и у объекта Item, все свойства задачи доступны для чтения и изменения через переменные-члены объекта. В отличие от объектов Item, объект ScriptEvent имеет четко определенный набор свойств:

 

type

Тип задачи

planed_id

Id пользователя, назначившего задачу

planed_date

Дата и время, на которое назначено начало задачи

planed_enddate

Дата и время, на которое назначено завершение задачи

planed_comment

Комментарий запланировавшего задачу

planed_title

Название задачи

completed_id

Id пользователя, выполнившего задачу

completed_date

Дата и время выполнения задачи

completed_comment

Комментарий выполнившего задачу

ownerid

Пользователь, которому назначена задача

client

Id клиента, с которым связана задача

document

Документ, созданный в результате выполнения задачи (его тип определяется типом задачи)

base_document

Документ, на основании которого создана задача

base_doctype

Тип документа, на основании которого создана задача (идентификатор модуля)

nocross

Флаг "запрет перекрывания" (=1 если установлен)

last_edit

Дата и время последнего редактирования комментария исполнителя

controller

Id пользователя-контролера

 

Метод Save() предназначен для сохранения задачи:

$task=new ScriptEvent(1);

$task->Save();

 

ВНИМАНИЕ! При загрузке существующей задачи в свойстве type находится идентификатор типа задачи. При создании задачи следует указать ее тип в виде строки (пример см. ниже).

 

Для работы с параметрами, хранящими дату и время, следует использовать методы

GetDate($name,$format);

И

SetDate($name,$value,$format);

$name - имя параметра (planed_date, planed_enddate или last_edit), $value - значение даты и времени, $format - формат, в котором передается дата. Возможные форматы:

 

DATE_READABLE

DD.MM.YYYY

DATE_SQL

YYYY-MM-DD

DATE_ARRAY

массив, содержащий элементы hours, minutes, mon, mday, year.

DATETIME_READABLE

DD.MM.YYYY HH:MM

DATETIME_SQL

YYYY-MM-DD HH:MM

Передача в метод SetDate даты возможна только в форматах DATE_SQL, DATETIME_SQL или DATE_ARRAY.

 

По умолчанию используется формат DATE_SQL.

Использование этих методов необходимо, т.к. в базе данных дата и время задач хранятся в специальном внутреннем формате. Пример использования (увеличение на 1 день даты, на которую назначена задача):

$event=new ScriptEvent(1);

$date=$event->GetDate("planed_date",DATE_ARRAY);

$date["day"]++;

$event->SetDate("planed_date",$date,DATE_ARRAY);

 

Важнейшим средством работы с задачами является возможность установки обработчиков выполнения задачи или редактирования комментария исполнителя. Обработчик выполняется в тот момент, когда пользователь выполнил задачу (неважно каким способом - важно помнить, что задачи могут помечаться как выполненные автоматически, при создании документа, соответствующего условиям задачи), либо ввел и сохранил комментарий исполнителя. Очень важно помнить, что задача выполняется от имени того пользователя, который выполняет задачу.

Существует два типа обработчиков: интерактивные и выполняющиеся в фоновом режиме (незаметно для пользователя). Интерактивный обработчик может отображать диалоговые окна (см. далее), получать какую-либо реакцию от пользователя. Фоновый обработчик просто выполняет некую определенную работу. Интерактивные обработчики связаны с пользователем (запускаются только для определенного пользователя), фоновые обработчики запускаются от имени того пользователя, который выполнил задачу.

Алгоритм активации обработчиков следующий. Когда происходит запись в базу данных информации о том, что какая-либо задача выполнена, проверяется наличие интерактивных обработчиков для этой задачи. Если таковые обнаружены, эти интерактивные обработчики помечаются как "активизированные". Затем происходит поиск фоновых обработчиков для задачи. Если таковой обработчик обнаружен, он немедленно выполняется (напомним, фоновый обработчик не может взаимодействовать с пользователем).

При каждой загрузке страницы происходит проверка на наличие активизированных интерактивных обработчиков для данного пользователя. Если такой обработчик найден, происходит его выполнение. Проверка выполняется на всех страницах системы, независимо от того, на какой странице функционировал исходный сценарий.

Опишем методы, устанавливающие обработчики на задачу:

SetOnComplete($name); // фоновый обработчик выполнения

SetOnCompleteInteractive($name,$user,$page=0); // интерактивный выполнения

SetOnUpdate($name); // фоновый обработчик ввода комментария исполнителя

SetOnUpdateInteractive($name,$user,$page=0); // интерактивный комментария

 

Параметр $name - название обработчика, $user - пользователь, для которого будет запущен интерактивный обработчик, $page - страница для запуска обработчика (в настоящее время игнорируется).

Сами обработчики описываются в виде функций в сценарии:

$event->SetOnCompleteInteractive("complete",$event->ownerid);

function complete($event) {

} // end function complete

 

Напоминаем про обязательный комментарий после закрывающей скобки обработчика.

В обработчик передается параметр - объект ScriptEvent, соответствующий событию, которое вызвало срабатывание обработчика.

 

Объект Dialog

 

При помощи этого объекта сценарии имеют возможность взаимодействовать с пользователем - запрашивать от него дополнительную информацию, задавать вопросы и получать ответы.

Конструктор объекта имеет один необязательный параметр - заголовок окна диалога:

$dialog=new Dialog("Выбор варианта");

Кроме того, заголовок окна можно установить, непосредственно обратившись к свойству title:

$dialog->title="Заголовок";

Строку, отображаемую в верхней части диалога, можно установить так:

$dialog->message="Сообщение";

 

Диалог может содержать поля ввода и кнопки. Для добавления полей ввода используется метод

AddField($name,$subscript,$type);

Параметр $name - имя поля (английское, будет использоваться для обращения к значению поля), $subscript - подпись перед полем, $type - тип поля. Типы полей соответствуют типам, описанным в классе TableEditor (см. ниже):

INTEGER_TYPE

целое число

STRING_TYPE

строка

TEXT

многострочное поле ввода

REAL

число с плавающей точкой

POINTER

указатель на запись в другой таблице - выбор при помощи выпадающего меню

TREE

указатель на запись в иерархической таблице - выбор при помощи органа управления "дерево"

FLAG

переключатель

DATE_TYPE

ввод/выбор даты

DATETIME_TYPE

ввод/выбор даты и времени

SELECT_POPUP

указатель на запись в другой таблице - выбор при помощи диалогового окна

RADIO

переключатель - выбор из нескольких вариантов

 

ВНИМАНИЕ! Если требуется передать через диалог в обработчик какое-либо значение, кроме тех, которые указываются в полях ввода, можно использовать следующую возможность. Поля, для которых параметр $subscript указан пустым, в диалоге не отображаются. Следовательно, если создать поле

$dialog->AddField("client","",$client->GetId());

В обработчик закрытия диалога будет передано значение client, но поле client в диалоге отображаться не будет.

 

Если требуется установить в поле какое-либо исходное значение, можно использовать метод

SetFieldValue($name,$value);

Параметр $name - название поля, $value - присваиваемое значение.

 

Для полей типа POINTER, TREE, SELECT_POPUP необходимо указать дополнительные параметры. Это делается при помощи методов, являющихся полными аналогами методов класса TableEditor:

 

DescribePointerField($field,$targettable,$targetid="id",$targetname="name",$condition="",$order="");

Параметры: $name - название поля, $targettable - таблица, на которую ссылается указатель, $targetid - название поля-идентификатора в этой таблице, $targetname - название поля "название записи", $condition - SQL-условие для ограничения выборки записей из таблицы, $order - порядок сортировки.

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

$dialog->AddField("manager","Пользователь",POINTER);

$dialog->DescribePointerField("manager","users","id","name","","name ASC");

 

DescribeAdvancedTreeField($field,$table_p,$table_c="",$name_p="name",$section_p="parent",$name_c="",$section_c="",$rootname="Каталог",$check_proc="",$sortparent="name",$sortchild="name",$ownerfield="del",$ownervalue="0",$select_parent=true)

Параметры: $field - название поля, $table_p - таблица контейнеров, $table_c - таблица дочерних элементов, $name_p - поле "название" в родительской таблице, $section_p - поле-ссылка на родительский элемент в родительской таблице, $name_c - поле-название в дочерней таблице, $section_c - поле-ссылка на контейнер в дочерней таблице, $rootname - название корневого элемента иерархии, $check_proc - процедура проверки прав доступа (PersonnelRightControl для подразделений/персонала и GoodsRightControl для каталога продукции), $sortparent - порядок сортировки родительских элементов, $sortchild - порядок сортировки дочерних элементов, $ownerfield - название поля, которое является дополнительным условием для выборки из таблицы контейнеров, $ownervalue - значение, которое должно принимать это поле, $select_parent - флаг "работа только с контейнерами" (в этом случае дочернюю таблицу указывать не нужно). Пример использования (для выбора пользователя):

$dialog->DescribeAdvancedTreeField("tr","branches","users","name","parent","name","branch","Организация","PersonnelRightControl","name","name","del","0",false);

Для выбора подразделения организации:

$dialog->DescribeAdvancedTreeField("tr","branches","users","name","parent","name","branch","Организация","PersonnelRightControl","name","name","del","0",false);

Для выбора товара:

$dialog->DescribeAdvancedTreeField("tr","categories","goods","name","parent","name","category","Каталог продукции","GoodsRightControl","name","name","del","0",false);

 

DescribeRadioField($field,$a_name_,$a_value_);

Параметры: $field - название поля, $a_name_ - массив подписей к переключателям, $a_value_ - массив значений, соответствующих переключателям.

Пример использования (создание переключателя "приоритет" с тремя возможными значениями - 0, 1 и 2):

$dialog->DescribeRadioField("priority",Array("Обычный","Повышенный","Срочный"),Array(0,1,2));

 

DescribeSelectPopupField($field,$dialog,$dialog_history,$targettable,$targetid="id",$targetname="name",$condition="");

Параметры: $field - название поля, $dialog - название диалога для выбора записи, $dialog_history - не используется, $targettable - таблица, из которой выбираются записи, $targetid - название поля-идентификатора в этой таблице, $targetname - название поля "название записи", $condition - SQL-условие для ограничения выборки записей из таблицы.

Пример (выбор клиента):

$dialog->DescribeSelectPopupField("client","/dialogs/FindClient.php","","clients","id","name","");

 

Для добавления к диалогу кнопок используется метод AddButton:

AddButton($name,$handler);

Параметры: $name - название (подпись) кнопки, $handler - название функции-обработчика, которая будет вызвана при нажатии на эту кнопку.

Функция-обработчик handler имеет один параметр - объект $dialog. Этот объект содержит свойства, соответствующие всем полям ввода диалога, но не является точной копией исходного объекта Dialog. С точки зрения синтаксиса, обработчик нажатия на кнопку описывается так же, как обработчик выполнения события.

Если на странице, откуда был вызван диалог, существовал объект $object (текущая выбранная запись), то в объекте $dialog, передаваемом в обработчике, будет доступен объект $dialog->object, соответствующий исходной записи.

 

После того, как диалог подготовлен, его можно открыть методом Open():

$dialog->Open();

 

Следует иметь в виду, что после закрытия диалога производится перезагрузка страницы.

 

Пример сценария

 

Приведем пример сценария, использующего большую часть перечисленных возможностей.

Создадим сценарий с такими параметрами: название - "Успешный звонок", страница - "Клиенты". Предположим, что менеджеры компании предлагают несколько новых продуктов потенциальным клиентам при помощи телефонного обзвона. Этот сценарий они будут выполнять в случае, если контакт прошел успешно, и клиент заинтересовался предложением. Пусть в этом случае должна автоматически выполняться следующая последовательность действий:

1.                 Регистрируется контакт.

2.                 Назначается задача для другого пользователя по проведению презентации.

3.                 После проведения презентации система спрашивает у пользователя, успешно ли прошла презентация. В диалоговое окно также включается список товаров (из определенного раздела каталога), которые могут заинтересовать пользователя. Около каждого товара находится переключатель, и менеджер может отметить некоторые из них для автоматического создания коммерческого предложения.

4.                 Если успешно - система формирует коммерческое предложение и добавляет в его табличную часть те продукты, которыми заинтересовался клиент.

 

Сценарий будет выглядеть так:

 

if(!$object) end_script("","Не задан клиент");

// Проверяем, что в вызывающей странице был выбран клиент. $object - системный объект класса Item, соответствующий текущей выбранной записи в окне, откуда происходит запуск скрипта. В данном случае этот объект хранит информацию о клиенте, с которым регистрируется контакт.

 

// Создаем диалог и добавляем в него поля

$dialog=new Dialog();

$dialog->AddField("С кем разговаривали","person",POINTER);

$dialog->AddField("Кто будет проводить презентацию?","manager",POINTER);

$dialog->AddField("Дата презентации","date",DATETIME_TYPE);

$dialog->AddField("Комментарий","comment",TEXT);

 

// Устанавливаем дополнительные параметры для полей типа "указатель"

$dialog->DescribePointerField("person","persons","id","name","WHERE client='".$object."'");

$dialog->DescribePointerField("manager","users");

 

// Добавляем кнопку

$dialog->AddButton("Принять","accept");

 

// открываем диалог и ждем реакции пользователя. Выполнение исходной части сценария заканчивается, дальше будут выполняться обработчики различных событий.

$dialog->title="Успешный контакт"

$dialog->Open();

 

// обработчик нажатия на кнопку "Принять" диалога

function accept($dialog) { // Параметр - объект Dialog

 

// Получаем дату из поля date диалога. Вызов этой функции необходим, потому что дата вводится через несколько различных полей ввода.

$date=make_date($dialog,"date");

 

// Создаем объект Item, при помощи которого будем создавать документ "Контакт"

$contact=new Item("Контакт");

$contact->date=$date;

$contact->created=$date;

$contact->manager=$user;

$contact->client=$dialog->object;

$contact->success=5;

if($dialog->person) $contact->person=$dialog->person;

$contact->comment=$dialog->comment;

$contact->type="Звонок"

$contact->direction="Исходящий"

$contact->Save();

 

// Создаем объект ScriptEvent, при помощи которого создадим задачу по проведению презентации

$event=new ScriptEvent();

$event->ownerid=$dialog->manager?$dialog->manager:$user; // если в диалоге не выбран менеджер, создаем задачу текущему пользователю

$event->client=$dialog->object; // через $dialog->object передается копия оригинального объекта $object, т.е. клиента, с которым связана задача.

$event->planed_title="Презентация"

$event->type="Встреча"

$event->SetDate("planed_date",$date,DATETIME_SQL);

$event->SetDate("planed_enddate",$date,DATETIME_SQL);

$event->planed_comment=$dialog->comment;

$event->base_document=$contact->id;

$event->base_doctype="Контакт"

$event->Save();

// Устанавливаем обработчик

$event->SetOnCompleteInteractive("finished",$event->ownerid);

end_script("Задача создана");

} // end function accept

 

// Этот обработчик вызывается, когда задача по проведению презентации будет помечена как выполненная.

function finished($event) {

 

// Создаем диалог, в котором пользователь укажет, успешно ли прошла презентация, и отметит продукты, которыми заинтересовался клиент

$dialog=new Dialog();

// Добавляем в диалог скрытое поле для передачи в обработчик идентификатора клиента.

$dialog->AddField("","client",INTEGER_TYPE);

$dialog->SetFieldValue("client",$event->client);

$dialog->message=$dialog->title="Успешно ли прошла презентация?"

$dialog->AddField("Если не успешно, введите причину:","reason",STRING_TYPE);

 

// Находим все товары определенного раздела каталога продукции и выводим в диалоге переключатели для каждого товара

$section=new Item("Категория","Motorola");

$goods=new Find("Товар");

$goods->FindByFilter("category=".$section->GetId());

while($item=$goods->GetNextRecord()) {

$dialog->AddField($item->name,"good".$item->GetId(),FLAG);

}

 

$dialog->AddButton("Успешно","success");

$dialog->AddButton("Не успешно","failed");

$dialog->Open();

} // end function finished

 

// Этот обработчик вызывается, если пользователь нажал кнопку "Успешно" в диалоге

function success($dialog) {

// Создаем новый счет

$invoice=new Item("Счет");

$invoice->client=$dialog->client;

// Присваиваем текущую дату

$invoice->date=date_interval();

$invoice->Save();

// Создаем объект для доступа к табличной части счета

$table=new TablePart($invoice,"Товар");

// Снова перечисляем все товары интересующего нас раздела каталога продукции

$section=new Item("Категория","Motorola");

$goods=new Find("Товар");

$goods->FindByFilter("category=".$section->GetId());

while($item=$goods->GetNextRecord()) {

// Проверяем, отмечен ли данный товар

if($dialog->{"good".$item->GetId()}) {

// Если отмечен - добавляем его в табличную часть счета

$table->AddItem($item);

// Устанавливаем параметры - количество и цену

$table->SetParam("amount",$item,1);

$table->SetParam("price",$item,$item->price);

}

}

// Сохраняем табличную часть

$table->Save();

end_script("Счет сформирован.");

} // end function success

 

// Обработчик нажатия на кнопку "Не успешно"

function failed($dialog) {

end_script("","Очень жаль");

} // end function success


Приложение. Основные модули системы

 

Название

Id модуля

Имя программного модуля

Таблицы базы данных

Файл класса

Справочники

Клиенты

4

clients

Clients - клиенты

Clients_groups - группы

Clients_files - присоединенные файлы

clients.ext

Персонал

3

personnel

Branches - подразделения

Users - пользователи

Branches_modules и groups_modules - права доступа

Personnel.ext

Номенклатура

5

goods

Categories - разделы

Goods - товары

Measures - единицы измерения

Goods.ext

Подчиненные справочники справочника "Клиенты"

Договоры

Нет

 

Contracts - договоры

Contracts_goods - подключенные системы

Clients.ext

Персоны

Нет

 

Persons - персоны

Clients.ext

Журналы документов

Контакты

12

contacts

Contacts - контакты

Contact_types - типы контакта

Contacts.ext

Предложения

6

offers

Offers - предложения

Offers_goods - товары в них

Offers_files - присоединенные файлы

Offers.ext

Счета

18

invoices

Invoices - счета

Invoices_goods - товары в них

Invoices.ext

Продажи

7

sales

Sales - продажи

Sales_goods - товары в них

Sales.ext

Платежи

9

payments

Payments - платежи

payments.ext

Отчеты

Выполнение задач

 

tasks_report

 

tasks_report.ext

Задолженность контрагентов

 

debts

 

debts.ext

Изменения в реквизитах клиента

 

client_props_rep

 

client_props_rep.ext

Клиенты, требующие внимания

 

problem_clients

 

problem_clients.ext

Отчет по продажам

 

repsales

 

repsales.ext

Продуктивность персонала

 

productivity

 

productivity.ext

Статистика продаж

 

sales_stages

 

sales_stages.ext

Агрегированный отчет по взаимодействию с клиентом

 

report_client

 

report_client.ext

Все документы

 

alldocs

 

alldocs.ext

История баланса клиента

 

client_payments

 

client_payments.ext

 

(C) 2006-2012 Центр информационных технологий Создание сайта - index.art, - оптимизация сайта г. Екатеринбург
CRM-система index.CRM