При работе с внешними данными, например, при загрузке информации из Excel в 1С, часто возникает задача поиска пустых ячеек в объекте ТабличныйДокумент. Однако разработчики часто сталкиваются с тем, что стандартные инструменты ведут себя не так, как ожидается, особенно когда счет строк идет на десятки тысяч. В данной статье мы разберем, почему метод НайтиТекст не подходит для этой задачи, почему обычный перебор работает медленно и как решить проблему максимально эффективно.
Метод НайтиТекст встроенного языка 1С предназначен для поиска вхождения подстроки в ячейках табличного документа. Разберем ситуацию: когда мы передаем в качестве параметра пустую строку "", платформа зачастую игнорирует этот вызов или возвращает Неопределено. Это происходит из-за особенностей реализации алгоритма поиска на уровне платформы: поиск рассчитан на наличие хотя бы одного символа. Попытка передать NULL или НеОпределено также не приносит результата, так как метод ожидает именно строковый тип данных.
Проанализируем типичную ошибку при использовании этого метода:
// Этот код не найдет пустые ячейки
НайденнаяОбласть = ТабличныйДокумент.НайтиТекст("", , , , Истина);
Таким образом, использование НайтиТекст для поиска абсолютной пустоты является тупиковым путем.
Рассмотрим стандартный подход, который первым приходит в голову: цикл в цикле с проверкой свойства Текст каждой ячейки. При небольшом количестве строк (до 1000) этот метод работает приемлемо. Однако, если в документе 60 000 строк и более, время выполнения операции возрастает экспоненциально.
Выясним причину такой медлительности. Каждое обращение к ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст — это обращение к тяжеловесному объекту табличного документа через интерфейс платформы. Если у нас 60 000 строк и 10 колонок, системе нужно выполнить 600 000 операций обращения к свойствам объектов. Это создает колоссальную нагрузку на процессор и оперативную память.
Самым быстрым и правильным способом работы с большими табличными документами в 1С является их предварительная конвертация в ТаблицаЗначений. Для этого идеально подходит объект ПостроительЗапроса. Он умеет считывать данные из области табличного документа целиком, что происходит в десятки раз быстрее, чем перебор ячеек.
Разберем по шагам, как реализовать этот метод:
ОписаниеИсточникаДанных, чтобы передать область построителю.Посмотрим на пример кода, реализующий этот алгоритм:
// 1. Создаем построитель запроса
ПЗ = Новый ПостроительЗапроса;
// 2. Указываем область табличного документа в качестве источника
// Предположим, ТабДок - наш заполненный документ
ОбластьДляАнализа = ТабДок.Область();
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДляАнализа);
// 3. Выполняем "чтение" данных
ПЗ.Выполнить();
// 4. Получаем таблицу значений
ТЗ = ПЗ.Результат.Выгрузить();
// Теперь мы можем мгновенно найти пустые строки в ТЗ
ПараметрыОтбора = Новый Структура("Колонка1", ""); // Замените "Колонка1" на имя вашей колонки
НайденныеСтроки = ТЗ.НайтиСтроки(ПараметрыОтбора);
Этот метод позволяет обработать 60 000 строк за считанные секунды, так как основная работа по чтению данных выполняется платформой на низком уровне «одним куском».
Проанализируем ситуацию, когда данные загружены из Excel. Часто ячейка кажется пустой, но на самом деле она содержит невидимые символы: пробелы, неразрывные пробелы (символ с кодом 160) или переносы строк. В этом случае прямое сравнение Текст = "" может не сработать.
При работе с полученной ТаблицейЗначений рекомендуется использовать дополнительные проверки. Рассмотрим пример более качественного поиска:
Для Каждого СтрокаТЗ Из ТЗ Цикл
// Используем СокрЛП для удаления пробелов
Если ПустаяСтрока(СокрЛП(СтрокаТЗ.Колонка1)) Тогда
// Мы нашли пустую ячейку (или ячейку только с пробелами)
// Выполняем необходимую логику
КонецЕсли;
КонецЦикла;
В некоторых случаях можно попробовать использовать метод НайтиЗначение. В отличие от НайтиТекст, этот метод ищет точное совпадение значения, хранящегося в ячейке. Однако стоит помнить, что он работает только в том случае, если в ячейке установлено именно значение (свойство Значение), а не просто отображаемый текст. Если вы наполняете документ из Excel простым текстом, этот метод может оказаться бесполезным.
Подводя итог нашему разбору, можно выделить следующие рекомендации по поиску пустых ячеек в больших ТабличныхДокументах:
НайтиТекст для поиска пустых строк — он для этого не предназначен.Область().Текст при объеме данных более 5-10 тысяч строк.ПостроительЗапроса для конвертации документа в ТаблицаЗначений. Это обеспечит максимальную производительность.СокрЛП, чтобы исключить влияние лишних пробелов, пришедших из внешних файлов.Применяя данные подходы, вы сможете сократить время обработки данных в ваших обработках с нескольких минут до пары секунд, обеспечивая при этом высокую надежность поиска.