Как найти проблемную строку в большом файле при загрузке в 1С, если ошибка не указывает строку
Что проверяют
Умеете ли вы искать ошибку системно, а не перебором, когда инструмент ничего не подсказывает. Для фронтенд-разработчика это обычно файл, который пользователь загружает через ваш интерфейс, поэтому следом спросят, как поймать такую строку ещё до отправки в 1С.
Как отвечать
Каркас из трёх шагов.
Первый: исключить то, что ломает файл целиком, а не одну строку. Это кодировка (UTF-8 с BOM или без, Windows-1251), разделитель, переводы строк, пустая строка в конце. Если падает уже на первой записи, почти всегда дело здесь.
Второй: бинарный поиск. Делите файл пополам, загружаете каждую половину отдельно, дальше делите упавшую. На файле в миллион строк это около двадцати загрузок вместо миллиона. Резать удобно через split -l или скриптом на Node.js, главное повторить строку заголовка в каждой части.
Третий: валидатор, который сам называет номер строки. Во фронтенде его естественно запускать в браузере до отправки:
- кодировка:
new TextDecoder("utf-8", { fatal: true })бросает исключение на битых байтах вместо тихой замены символом-заглушкой; - разбор CSV: Papa Parse работает потоково через
stepилиchunkи в ошибках отдаёт номер строки; - правила полей: число столбцов, формат дат, десятичный разделитель, длина значения под размер реквизита в 1С, неразрывные пробелы
\u00A0и невидимые\u200B; - большие файлы: читать
file.stream()по частям, а не целиком в память, и показывать пользователю список проблемных строк с причиной.
Если есть доступ к обработке загрузки на стороне 1С, попросите оборачивать запись каждой строки в Попытка ... Исключение и писать номер строки в журнал регистрации.
Где спотыкаются
Открывают файл в Excel, чтобы посмотреть, и сохраняют. Excel меняет кодировку, съедает ведущие нули в кодах и переделывает даты, после чего ошибка либо исчезает, либо появляются новые.
Считают, что бинарный поиск найдёт всё. Если проблема в сочетании строк, например дубль ключа в разных половинах, каждая половина по отдельности загрузится без ошибок. Об этом стоит сказать самому.
Грузят построчно или перебирают блоки подряд. Это часы работы там, где деление пополам даёт ответ за двадцать шагов.