При переходе на новую систему или при масштабном обновлении данных перед программистом часто встает задача разовой загрузки огромных массивов информации. Один из самых частых вопросов: стоит ли пытаться «впихнуть» 40 000, 50 000 или даже 100 000 строк в один документ Ввод остатков или Заказ клиента, или же лучше дробить данные на части? В этой статье мы подробно разберем технические ограничения платформы 1С, проанализируем влияние больших табличных частей на производительность и выясним, как избежать типичных ошибок при загрузке из внешних файлов.
Существует распространенное мнение, что лимит строк в табличной части документа составляет 99 999. Разберемся, откуда взялось это число. В старых конфигурациях и версиях платформы поле НомерСтроки в табличных частях имело фиксированную длину 5 знаков. Это означало, что визуально в интерфейсе номер 100 000 просто не помещался или отображался некорректно. Однако технически современная платформа 1С:Предприятие 8.3 позволяет хранить в табличной части миллионы строк.
Важный нюанс: хотя база данных «переварит» такое количество, пользовательские интерфейсы (особенно управляемые формы) крайне чувствительны к объему данных. Рассмотрим причины, по которым не стоит увлекаться сверхбольшими документами:
Недостаточно памяти.Проанализировав опыт практической эксплуатации, мы рекомендуем придерживаться «золотой середины». Оптимальным размером одной табличной части для документа ввода остатков считается диапазон от 5 000 до 10 000 строк. Рассмотрим преимущества этого подхода:
Для реализации этой логики при загрузке программным способом проанализируем следующий алгоритм:
КоличествоСтрокВДокументе = 10000;
ТекущийДокумент = Неопределено;
СчетчикСтрок = 0;
Для Каждого СтрокаДанных Из ТЗ_ДанныеExcel Цикл
Если СчетчикСтрок % КоличествоСтрокВДокументе = 0 Тогда
Если ТекущийДокумент <> Неопределено Тогда
ТекущийДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
ТекущийДокумент = Документы.ВводОстатковНоменклатуры.СоздатьДокумент();
ТекущийДокумент.Дата = ТекущаяДата();
// Заполнение шапки документа...
КонецЕсли;
НоваяСтрока = ТекущийДокумент.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДанных);
СчетчикСтрок = СчетчикСтрок + 1;
КонецЦикла;
Если ТекущийДокумент <> Неопределено Тогда
ТекущийДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Часто загрузка прерывается из-за ошибок преобразования типов. Одной из самых коварных проблем является неразрывный пробел (символ с кодом 160), который Excel часто добавляет в качестве разделителя тысяч. Обычная функция СтрЗаменить(ЦенаString, " ", "") может его не увидеть. Рассмотрим правильный способ очистки числовых данных:
// Очистка строки от всех видов пробелов перед преобразованием в число
ЧистаяСтрока = СтрЗаменить(СтрокаИзExcel, Символы.НПП, ""); // Удаляем неразрывные пробелы
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", ""); // Удаляем обычные пробелы
Попытка
_Стоимость = Число(ЧистаяСтрока);
Исключение
Сообщить("Ошибка в строке: " + СтрокаИзExcel + ". Не удалось распознать число.");
Продолжить;
КонецПопытки;
Выясним причину, по которой стоит использовать именно такой подход: метод Число() в 1С крайне чувствителен к любым невидимым символам. Если в ячейке Excel число отформатировано как «1 000,00», то без предварительной очистки функция выдаст исключение.
После успешной загрузки большого объема данных (например, 40 000 строк в одном документе) вы можете столкнуться с тем, что попытка посмотреть «Движения документа» приводит к бесконечному ожиданию или вылету системы. Проанализируем ситуацию: это происходит потому, что стандартная форма движений пытается прочитать и отобразить в таблице сразу все записи регистра.
Как посмотреть результат без зависаний:
Ведомость по товарам на складах или аналогичный отчет с отбором по вашему документу-регистратору. Отчеты работают через запросы и гораздо эффективнее справляются с выводом больших массивов.Функции для технического специалиста (или «Все функции») в нужный регистр накопления. Установите отбор по полю Регистратор. Это работает быстрее, чем вызов формы движений из самого документа.Разобравшись в тонкостях работы с большими табличными частями, мы можем подвести итог. Загружать 40 000 записей в один документ в 1С можно, но нецелесообразно с точки зрения стабильности и удобства. Оптимально разбивать загрузку на части по 5 000 - 10 000 строк, предварительно очищая данные от артефактов форматирования Excel. Помните, что основной риск кроется не в записи данных в базу, а в последующей попытке системы отобразить эти данные в пользовательском интерфейсе на слабых рабочих станциях.