При работе с конфигурацией 1С:CRM от компании «Рарус» перед разработчиками и системными администраторами часто встают две важные задачи: как «подружить» программу с существующей АТС Asterisk для управления аппаратными (IP) телефонами и как программно добраться до значений дополнительных реквизитов, которые не отображаются в стандартных таблицах запроса. В этой статье мы подробно разберем оба вопроса, проанализируем различные подходы к интеграции и выясним архитектурные особенности хранения данных в современных решениях на базе 1С.
Рассмотрим ситуацию, когда необходимо реализовать простую функцию: при нажатии на номер телефона в карточке клиента в 1С должен зазвонить аппаратный телефон сотрудника, а после поднятия трубки — пойти вызов клиенту. Если штатный модуль «СофтФон» кажется слишком громоздким, проанализируем «легкий» метод реализации через механизм Call-файлов.
Суть метода заключается в том, что 1С отправляет HTTP-запрос на сервер, где расположен Asterisk. На стороне сервера PHP-скрипт формирует специальный файл-задание, который АТС подхватывает и исполняет. Разберем этот процесс по шагам.
На стороне 1С нам необходимо написать процедуру, которая будет отправлять параметры вызова (кто звонит и кому звонит) на внешний скрипт. Используем для этого объект HTTPСоединение:
&НаКлиенте
Процедура СделатьВызов(НомерСотрудника, НомерКлиента)
СерверАТС = "192.168.1.100";
Ресурс = "/asterisk_call.php?from=" + НомерСотрудника + "&to=" + НомерКлиента;
Соединение = Новый HTTPСоединение(СерверАТС);
Запрос = Новый HTTPЗапрос(Ресурс);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Вызов инициирован успешно");
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером АТС");
КонецПопытки;
КонецПроцедуры
На стороне сервера Asterisk PHP-скрипт создает текстовый файл с инструкциями для АТС. Важный технический нюанс: согласно документации Asterisk, нельзя создавать файл напрямую в папке /var/spool/asterisk/outgoing, так как АТС может начать читать его до того, как он будет полностью записан (проблема «полфайла»). Сначала создаем файл во временной директории, а затем перемещаем его командой mv.
// asterisk_call.php
$from = $_GET['from'];
$to = $_GET['to'];
$content = "Channel: SIP/$from\n";
$content .= "MaxRetries: 0\n";
$content .= "RetryTime: 60\n";
$content .= "WaitTime: 30\n";
$content .= "Context: from-internal\n";
$content .= "Extension: $to\n";
$content .= "Priority: 1\n";
$tmpFile = "/tmp/call_" . time() . ".call";
file_put_contents($tmpFile, $content);
exec("mv $tmpFile /var/spool/asterisk/outgoing/");
В этом сценарии АТС сначала подаст сигнал на аппарат сотрудника (Channel: SIP/$from). Как только сотрудник поднимет трубку, система соединит его с номером клиента (Extension: $to).
Если нам требуется не только инициация вызова, но и полный контроль (запись разговоров, всплывающие карточки при входящем звонке, перевод вызова), следует рассмотреть использование штатного модуля. Выясним, как он работает с аппаратными телефонами.
Проанализируем архитектуру решения «СофтФон»:
Чтобы «заставить» систему работать с хардварным телефоном, в настройках линии сотрудника выбирается режим управления внешним устройством. В этом случае сервер CRM отслеживает состояние SIP-регистрации аппарата. При клике в интерфейсе 1С сервер Asterisk отправляет команду на аппаратный телефон через AMI, инициируя обратный вызов. Плюс такого подхода в том, что система автоматически создает документ Событие (или Взаимодействие) и привязывает к нему запись разговора, которую забирает из хранилища АТС по протоколу HTTP или через общий сетевой ресурс.
Часто программисты сталкиваются с тем, что созданный в пользовательском режиме дополнительный реквизит (через механизм ПВХ — План видов характеристик) не виден в основной таблице справочника при написании запроса. Разберем, где именно искать эти данные.
В современных версиях 1С:CRM, построенных на базе БСП (Библиотеки стандартных подсистем), используется два различных механизма хранения:
1. Дополнительные реквизиты: Они предназначены для данных, которые логически являются частью объекта. Рассмотрим их хранение: они находятся непосредственно в самом объекте (например, в справочнике Контрагенты или Клиенты), но в специальной табличной части с именем ДополнительныеРеквизиты.
Посмотрим на пример запроса для получения значения такого реквизита:
ВЫБРАТЬ
КлиентыДополнительныеРеквизиты.Значение КАК ЗначениеРеквизита
ИЗ
Справочник.Клиенты.ДополнительныеРеквизиты КАК КлиентыДополнительныеРеквизиты
ГДЕ
КлиентыДополнительныеРеквизиты.Ссылка = &СсылкаНаКлиента
И КлиентыДополнительныеРеквизиты.Свойство = &СсылкаНаСвойствоПВХ
2. Дополнительные сведения: В отличие от реквизитов, «сведения» не хранятся в объекте. Они записываются в независимый регистр сведений ДополнительныеСведения. Это делается для того, чтобы изменение свойства не приводило к изменению самого объекта (не менялась дата версии, не срабатывали обработчики обновления). Если ваш запрос к табличной части пуст, проанализируем содержимое этого регистра.
Профессиональный совет: вместо написания прямых запросов к табличным частям или регистрам, рекомендуется использовать функции БСП. Это гарантирует, что ваш код не «сломается» при обновлении конфигурации. Разберем пример использования универсальной функции:
// Использование встроенного механизма БСП для получения значения
Значение = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, "ИмяСвойстваИлиСсылка");
Таким образом, мы выяснили, что для успешной интеграции с телефонией можно использовать как простые самописные скрипты для Click-to-Call, так и комплексные решения от «Раруса». А при работе с данными важно четко разделять понятия «реквизит» и «сведение», обращаясь к соответствующим табличным частям или регистрам системы 1С:Предприятие 8.3.