Перейти к содержимому

Пользователь не создался при импорте - разбор причин

Скрипт импорта проходит по файлу без падений, а учётных записей в списке нет. Разбираем причины по убыванию частоты, начиная с текста ошибки записи.

С чего начать

Печатаем текст ошибки на каждой строке:

$cuser = new \CUser();
$id = $cuser->Add($fields);
if (!$id) {
printf("строка %d: %s\n", $n, $cuser->LAST_ERROR); // причина отказа целиком
}
// молчаливый пропуск строки - главная ошибка любого импорта

Текст ошибки называет причину прямым текстом почти всегда. Импорт без вывода этой строки превращает разбор в гадание, поэтому её добавляют первой же правкой скрипта.

Проверяем занятость логина и почты:

$rs = \Bitrix\Main\UserTable::getList(['filter' => ['LOGIC' => 'OR',
['=LOGIN' => $login], ['=EMAIL' => $email]], 'select' => ['ID', 'LOGIN', 'EMAIL']]);
print_r($rs->fetchAll()); // пустой ответ означает, что дело не в занятости

Смотрим политику паролей для групп:

$policy = \CUser::GetGroupPolicy([2, 5]); // группы, в которые кладём пользователя
printf("длина от %s, спецсимволы %s\n", $policy['PASSWORD_LENGTH'],
$policy['PASSWORD_PUNCTUATION'] ?? 'N');

Политика собирается из всех групп сразу и берёт самые строгие значения. Пароль, подходящий для одной группы, может не пройти проверку из-за второй группы в том же списке.

Ищем обработчики события создания:

$conn = \Bitrix\Main\Application::getConnection();
print_r($conn->query("SELECT TO_MODULE_ID, TO_CLASS, TO_METHOD FROM b_module_to_module
WHERE MESSAGE_ID IN ('OnBeforeUserAdd', 'OnBeforeUserUpdate')")->fetchAll());
// обработчик умеет отклонить создание и вернуть свою ошибку

Проверяем, что приехало из файла:

Окно терминала
file -i /tmp/users.csv
head -3 /tmp/users.csv | cat -A | cut -c1-120
# кодировка и разделитель видны сразу, вместе с невидимыми символами

Причины

  1. Не заполнены обязательные поля учётной записи примерно 30% случаев

    ПризнакОшибка называет конкретное поле: логин, почту или подтверждение пароля.

    ПроверкаПечатаем массив полей перед записью и сверяем его с обязательными полями формы.

    Что делатьЗаполняем логин, почту, пароль и подтверждение пароля одинаковым значением.

  2. Логин или почта уже заняты другой записью примерно 25% случаев

    ПризнакНе создаётся часть строк, причём именно те, что уже приезжали в прошлый раз.

    ПроверкаИщем выборкой пользователя с таким логином или почтой до попытки создания.

    Что делатьОбновляем найденную запись вместо создания новой и сопоставляем по внешнему коду.

  3. Пароль не проходит политику групп примерно 20% случаев

    ПризнакОшибка говорит про длину пароля или про требования к его составу.

    ПроверкаСмотрим политику для тех групп, в которые импорт кладёт нового пользователя.

    Что делатьГенерируем пароль по самым строгим требованиям и отправляем ссылку на его смену.

  4. Создание отклоняет обработчик события примерно 15% случаев

    ПризнакОшибка приходит с текстом, которого нет ни в одном сообщении платформы.

    ПроверкаСмотрим таблицу обработчиков на события создания и изменения пользователя.

    Что делатьПравим свой обработчик или пропускаем его проверку для служебного импорта.

  5. Файл приехал в другой кодировке или с другим разделителем примерно 10% случаев

    ПризнакПоля пустые или смещены, а в значениях видны нечитаемые символы.

    ПроверкаСмотрим кодировку файла и первые строки вместе с невидимыми символами.

    Что делатьПерекодируем файл в кодировку сайта и задаём разделитель разбора явно.

Частые вопросы

Почему скрипт не падает, а записей нет?

Метод добавления возвращает признак неудачи, а не бросает исключение. Без проверки результата и вывода ошибки импорт молча пропускает строки.

Обязательно ли подтверждение пароля?

Да, при создании из кода его передают вместе с самим паролем. Значения должны совпадать, иначе запись не создаётся.

Можно ли завести двух пользователей с одной почтой?

Это зависит от настройки главного модуля о уникальности почты. По умолчанию совпадение почты допускается, а вот логин уникален всегда.

Как обойти политику паролей при импорте?

Не обходить, а генерировать пароль по её требованиям и требовать смену при первом входе. Ослабление политики ради импорта остаётся с проектом надолго.

Как понять, что мешает именно обработчик?

По тексту ошибки: он не похож на сообщения платформы и обычно написан по-своему. Список обработчиков события создания подтверждает догадку за минуту.

Смежное

Первоисточник