Как из конфигурации 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);
 	Чтение.Закрыть();
	
	Возврат Данные;
	
КонецФункции

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

Скриншоты
ChatGPT в «Управление IT-отделом 8»
Ассистент на основе ChatGPT готов помочь вам с любыми вопросами
Подробнее
Изображение автора статьи

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

Загрузка...
Поделитесь статьей
Рекомендуем почитать
Статьи Решение проблемы "Обнаружено нарушение целостности системы 1С"

На сегодняшний день любой, пользующийся популярностью у пользователей программный продукт подвергается "пиратским" взломам и соответственно нелегальному использованию. Не исключением будут и программы от всеми известной в России фирмы 1С. Каждый разработчик старается бороться с подобным незаконным использованием своих продуктов по-разному. Так, например, разработчики 1С с 1-ого февраля 2021 года, массово запустили механизм, который определяет легальность использования программы 1С. В случае, если программа была взломана и используется незаконно конечные пользователи получают ошибку "Обнаружено нарушение целостности системы". Сегодня в публикации разберем причины появления данной ошибки, а также расскажем как решить возникшую проблему. 

Статьи Подключение терминала сбора данных к 1С

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

Статьи Настройка Apache для работы 1С через HTTPS (SSL)

Безопасность для многих всегда идет на первом месте, многие интернет-гиганты, типа Google даже добавляют в свои браузеры предупреждения, что соединение не безопасно, если на сайте не используется SSL-сертификат.
1С:Предприятие тоже может работать по протоколу HTTPS.
Мы предлагаем статью-инструкцию, как настроить HTTPS в Apache таким образом, чтобы 1С:Предприятие работало без проблем через SSL.

Статьи Ошибка HTTP 500.0 - Internal Server Error после публикации базы 1С на веб-сервере IIS

Рассмотрим ошибку, которая может возникать при публикации информационной базы 1С на web-сервере IIS Windows.
Попытаемся ее решить. Ошибка HTTP 500.0 - Internal Server Error.

Статьи Как удалить данные по организации в базе 1С?

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

Статьи Быстро растет база MS SQL

Часто наши клиенты задают нам вопросы связанные с быстрым ростом размеров базы данных MS SQL.
1С:Предприятие использует БД MS SQL, а сервер на котором все это работает может столкнуться с тем, что банально для базы не хватит места.

0 / 0