Импорт/Экспорт пользователей через 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 ->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с? Поставили задачу выгружать список пользователей в указанную систему. Просто не увидел в вашем коде отправку на другой сервер или в другую систему. Правильно ли я понял, что данный файл будет сохраняться на этом же сервере?
написал: Пока не увеличил swap до размера, равного размеру выделенной оперативной памяти (6 Гб ), система постоянно убивала процесс mysqld в некоторых случаях, например, при резервном копировании (база Битрикс ~5 Гб). В логах было прямо указано, что истощен swap, и мол, убиваю процесс. Также были ошибки, отображаемые в мониторе БД, никакие меры, связанные с настройками параметров MySQL, не приводили к их устранению. После увеличения swap ошибки и падения прекратились.
А каким образом увеличили размер swap? У меня на сервере используется 64 Гб ОЗУ, т.е. получается мне нужно увеличить его до этого размера?
На текущий момент имеются следующие проблемы с БД (см. скрин).
Нигде пока не нашел инфы Важно ли это и как с этим бороться. Увеличивать указанные параметры на сколько знаю не стоит, т.к. это не даст положительного результата. У нас в поддержке, имеется также crm с аналогичными настройками и там этот параметр в пределах нормы. При тестировании производительности выбивает 40-43 попугая, что вроде бы неплохо, но вот этот параметр не дает покоя. Как с ним бороться?
написал: Понятно, что оптимального конфига БД под все пр
BitrixVM сама настраивает оптимальную конфигурацию БД исходя из количества ядер и оперативной памяти. Для высоконагруженных проектов я бы рекомендовал поднимать БД на отдельном сервере, ядра от 5 ГГЦ, NVME
Тут я не соглашусь. У нас проект пока не сильно высоко нагруженный, но подкручивать настройки приходится часто, т.к. то производительности на отработку скриптов не хватает, то еще чего. Полазил на форумах и понял что это довольно таки частая проблема данного продукта, а особенно производительность БД.
написал: [Note] Got an error reading communication packets
Ошибку удалось победить, отключив криво работающий nagios. Он по идее и не нужен, т.к. используем другое ПО мониторинга. Вопрос производительности БД остается открытым, поэтому хотелось бы услышать мнения "бывалых" о том, какие конфиги подбирать лучше всего. Понятно, что оптимального конфига БД под все проекты не существует, но хочется все же сделать свои выводы на основе примеров, которые здесь, возможно, приведут.
хотел узнать, есть ли на виртуальном сервере битрикс корзина? К примеру, удалили какой-то файл на сервере и его нужно восстановить, как это сделать? Есть ли корзина, в которую файл попадает после удаления?
Предыдущая поддержка по какой-то причине отключила автоматический запуск скрипта, расположенного по пути: http://сайт/bitrix/admin/1c_exchange.php... Смотрел в cron на сервере, данный скрипт стоит в списке на автозапуск, но по какой-то причине он не срабатывает автоматически, при запуске обмена на стороне 1с.
может я чего-то не знаю, но обычно 1С инициирует обмен, а не сайт, так как 1С обычно не доступна напрямую извне. Соответственно нужно смотреть расписание обмена в 1С, а не на сайте. Там же есть кнопка запустить сейчас. И причем тут крон мне не понятно.
Алексей, Все верно. С данной проблемой разобрался.
Не знаю были ли уже подобные темы, но стал наблюдать в логах httpd следующую ошибку: AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting Кто знает как ее исправить? Что "подкрутить" и где?