Импорт/Экспорт пользователей через CSV файл (запуск на Cron), Способ автоматического обмена данными с другими системами при помощи импорта и экспорта пользователей через CSV файлы с запуском на кроне
К сожалению, в Интернете довольно мало подробно описанных и готовых примеров кода импорта/экспорта данных 1С Битрикс через CSV-файлы, что лично для меня, какое-то время было проблемой, в процессе реализации проекта. Может кому-то данная тема окажется полезной в работе и избавит от головной боли.
Скрипты проверены и работают в актуальных версиях продуктов 1С Битрикс на текущий момент. Но так как я еще в процессе изучения Bitrix Framework, поэтому могут быть более тривиальные способы решения задачи импорта/экспорта и если Вы знаете такие, огромная просьба отписаться в данной теме и указать на ошибки или предложить улучшения.
Импорт/Экспорт данных любых инфоблоков через CSV файлы я описал в этой теме.
Обновление полей пользователей (импорт данных из CSV файла) При этом подразумевается, что добавление новых пользователей производится через Active Directory или непосредственно в 1С Битрикс.
Код
<?php
/* Для запуска на Cron'е (автоматически, по расписанию), нужно добавить этот код в файл.
То есть, создаем файл, например, назовем его data_import_users.php в любой
папке в файловой структуре, помещаем в него весь этот код с тегами <?php ?> и запускаем
исполнение файла на Cron'е через командную строку BitrixVM, с нужным интервалом.
Также можно создать Агента и добавить данный код в /bitrix/php_interface/init.php
Пример создания Агента: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2290&LESSON_PATH=3913.4776.4620.4978.2290
*/
/*
// Для запуска на кроне нужно раскомментировать этот участок кода
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/.." ) ;
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php" ) ;
@set_time_limit(0);
@ignore_user_abort(true);
*/
/* Для запуска через Командную PHP-строку в панели Администратора достаточно кода ниже,
при этом теги <?php ?> в начале и конце кода не ставятся */
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php"); // Подключаем библиотеку CCSVData
$filePath = $_SERVER["DOCUMENT_ROOT"] . '/imtest/data_import_users.csv'; // Путь до CSV файла, откуда берем данные (от корня сайта)
/* Содержимое CSV файла должно выглядеть так (при открытии через текстовый редактор):
1;Login1;Anton;Bytsko;anton@gmail.com
2;Login2;Ivan;Ivanov;ivan@gmail.com
и так далее */
// Будьте осторожны с обновлением полей пользователя с ID = 1, это Главный Администратор, для экспериментов начните с ID = 2
$csvFile = new CCSVData('R', false); // Создаём объект – экземпляр класса CCSVData
$csvFile->LoadFile($filePath); // Указываем методу LoadFile путь до CSV файла
$csvFile->SetDelimiter(';'); // Устанавливаем разделитель для CSV файла
$user = new CUser; // Объявляем класс для работы с пользователями
while ($arFields = $csvFile->Fetch()) // Циклом вытаскиваем данные из каждой строки CSV файла и записываем их в поля пользователя
{
$fields = Array(
"LOGIN" => $arFields[1],
"NAME" => $arFields[2], // В поле NAME пользователя помещаем данные из второго столбца CSV файла и т.д.
"LAST_NAME" => $arFields[3],
"EMAIL" => $arFields[4],
//"PASSWORD" => "123456", // Пароль также можно передавать из CSV, например $arFields[5]
//"CONFIRM_PASSWORD" => "123456",
/* Если нужно передать или изменить подразделение пользователя, то передаем ID подразделений в массиве, например
"UF_DEPARTMENT" => Array(1, 2), где приставка UF_ указывает на пользовательское свойство (USER FIELD) */
);
$ID = $arFields[0]; // Указываем на ID пользователя, который хранится, например, в первом столбце CSV файла (в массиве это 0)
if(!$user->Update($ID, $fields)) // Обновляем данные из CSV файла пользователю с указанным ID
{
//echo $user->LAST_ERROR; // Если пользователь не обновился, выводим ошибку. Если скрипт работает на Cron'е, здесь можно написать простой обработчик отправки письма на E-mail Администратора с текстом ошибки
// Если произошла ошибка, отправляем письмо с текстом ошибки Администратору
$mail = "mailadmin@testdomain.local"; //Ваша почта (кому), правильнее, если
$subject = "Test"; //Тема письма
$text = $user->LAST_ERROR; //Текст письма
mail($mail, $subject, $text);
// Если используется Битрикс24 и установлен модуль "Веб мессенджер", то еще отправляем уведомление об ошибке Администратору в чат на портале
if (IsModuleInstalled("im") && CModule::IncludeModule("im"))
{
$arMessageFields = array(
"TO_USER_ID" => 1, // Получатель
"FROM_USER_ID" => 0, // Отправитель (может быть > 0)
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // Тип уведомления
"NOTIFY_MODULE" => "im", // Модуль запросивший отправку уведомления
"NOTIFY_TAG" => "IM_CONFIG_NOTICE", // Символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр
"NOTIFY_MESSAGE" => '[b]Внимание:[/b] произошел сбой при импорте пользователей на Cron, проверьте почту, чтобы узнать об ошибке', // Текст уведомления на сайте (доступен html и бб-коды)
//"NOTIFY_MESSAGE_OUT" => '' // Текст уведомления для отправки на почту (или XMPP), если различий нет - не задаем параметр
);
CIMNotify::Add($arMessageFields); // Отправляем уведомление
}
}
/* Для добавления новых пользователей нужно конструкцию $ID = $arFields[0]; if(!$user->Update($ID, $fields)){echo $user->LAST_ERROR;} заменить на
$ID = $user->Add($fields); // Добавляем нового пользователя с данными из CSV файла
if (intval($ID) > 0) // Проверка, если запись не добавлена, показывает ошибку
{
echo "Пользователь успешно добавлен.";
} else {
echo $user->LAST_ERROR; //Или добавляем код отправки письма и уведомления в чат Администратору
}
При этом, записывать ID пользователя в CSV файл и затем брать его не нужно, ID будет присваиваться автоматически в Битрикс,
а значит, первый столбец в CSV делаем, например LOGIN, с ключом 0 ("LOGIN" => $arFields[0])
*/
}
/*
Чтобы посмотреть список всех полей пользователя, можно в Командной PHP-строке в
панели Администратора выполнить PHP скрипт, представленный ниже. После чего, выбрать
нужные поля и указать их в массиве $fields = Array(...
$rsUser = CUser::GetByID(23); // В () указать ID нужного пользователя
$arUser = $rsUser->Fetch();
echo "<pre>"; print_r($arUser); echo "</pre>";
*/
?>
Выгрузка пользователей из 1С Битрикс (экспорт данных в CSV файл)
Код
<?php
/* Для запуска на Cron'е (автоматически, по расписанию), нужно добавить этот код в файл.
То есть, создаем файл, например, назовем его data_export_users.php в любой
папке в файловой структуре, помещаем в него весь этот код с тегами <?php ?> и запускаем
исполнение файла на Cron'е через командную строку BitrixVM, с нужным интервалом.
Также можно создать Агента и добавить данный код в /bitrix/php_interface/init.php
Пример создания Агента: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2290&LESSON_PATH=3913.4776.4620.4978.2290
*/
/*
// Для запуска на кроне нужно раскомментировать этот участок кода
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/.." ) ;
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php" ) ;
@set_time_limit(0);
@ignore_user_abort(true);
*/
/* Для запуска через Командную PHP-строку в панели Администратора достаточно кода ниже,
при этом теги <?php ?> в начале и конце кода не ставятся */
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php"); // Подключаем библиотеку CCSVData
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/imtest/' . 'data_export_users.csv'; // Путь до файла, куда записываем данные из инфоблока, от корня сайта
$fp = fopen($filePath, 'w+'); // Очищаем файл CSV, иначе записи будут добавляться к уже имеющимся
@fclose($fp); // Закрываем файл CSV
$fields_type = 'R'; // Дописываем строки в файл
$delimiter = ";"; // Устанавливаем разделитель для CSV файла
$csvFile = new CCSVData($fields_type, false); // Создаём объект – экземпляр класса CCSVData
$csvFile->SetFieldsType($fields_type); // Метод класса CCSVData, задающий тип записи в файл R
$csvFile->SetDelimiter($delimiter); // Метод класса CCSVData, устанавливающий разделитель
$csvFile->SetFirstHeader(false); // Метод класса CCSVData, указывающий, что первая строка будет шапкой
$rsUsers = CUser::GetList(($by="id"),($order="desc")); // Функция Битрикс API. Возвращает список пользователей по их ID
while($arItem = $rsUsers->GetNext())
{
$exportUserDATA = array($arItem['ID'],$arItem['LOGIN'],$arItem['NAME'],$arItem['LAST_NAME'],$arItem['EMAIL']); // Присваиваем набор полей и свойств пользователя в $exportUserDATA
$csvFile->SaveFile($filePath, $exportUserDATA); // Записываем результат из переменной $exportDATA в CSV файл
}
/* Содержимое CSV файла после экспорта будет выглядеть так (при открытии через текстовый редактор):
1;Login1;Anton;Bytsko;anton@gmail.com
2;Login2;Ivan;Ivanov;ivan@gmail.com
и так далее */
?>
написал: К сожалению, в Интернете довольно мало подробно описанных и готовых примеров кода импорта/экспорта данных 1С Битрикс через CSV-файлы, что лично для меня, какое-то время было проблемой, в процессе реализации проекта. Может кому-то данная тема окажется полезной в работе и избавит от головной боли.
Скрипты проверены и работают в актуальных версиях продуктов 1С Битрикс на текущий момент. Но так как я еще в процессе изучения Bitrix Framework, поэтому могут быть более тривиальные способы решения задачи импорта/экспорта и если Вы знаете такие, огромная просьба отписаться в данной теме и указать на ошибки или предложить улучшения.
Импорт/Экспорт данных любых инфоблоков через CSV файлы я описал в этой теме .
Обновление полей пользователей (импорт данных из CSV файла) При этом подразумевается, что добавление новых пользователей производится через Active Directory или непосредственно в 1С Битрикс.
Код
<?php
/* Для запуска на Cron'е (автоматически, по расписанию), нужно добавить этот код в файл.
То есть, создаем файл, например, назовем его data_import_users.php в любой
папке в файловой структуре, помещаем в него весь этот код с тегами <?php ?> и запускаем
исполнение файла на Cron'е через командную строку BitrixVM, с нужным интервалом.
Также можно создать Агента и добавить данный код в /bitrix/php_interface/init.php
Пример создания Агента: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2290&LESSON_PATH=3913.4776.4620.4978.2290
*/
/*
// Для запуска на кроне нужно раскомментировать этот участок кода
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/.." ) ;
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php" ) ;
@set _time_limit(0);
@ignore _user_abort(true);
*/
/* Для запуска через Командную PHP-строку в панели Администратора достаточно кода ниже,
при этом теги <?php ?> в начале и конце кода не ставятся */
require_once ( $_SERVER [ "DOCUMENT_ROOT" ] . "/bitrix/modules/main/classes/general/csv_data.php" ); // Подключаем библиотеку CCSVData
$filePath = $_SERVER [ "DOCUMENT_ROOT" ] . '/imtest/data_import_users.csv' ; // Путь до CSV файла, откуда берем данные (от корня сайта)
/* Содержимое CSV файла должно выглядеть так (при открытии через текстовый редактор):
1;Login1;Anton;Bytsko;anton@gmail.com
2;Login2;Ivan;Ivanov;ivan@gmail.com
и так далее */
// Будьте осторожны с обновлением полей пользователя с ID = 1, это Главный Администратор, для экспериментов начните с ID = 2
$csvFile = new CCSVData( 'R' , false ); // Создаём объект – экземпляр класса CCSVData
$csvFile ->LoadFile( $filePath ); // Указываем методу LoadFile путь до CSV файла
$csvFile ->SetDelimiter( ';' ); // Устанавливаем разделитель для CSV файла
$user = new CUser; // Объявляем класс для работы с пользователями
while ( $arFields = $csvFile ->Fetch()) // Циклом вытаскиваем данные из каждой строки CSV файла и записываем их в поля пользователя
{
$fields = Array (
"LOGIN" => $arFields [ 1 ],
"NAME" => $arFields [ 2 ], // В поле NAME пользователя помещаем данные из второго столбца CSV файла и т.д.
"LAST_NAME" => $arFields [ 3 ],
"EMAIL" => $arFields [ 4 ],
//"PASSWORD" => "123456", // Пароль также можно передавать из CSV, например $arFields[5]
//"CONFIRM_PASSWORD" => "123456",
/* Если нужно передать или изменить подразделение пользователя, то передаем ID подразделений в массиве, например
"UF_DEPARTMENT" => Array(1, 2), где приставка UF_ указывает на пользовательское свойство (USER FIELD) */
);
$ID = $arFields [ 0 ]; // Указываем на ID пользователя, который хранится, например, в первом столбце CSV файла (в массиве это 0)
if (! $user ->Upd ate( $ID , $fields )) // Обновляем данные из CSV файла пользователю с указанным ID
{
//echo $user->LAST_ERROR; // Если пользователь не обновился, выводим ошибку. Если скрипт работает на Cron'е, здесь можно написать простой обработчик отправки письма на E-mail Администратора с текстом ошибки
// Если произошла ошибка, отправляем письмо с текстом ошибки Администратору
$mail = "mailadmin@testdomain.local" ; //Ваша почта (кому), правильнее, если
$subject = "Test" ; //Тема письма
$text = $user ->LAST_ERROR; //Текст письма
mail( $mail , $subject , $text );
// Если используется Битрикс24 и установлен модуль "Веб мессенджер", то еще отправляем уведомление об ошибке Администратору в чат на портале
if (IsModuleInstalled( "im" ) && CModule::IncludeModule( "im" ))
{
$arMessageFields = array (
"TO_USER_ID" => 1 , // Получатель
"FROM_USER_ID" => 0 , // Отправитель (может быть > 0)
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // Тип уведомления
"NOTIFY_MODULE" => "im" , // Модуль запросивший отправку уведомления
"NOTIFY_TAG" => "IM_CONFIG_NOTICE" , // Символьный тэг для группировки (будет выведено только одно сообщение), если это не требуется - не задаем параметр
"NOTIFY_MESSAGE" => '[b]Внимание:[/b] произошел сбой при импорте пользователей на Cron, проверьте почту, чтобы узнать об ошибке' , // Текст уведомления на сайте (доступен html и бб-коды)
//"NOTIFY_MESSAGE_OUT" => '' // Текст уведомления для отправки на почту (или XMPP), если различий нет - не задаем параметр
);
CIMNotify::Add( $arMessageFields ); // Отправляем уведомление
}
}
/* Для добавления новых пользователей нужно конструкцию $ID = $arFields[0]; if(!$user->Update($ID, $fields)){echo $user->LAST_ERROR;} заменить на
$ID = $user->Add($fields); // Добавляем нового пользователя с данными из CSV файла
if (intval($ID) > 0) // Проверка, если запись не добавлена, показывает ошибку
{
echo "Пользователь успешно добавлен.";
} else {
echo $user->LAST_ERROR; //Или добавляем код отправки письма и уведомления в чат Администратору
}
При этом, записывать ID пользователя в CSV файл и затем брать его не нужно, ID будет присваиваться автоматически в Битрикс,
а значит, первый столбец в CSV делаем, например LOGIN, с ключом 0 ("LOGIN" => $arFields[0])
*/
}
/*
Чтобы посмотреть список всех полей пользователя, можно в Командной PHP-строке в
панели Администратора выполнить PHP скрипт, представленный ниже. После чего, выбрать
нужные поля и указать их в массиве $fields = Array(...
$rsUser = CUser::GetByID(23); // В () указать ID нужного пользователя
$arUser = $rsUser->Fetch();
echo "<pre>"; print_r($arUser); echo "</pre>";
*/
?>
Выгрузка пользователей из 1С Битрикс (экспорт данных в CSV файл)
Код
<?php
/* Для запуска на Cron'е (автоматически, по расписанию), нужно добавить этот код в файл.
То есть, создаем файл, например, назовем его data_export_users.php в любой
папке в файловой структуре, помещаем в него весь этот код с тегами <?php ?> и запускаем
исполнение файла на Cron'е через командную строку BitrixVM, с нужным интервалом.
Также можно создать Агента и добавить данный код в /bitrix/php_interface/init.php
Пример создания Агента: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2290&LESSON_PATH=3913.4776.4620.4978.2290
*/
/*
// Для запуска на кроне нужно раскомментировать этот участок кода
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/.." ) ;
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('CHK_EVENT', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php" ) ;
@se t _time_limit(0);
@ignore _user_abort(true);
*/
/* Для запуска через Командную PHP-строку в панели Администратора достаточно кода ниже,
при этом теги <?php ?> в начале и конце кода не ставятся */
require_once ( $_SERVER [ "DOCUMENT_ROOT" ] . "/bitrix/modules/main/classes/general/csv_data.php" ); // Подключаем библиотеку CCSVData
$filePath = $_SERVER [ 'DOCUMENT_ROOT' ] . '/imtest/' . 'data_export_users.csv' ; // Путь до файла, куда записываем данные из инфоблока, от корня сайта
$fp = fopen( $filePath , 'w+' ); // Очищаем файл CSV, иначе записи будут добавляться к уже имеющимся
@fclose( $fp ); // Закрываем файл CSV
$fields_type = 'R' ; // Дописываем строки в файл
$delimiter = ";" ; // Устанавливаем разделитель для CSV файла
$csvFile = new CCSVData( $fields_type , false ); // Создаём объект – экземпляр класса CCSVData
$csvFile ->SetFieldsType( $fields_type ); // Метод класса CCSVData, задающий тип записи в файл R
$csvFile ->SetDelimiter( $delimiter ); // Метод класса CCSVData, устанавливающий разделитель
$csvFile ->SetFirstHeader( false ); // Метод класса CCSVData, указывающий, что первая строка будет шапкой
$rsUsers = CUser::GetList(( $by = "id" ),( $order = "desc" )); // Функция Битрикс API. Возвращает список пользователей по их ID
while ( $arItem = $rsUsers ->GetNext())
{
$exportUserDATA = array ( $arItem [ 'ID' ], $arItem [ 'LOGIN' ], $arItem [ 'NAME' ], $arItem [ 'LAST_NAME' ], $arItem [ 'EMAIL' ]); // Присваиваем набор полей и свойств пользователя в $exportUserDATA
$csvFile ->SaveFile( $filePath , $exportUserDATA ); // Записываем результат из переменной $exportDATA в CSV файл
}
/* Содержимое CSV файла после экспорта будет выглядеть так (при открытии через текстовый редактор):
1;Login1;Anton;Bytsko;anton@gmail.com
2;Login2;Ivan;Ivanov;ivan@gmail.com
и так далее */
?>
Подскажите, пожалуйста, таким образом можно сделать выгрузку пользователей в 1с? Поставили задачу выгружать список пользователей в указанную систему. Просто не увидел в вашем коде отправку на другой сервер или в другую систему. Правильно ли я понял, что данный файл будет сохраняться на этом же сервере?