Как из конфигурации 1С:Предприятия получить доступ к пользователям, элементам инфоблока и прочего с сайта Битрикс?

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

Условие задачи

Реализовать загрузку данных пользователей (ID, e-mail, телефоны, ФИО, компанию, заметки пл пользователю, логин и группы пользователя) с сайта Битрикс в конфигурацию на платформе 1С.
Инициатором загрузки данных должна быть обработка 1С. Т.е. запускаем в 1С обработку, щелкаем кнопочку и происходит загрузка данных с сайта. После получения всех данных подготовить данные для последующего анализа и получить "удобоваримый вид" для обработки этих данных в 1С.

Итак. Что имеем? Видится следующий путь: сама по себе обработка в 1С не может работать напрямую с Битрикс (а если и может, то автору об этом не известно). Значит алгоритм работы будет следующим:

  1. Обработка на 1С создает HTTPЗапрос и посылает этот запрос скрипту на сайте.
  2. Скрипт делает выборку и отдает данные в формате с которым 1С может работать. Например, JSON или XML. Для примера будем использовать JSON, как более компактный.
  3. 1С получает JSON-данные и превращает их в массив структур, каждая структура которого будет содержать данные по конкретному пользователю.

Скрипт на сайте Битрикс

Начнем со скрипта PHP на сайте. Создаем папку на сайте, куда положим скрипт. Пусть эта папка называется . Создадим в ней скрипт и назовем его 1с.php.
Содержимое скрипта:

