Почему 1С не находит значение в таблице значений при поиске по строке?

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

Часто при разработке механизмов загрузки данных из внешних файлов, таких как Microsoft Excel, программисты сталкиваются с ситуацией «мистики»: вы видите в отладчике, что значение в переменной совпадает с колонкой в ТаблицаЗначений, но функция Найти() упорно возвращает Неопределено или Ложь. Давайте вместе разберемся, почему это происходит и как победить эту проблему раз и навсегда.

Анализ ситуации: где скрывается ошибка

Когда вы передаете строку в метод Найти(), платформа 1С выполняет строгое сравнение значений. Если в строке, которую вы читаете из внешнего источника, присутствуют невидимые спецсимволы, для 1С эта строка становится совершенно другим объектом. Стандартная функция СокрЛП(), на которую все привыкли полагаться, удаляет лишь «незначащие» символы: обычные пробелы, табуляции и переносы строк. Однако, при работе с COM-объектами Excel, в данные могут попадать более экзотические символы, например, «пробел нулевой ширины» (код Unicode 8203).

Шаг 1: Диагностика скрытых символов

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


Для Сч = 1 по СтрДлина(ВашаПеременная) Цикл
    Код = КодСимвола(Сред(ВашаПеременная, Сч, 1));
    Сообщить("Символ №" + Сч + " имеет код: " + Код);
КонецЦикла;

Если в выводе сообщений вы увидите число 8203 или другие неожиданные коды, значит, источник данных «загрязняет» строку при передаче.

Шаг 2: Правильные способы борьбы с «мусором»

Когда мы выяснили, что именно мешает поиску, у нас есть несколько вариантов действий:

  1. Использование СтрЗаменить(): Если вы точно знаете код «вредного» символа, можно принудительно очистить строку перед поиском.
  2. Отказ от свойства .Text: При работе с объектом Excel старайтесь использовать свойство .Value вместо .Text. Свойство .Text возвращает строку в том виде, в котором она отображается на экране с учетом форматирования ячейки, что часто приводит к добавлению скрытых символов. .Value вернет «чистое» значение из памяти Excel.
  3. Проверка через регулярные выражения: Если формат данных может меняться, можно использовать объект VBScript.RegExp для очистки строки от любых символов, кроме цифровых.

Шаг 3: Радикальное решение — отказ от COM-объекта Excel

Самый эффективный способ избежать подобных проблем — вообще перестать использовать COM-объект Excel.Application. Этот подход имеет множество минусов: он медленный, требует установленного MS Office на сервере и часто приводит к «зависанию» процессов Excel.exe в диспетчере задач.

Вместо этого мы рекомендуем использовать встроенный в платформу 1С объект ТабличныйДокумент. Метод Прочитать() позволяет загружать файлы форматов .xls и .xlsx напрямую, без необходимости запускать стороннее приложение.

Рассмотрим, как это выглядит на практике:


ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("ПутьКФайлу.xlsx");
Для НомерСтроки = 4 По ТабДок.ВысотаТаблицы Цикл
    ЗначениеПоиска = СокрЛП(ТабДок.Область(НомерСтроки, 8).Текст);
    // Теперь поиск будет работать корректно, так как 1С сама обрабатывает типы данных
    НайденаяСтрока = ЭСФы.Найти(ЗначениеПоиска, "НомерЭСФ");
    // Обработка результата...
КонецЦикла;

Этот метод не только решает проблему с невидимыми символами, но и значительно ускоряет выполнение обработки, так как данные считываются в оперативную память 1С один раз, а не запрашиваются у внешнего приложения при каждом проходе цикла.

Рекомендации на будущее

Чтобы работа с внешними данными всегда была стабильной, придерживайтесь следующих принципов:

Помните, что лучший способ избежать проблем с чтением файлов — это минимизировать использование Excel как промежуточного звена. Старайтесь импортировать данные в ТаблицаЗначений сразу после получения, проводите все необходимые очистки и преобразования типов, и только после этого выполняйте логические операции поиска и сравнения.

← На главную