Пользователь не создался при импорте - разбор причин
Скрипт импорта проходит по файлу без падений, а учётных записей в списке нет. Разбираем причины по убыванию частоты, начиная с текста ошибки записи.
С чего начать
Печатаем текст ошибки на каждой строке:
$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.csvhead -3 /tmp/users.csv | cat -A | cut -c1-120# кодировка и разделитель видны сразу, вместе с невидимыми символамиПричины
-
Не заполнены обязательные поля учётной записи примерно 30% случаев
ПризнакОшибка называет конкретное поле: логин, почту или подтверждение пароля.
ПроверкаПечатаем массив полей перед записью и сверяем его с обязательными полями формы.
Что делатьЗаполняем логин, почту, пароль и подтверждение пароля одинаковым значением.
-
Логин или почта уже заняты другой записью примерно 25% случаев
ПризнакНе создаётся часть строк, причём именно те, что уже приезжали в прошлый раз.
ПроверкаИщем выборкой пользователя с таким логином или почтой до попытки создания.
Что делатьОбновляем найденную запись вместо создания новой и сопоставляем по внешнему коду.
-
Пароль не проходит политику групп примерно 20% случаев
ПризнакОшибка говорит про длину пароля или про требования к его составу.
ПроверкаСмотрим политику для тех групп, в которые импорт кладёт нового пользователя.
Что делатьГенерируем пароль по самым строгим требованиям и отправляем ссылку на его смену.
-
Создание отклоняет обработчик события примерно 15% случаев
ПризнакОшибка приходит с текстом, которого нет ни в одном сообщении платформы.
ПроверкаСмотрим таблицу обработчиков на события создания и изменения пользователя.
Что делатьПравим свой обработчик или пропускаем его проверку для служебного импорта.
-
Файл приехал в другой кодировке или с другим разделителем примерно 10% случаев
ПризнакПоля пустые или смещены, а в значениях видны нечитаемые символы.
ПроверкаСмотрим кодировку файла и первые строки вместе с невидимыми символами.
Что делатьПерекодируем файл в кодировку сайта и задаём разделитель разбора явно.
Частые вопросы
Почему скрипт не падает, а записей нет?
Метод добавления возвращает признак неудачи, а не бросает исключение. Без проверки результата и вывода ошибки импорт молча пропускает строки.
Обязательно ли подтверждение пароля?
Да, при создании из кода его передают вместе с самим паролем. Значения должны совпадать, иначе запись не создаётся.
Можно ли завести двух пользователей с одной почтой?
Это зависит от настройки главного модуля о уникальности почты. По умолчанию совпадение почты допускается, а вот логин уникален всегда.
Как обойти политику паролей при импорте?
Не обходить, а генерировать пароль по её требованиям и требовать смену при первом входе. Ослабление политики ради импорта остаётся с проектом надолго.
Как понять, что мешает именно обработчик?
По тексту ошибки: он не похож на сообщения платформы и обычно написан по-своему. Список обработчиков события создания подтверждает догадку за минуту.
Смежное
- Импорт пользователей - оглавление подтемы
- Импорт пользователей из файла: связь, пароли, группы - как устроен сам импорт
- Синхронизация пользователей с внешней системой: ключ, группы, увольнения - когда обмен регулярный
- Регистрация покупателей: форма, подтверждение, свои поля - те же проверки при регистрации
- Обработчик события не срабатывает: разбор причин - разбор своих обработчиков
- Кракозябры вместо текста: кодировки файлов, базы и обмена - когда виновата кодировка файла
- Пользователи, группы и права доступа - устройство учётных записей целиком
- Учётная запись изнутри - какие проверки проходит запись до появления в базе