<?
	$_SERVER["DOCUMENT_ROOT"] = '/path/to/root/site/bitrix/public_html'; // Полный путь к корню сайта на сервере
	$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
	require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
	CModule::IncludeModule("iblock");
	/* Проверим логин и пароль пользователя, который делает запрос, чтобы все было безопасно */
	global $USER;
	$login = $USER->Login(htmlspecialchars($_REQUEST['login']), htmlspecialchars($_REQUEST['password']));
	if ($login["TYPE"] == "ERROR") {
		header('HTTP/1.0 401 Unauthorized');
		echo json_encode($login); // Если ошибка, вернем ошибку в JSON формате.
		die;
	}
	
	$order = array('ID' => 'asc');
	$tmp = 'sort';
	$filter = Array();
	
	// Выбираем всех пользователей.
	$rsUsers = CUser::GetList($order, $tmp, $filter);
	// Главный массив, куда мы будем помещать все, что найдем.
	$data = Array();
	while ($arUser = $rsUsers->Fetch()) {
		
		$u = CUser::GetByID($arUser["ID"]);
		// Получаем группы текущего пользователя в выборке.
		$arRoles = CUser::GetUserGroupList($arUser["ID"]);
		// Массив с ролями текущего пользователя.
		$roles = Array();
		while ($role = $arRoles->Fetch()){
			$resGroup = CGroup::GetByID($role["GROUP_ID"]);
			if($ar_res = $resGroup->GetNext()){	
				// Получаем начало дня				
				$dateStart = strtotime($role["DATE_ACTIVE_FROM"]);				
				$dateStart = mktime(0, 0, 0, date("m", $dateStart), date("d", $dateStart), date("y", $dateStart));				
				// Получаем конец дня
				$dateEnd = strtotime($role["DATE_ACTIVE_TO"]);
				$dateEnd = mktime(23, 59, 59, date("m", $dateEnd), date("d", $dateEnd), date("y", $dateEnd));
				// Строки
				$strDateStart	= date('c', $dateStart);
				$strDateEnd	= date('c', $dateEnd);
				// Добавляем в массив ID-роли, имя роли (" заменим на кавычку), дату начала и дату окончания действия роли.
				$roles[] = [
					"ID" => $ar_res["ID"],
					"NAME" => str_replace(""", '"', $ar_res["NAME"]),
					"START" => $strDateStart,
					"END" => $strDateEnd
				];
			}
		}
		
		// Ролей больше одной, поэтому добавляем пользователя в результирующую выборку.
		if (count($roles) > 0) {
			// Пытаемся получить ФИО.
			$fio = trim(trim($arUser["LAST_NAME"])." ".trim($arUser["NAME"])." ".trim($arUser["SECOND_NAME"]));
			// Массив с телефонами
			$phones = array("PERSONAL_PHONE" => trim($arUser["PERSONAL_PHONE"]),
				"WORK_PHONE" => trim($arUser["WORK_PHONE"]));
			// Все, что получилось в итоговый массив
			$data[] = [
				"ID" => $arUser["ID"], 
				"LOGIN" => $arUser["LOGIN"],
				"NAME" => $fio,
				"MAIL" => $arUser["EMAIL"],
				"COMPANY" => $arUser["WORK_COMPANY"], 
				"NOTES" => $arUser["ADMIN_NOTES"],
				"PHONES" => $phones,
				"ROLES" => $roles
			];
		}
	}

	// Возвращаем все в JSON
	echo json_encode( $data );
	
?>
Важно! Не забудьте поменять путь к корню сайта Битрикс в самом начале!

Обработка на платформе 1С

// Загрузка данных с сайта Битрикс
//  АдресСкрипта - Строка - полный адрес к выше написанному скрипту
//      на сайте Битрикс вида https://softonit.ru/1c/1c.php.
//  Логин - Строка - логин пользователя имеющего доступ к данным 
//      пользователей на сайте Битрикс.
//  Пароль - Строка - пароль пользователя имеющего доступ к 
//      данным пользователей на сайте Битрикс.
//
Процедура Синхронизация(Знач АдресСкрипта, Знач Логин, Знач Пароль) Экспорт
	
	// Коннект к сайту.
	URL = СтруктураURI(АдресСкрипта + "?login=" + Логин + "&password=" + Пароль);
	Соединение = Новый HTTPСоединение(URL.ИмяСервера,,,,,, ?(URL.Схема = "https", Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
	Запрос = Новый HTTPЗапрос(URL.ПутьНаСервере);
	Результат = Соединение.ОтправитьДляОбработки(Запрос);

	// Проверяем авторизацию.
	Если Результат.КодСостояния = 401 Тогда
		Сообщить("Ошибка авторизации. Введите корректный логин и пароль.");
		Возврат;
	КонецЕсли;

	ТелоКакСтрока = Результат.ПолучитьТелоКакСтроку();
	
	// Получаем результат. Сам внешний вид данных ниже на скриншоте.
	Массив = РазобратьJSON(ТелоКакСтрока);
	// ...
	// далее обработка, как нам надо данных с сайта.
	// ...
	
КонецПроцедуры

// Преобразует URL в структуру.
//   СтрокаURI - Строка - URL.
// Возврат:
//    Структура - результат преобразования.
Функция СтруктураURI(Знач СтрокаURI) Экспорт
 
    СтрокаURI = СокрЛП(СтрокаURI);
 
    // схема
    Схема = "";
    Позиция = СтрНайти(СтрокаURI, "://");
    Если Позиция > 0 Тогда
        Схема = НРег(Лев(СтрокаURI, Позиция - 1));
        СтрокаURI = Сред(СтрокаURI, Позиция + 3);
    КонецЕсли;
 
    // строка соединения и путь на сервере
    СтрокаСоединения = СтрокаURI;
    ПутьНаСервере = "";
    Позиция = СтрНайти(СтрокаСоединения, "/");
    Если Позиция > 0 Тогда
        ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
        СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
    КонецЕсли;
 
    // информация пользователя и имя сервера
    СтрокаАвторизации = "";
    ИмяСервера = СтрокаСоединения;
    Позиция = СтрНайти(СтрокаСоединения, "@");
    Если Позиция > 0 Тогда
        СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
        ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
    КонецЕсли;
 
    // логин и пароль
    Логин = СтрокаАвторизации;
    Пароль = "";
    Позиция = СтрНайти(СтрокаАвторизации, ":");
    Если Позиция > 0 Тогда
        Логин = Лев(СтрокаАвторизации, Позиция - 1);
        Пароль = Сред(СтрокаАвторизации, Позиция + 1);
    КонецЕсли;
 
    // хост и порт
    Хост = ИмяСервера;
    Порт = "";
    Позиция = СтрНайти(ИмяСервера, ":");
    Если Позиция > 0 Тогда
        Хост = Лев(ИмяСервера, Позиция - 1);
        Порт = Сред(ИмяСервера, Позиция + 1);
    КонецЕсли;
 
    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
 
    Возврат Результат;
 
КонецФункции

// Из строки полученной с сайта в формате JSON получает массив.
//   Стр - Строка - строка в формате JSON.
// Возврат
//   Массив - результат работы.
Функция РазобратьJSON(Знач Стр)
	
	МассивДат = Новый Массив();
	МассивДат.Добавить("START");
	МассивДат.Добавить("END");
	
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(Стр);
 	Данные = ПрочитатьJSON(Чтение, Ложь, МассивДат, ФорматДатыJSON.ISO);
 	Чтение.Закрыть();
	
	Возврат Данные;
	
КонецФункции

В общем это все.

Скриншоты

 13.04.2019 
 Автор:
 битрикс, bitrix, , инфоблок, обработка, скрипт


Системные решения для 1С
Как из конфигурации 1С:Предприятия получить доступ к пользователям, элементам инфоблока и прочего с сайта Битрикс?
SoftOnIT.RU
Не так давно столкнулся с необходимостью получать данные пользователей/инфоблоков и т.д. с сайта Битрикс в ... 2019-04-13T22:45:42+03:00
Как из конфигурации 1С:Предприятия получить доступ к пользователям, элементам инфоблока и прочего с сайта Битрикс?
Как из конфигурации 1С:Предприятия получить доступ к пользователям, элементам инфоблока и прочего с сайта Битрикс?
https://softonit.ru

Возврат к списку