При импорте данных из внешних источников, таких как файлы DBF, Excel или текстовые документы, разработчики часто сталкиваются с двумя проблемами: появлением "фантомных" пустых строк в таблице значений и наличием лишних символов (кавычек, пробелов) в строковых данных. В этой статье мы подробно разберем, как правильно очищать таблицы значений, почему стандартные циклы могут работать некорректно и как бороться с лишними кавычками, учитывая особенности работы отладчика 1С.
Самый простой и эффективный способ избавиться от строк, где ключевые поля не заполнены, — это использование метода НайтиСтроки(). Рассмотрим ситуацию, когда нам нужно удалить строки, в которых и "Код", и "Наименование" являются пустыми строками. Проанализируем пример кода:
// Создаем структуру отбора для поиска пустых значений
Отбор = Новый Структура;
Отбор.Вставить("Код", "");
Отбор.Вставить("Наименование", "");
// Находим все строки, соответствующие условию
МассивПустыхСтрок = ТабЗнач.НайтиСтроки(Отбор);
// Удаляем найденные строки из исходной таблицы
Для Каждого СтрокаМассива Из МассивПустыхСтрок Цикл
ТабЗнач.Удалить(СтрокаМассива);
КонецЦикла;
Важный нюанс: Этот метод хорош тем, что мы сначала получаем массив ссылок на строки, а затем удаляем их. Это избавляет нас от проблем с "перескакиванием" индексов, которые возникают при удалении строк непосредственно внутри цикла по таблице.
Если условие удаления строки более сложное (например, нужно проверить заполнение не на точное соответствие, а через функцию ЗначениеЗаполнено() или поиск подстроки), метод со структурой не подойдет. В этом случае мы используем цикл Для с обходом от последней строки к первой. Выясним причину, почему это важно: при удалении строки с индексом 2, бывшая строка 3 становится строкой 2. Если цикл идет "вперед", итератор перейдет к строке 3 (которая раньше была 4-й), и мы пропустим проверку одной строки. Обход с конца решает эту проблему.
КоличествоСтрок = ТабЗнач.Количество();
// Используем обратный цикл: от последнего индекса к нулю
Для Счетчик = 1 По КоличествоСтрок Цикл
ТекущийИндекс = КоличествоСтрок - Счетчик;
СтрокаТЗ = ТабЗнач[ТекущийИндекс];
// Проверяем условие (например, пустое наименование или тип)
Если Не ЗначениеЗаполнено(СтрокаТЗ.Наименование) Тогда
ТабЗнач.Удалить(ТекущийИндекс);
КонецЕсли;
КонецЦикла;
В данном примере мы использовали функцию ЗначениеЗаполнено(). Это универсальный инструмент 1С, который корректно определяет "пустоту" для любого типа: пустая ссылка справочника, число 0, пустая строка или незаполненная дата.
При работе с форматом DBF часто возникает ситуация, когда строковые значения приходят обрамленными в двойные кавычки. Рассмотрим ситуацию: в базе 1С номенклатура называется м., а в файле она записана как "м.". При прямом сравнении программа скажет, что значения разные.
Многие начинающие разработчики пытаются использовать сложные манипуляции с функциями Прав() или Лев(), но самым надежным способом остается функция СтрЗаменить(). Разберем по шагам, как правильно удалить кавычки:
// Способ 1: Использование четырех кавычек подряд для обозначения одного символа кавычки
НаимБезКавычек = СтрЗаменить(СтрокаИзФайла, """", "");
// Способ 2: Более читаемый вариант с использованием функции Символ
Кавычка = Символ(34); // ASCII код двойной кавычки
НаимБезКавычек = СтрЗаменить(СтрокаИзФайла, Кавычка, "");
Типичная ошибка: Часто программисты пишут СтрЗаменить(Строка, """", ""), но забывают присвоить результат обратно переменной. Помните, что СтрЗаменить — это функция, которая возвращает новую строку, а не изменяет существующую "на месте".
Важно проанализировать ситуацию, с которой сталкиваются почти все новички: в окне "Вычислить выражение" или в списке переменных отладчика строковые значения всегда отображаются в кавычках. Например, если переменная содержит текст Привет, отладчик покажет "Привет".
Это визуальное представление среды разработки, самих кавычек внутри строки нет. Чтобы проверить, есть ли "реальные" кавычки в данных, посмотрите на длину строки (функция СтрДлина()) или нажмите F2 на переменной в отладчике, чтобы открыть детальный просмотр. Если вы видите конструкцию вида ""Текст"" (двойные кавычки), значит, в самих данных действительно присутствуют лишние символы.
Проанализируем еще одну причину, по которой строки могут казаться "не пустыми" или не проходить сравнение. Поля в DBF часто имеют фиксированную длину. Если поле определено как 50 символов, а в нем записано слово "Товар", то при загрузке в 1С вы получите строку "Товар" и 45 пробелов после нее.
Для корректной работы всегда используйте функцию СокрЛП() (Сократить Левые и Правые пробелы) сразу при чтении данных из объекта XBase:
// Правильное чтение данных из DBF
Пока xBase.Следующая() Цикл
НоваяСтрока = ТабЗнач.Добавить();
// Убираем лишние пробелы сразу при загрузке
НоваяСтрока.ТоварКод = СокрЛП(xBase.ID);
НоваяСтрока.ТоварНаим = СокрЛП(xBase.NAME);
КонецЦикла;
Если таблица значений содержит десятки тысяч строк, удаление в цикле может занять значительное время. В таких случаях мы рекомендуем использовать временные таблицы в запросе. Посмотрим на этот алгоритм:
ГДЕ прописываем условия исключения пустых строк (например, НЕ Номенклатура ЕСТЬ NULL И Наименование <> "").Этот метод работает на порядок быстрее за счет оптимизации операций с данными на уровне ядра платформы.
Подводя итог, можно сказать: для качественной очистки данных при импорте всегда сочетайте удаление пустых строк (через НайтиСтроки или обратный цикл) с предварительной обработкой строк функциями СокрЛП и СтрЗаменить. Это обеспечит корректное сравнение данных и стабильную работу ваших алгоритмов.