Как эффективно удалить пустые строки из таблицы значений и очистить данные от кавычек

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При импорте данных из внешних источников, таких как файлы DBF, Excel или текстовые документы, разработчики часто сталкиваются с двумя проблемами: появлением "фантомных" пустых строк в таблице значений и наличием лишних символов (кавычек, пробелов) в строковых данных. В этой статье мы подробно разберем, как правильно очищать таблицы значений, почему стандартные циклы могут работать некорректно и как бороться с лишними кавычками, учитывая особенности работы отладчика 1С.

Метод 1: Удаление строк через поиск по структуре (НайтиСтроки)

Самый простой и эффективный способ избавиться от строк, где ключевые поля не заполнены, — это использование метода НайтиСтроки(). Рассмотрим ситуацию, когда нам нужно удалить строки, в которых и "Код", и "Наименование" являются пустыми строками. Проанализируем пример кода:


// Создаем структуру отбора для поиска пустых значений
Отбор = Новый Структура;
Отбор.Вставить("Код", "");
Отбор.Вставить("Наименование", "");

// Находим все строки, соответствующие условию
МассивПустыхСтрок = ТабЗнач.НайтиСтроки(Отбор);

// Удаляем найденные строки из исходной таблицы
Для Каждого СтрокаМассива Из МассивПустыхСтрок Цикл
    ТабЗнач.Удалить(СтрокаМассива);
КонецЦикла;

Важный нюанс: Этот метод хорош тем, что мы сначала получаем массив ссылок на строки, а затем удаляем их. Это избавляет нас от проблем с "перескакиванием" индексов, которые возникают при удалении строк непосредственно внутри цикла по таблице.

Метод 2: Удаление строк через обратный цикл (Обход с конца)

Если условие удаления строки более сложное (например, нужно проверить заполнение не на точное соответствие, а через функцию ЗначениеЗаполнено() или поиск подстроки), метод со структурой не подойдет. В этом случае мы используем цикл Для с обходом от последней строки к первой. Выясним причину, почему это важно: при удалении строки с индексом 2, бывшая строка 3 становится строкой 2. Если цикл идет "вперед", итератор перейдет к строке 3 (которая раньше была 4-й), и мы пропустим проверку одной строки. Обход с конца решает эту проблему.


КоличествоСтрок = ТабЗнач.Количество();

// Используем обратный цикл: от последнего индекса к нулю
Для Счетчик = 1 По КоличествоСтрок Цикл
    ТекущийИндекс = КоличествоСтрок - Счетчик;
    СтрокаТЗ = ТабЗнач[ТекущийИндекс];
    
    // Проверяем условие (например, пустое наименование или тип)
    Если Не ЗначениеЗаполнено(СтрокаТЗ.Наименование) Тогда
        ТабЗнач.Удалить(ТекущийИндекс);
    КонецЕсли;
КонецЦикла;

В данном примере мы использовали функцию ЗначениеЗаполнено(). Это универсальный инструмент 1С, который корректно определяет "пустоту" для любого типа: пустая ссылка справочника, число 0, пустая строка или незаполненная дата.

Борьба с лишними кавычками при импорте из DBF

При работе с форматом DBF часто возникает ситуация, когда строковые значения приходят обрамленными в двойные кавычки. Рассмотрим ситуацию: в базе 1С номенклатура называется м., а в файле она записана как "м.". При прямом сравнении программа скажет, что значения разные.

Многие начинающие разработчики пытаются использовать сложные манипуляции с функциями Прав() или Лев(), но самым надежным способом остается функция СтрЗаменить(). Разберем по шагам, как правильно удалить кавычки:


// Способ 1: Использование четырех кавычек подряд для обозначения одного символа кавычки
НаимБезКавычек = СтрЗаменить(СтрокаИзФайла, """", "");

// Способ 2: Более читаемый вариант с использованием функции Символ
Кавычка = Символ(34); // ASCII код двойной кавычки
НаимБезКавычек = СтрЗаменить(СтрокаИзФайла, Кавычка, "");

Типичная ошибка: Часто программисты пишут СтрЗаменить(Строка, """", ""), но забывают присвоить результат обратно переменной. Помните, что СтрЗаменить — это функция, которая возвращает новую строку, а не изменяет существующую "на месте".

Особенности отображения строк в отладчике

Важно проанализировать ситуацию, с которой сталкиваются почти все новички: в окне "Вычислить выражение" или в списке переменных отладчика строковые значения всегда отображаются в кавычках. Например, если переменная содержит текст Привет, отладчик покажет "Привет".

Это визуальное представление среды разработки, самих кавычек внутри строки нет. Чтобы проверить, есть ли "реальные" кавычки в данных, посмотрите на длину строки (функция СтрДлина()) или нажмите F2 на переменной в отладчике, чтобы открыть детальный просмотр. Если вы видите конструкцию вида ""Текст"" (двойные кавычки), значит, в самих данных действительно присутствуют лишние символы.

Тонкости работы с фиксированной длиной полей в DBF

Проанализируем еще одну причину, по которой строки могут казаться "не пустыми" или не проходить сравнение. Поля в DBF часто имеют фиксированную длину. Если поле определено как 50 символов, а в нем записано слово "Товар", то при загрузке в 1С вы получите строку "Товар" и 45 пробелов после нее.

Для корректной работы всегда используйте функцию СокрЛП() (Сократить Левые и Правые пробелы) сразу при чтении данных из объекта XBase:


// Правильное чтение данных из DBF
Пока xBase.Следующая() Цикл
    НоваяСтрока = ТабЗнач.Добавить();
    // Убираем лишние пробелы сразу при загрузке
    НоваяСтрока.ТоварКод = СокрЛП(xBase.ID);
    НоваяСтрока.ТоварНаим = СокрЛП(xBase.NAME);
КонецЦикла;

Использование запроса для очистки больших таблиц

Если таблица значений содержит десятки тысяч строк, удаление в цикле может занять значительное время. В таких случаях мы рекомендуем использовать временные таблицы в запросе. Посмотрим на этот алгоритм:

  1. Выгружаем таблицу значений в менеджер временных таблиц.
  2. Выполняем запрос к этой временной таблице.
  3. В секции ГДЕ прописываем условия исключения пустых строк (например, НЕ Номенклатура ЕСТЬ NULL И Наименование <> "").
  4. Выгружаем результат запроса обратно в таблицу значений.

Этот метод работает на порядок быстрее за счет оптимизации операций с данными на уровне ядра платформы.

Подводя итог, можно сказать: для качественной очистки данных при импорте всегда сочетайте удаление пустых строк (через НайтиСтроки или обратный цикл) с предварительной обработкой строк функциями СокрЛП и СтрЗаменить. Это обеспечит корректное сравнение данных и стабильную работу ваших алгоритмов.

← На главную