Как найти и исправить русские буквы в артикулах номенклатуры

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

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

В этой статье мы подробно разберем, как обнаружить такие ошибки в уже существующих данных и как предотвратить их появление в будущем. Мы проанализируем различные подходы — от простых запросов до сложных функций очистки текста.

Почему возникают ошибки при поиске

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

  1. Русская «А» имеет код 1040.
  2. Латинская «A» имеет код 65.

Для человека разницы нет, но для функции поиска 1С это совершенно разные строки. Кроме того, из Excel часто копируются невидимые символы, такие как неразрывный пробел (код 160), который визуально не отличим от обычного пробела, но мешает поиску.

Способ 1. Поиск «испорченных» артикулов через запрос

Если база данных уже содержит тысячи позиций, первым шагом будет выявление тех записей, где в артикуле присутствует кириллица (если ваш стандарт подразумевает использование только латиницы и цифр). Рассмотрим, как это можно сделать с помощью механизма запросов.

Хотя стандартный язык запросов 1С не поддерживает полноценные регулярные выражения, мы можем использовать оператор ПОДОБНО. Проанализируем пример условия:


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Артикул
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Артикул ПОДОБНО "%[А-Яа-я]%"

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

Способ 2. Автоматическая замена русских букв на латинские

Когда «проблемные» записи найдены, их нужно нормализовать. Рассмотрим эффективную функцию для транслитерации или замены символов-двойников. Мы подготовили алгоритм, который перебирает строку посимвольно и заменяет кириллические омографы на их латинские эквиваленты.

Разберем пример реализации такой функции:


Функция ИсправитьАртикул(Знач ТекущийАртикул) Экспорт
    
    // Определяем соответствие русских и латинских символов
    СтрРус = "АВЕКМНОРСТУХаеорсух";
    СтрЛат = "ABEKMHOPCTYXaeopcyx";
    
    Результат = "";
    
    Для Позиция = 1 По СтрДлина(ТекущийАртикул) Цикл
        Символ = Сред(ТекущийАртикул, Позиция, 1);
        Индекс = Найти(СтрРус, Символ);
        
        Если Индекс > 0 Тогда
            // Если символ найден в списке русских, заменяем его на латинский по индексу
            Результат = Результат + Сред(СтрЛат, Индекс, 1);
        Иначе
            // Если символ не требует замены, оставляем как есть
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции

В этом примере мы создали две строки: СтрРус с кириллическими символами, которые чаще всего путают, и СтрЛат с соответствующими им латинскими буквами. Функция последовательно проверяет каждый знак артикула и, если находит совпадение, производит замену. Это гарантирует, что артикул станет «чистым».

Способ 3. Использование регулярных выражений (RegExp)

Для более продвинутой работы, особенно если вы используете платформу 1С версии 8.3.24 и выше, можно применять встроенные регулярные выражения. Если же версия более ранняя, воспользуемся объектом VBScript.RegExp. Посмотрим, как проверить наличие русских букв одной строкой кода:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.Pattern = "[А-Яа-яёЁ]"; // Ищем любую кириллицу

Если RegExp.Test(АртикулДляПроверки) Тогда
    Сообщить("В артикуле обнаружены русские буквы!");
КонецЕсли;

Этот метод работает значительно быстрее, чем перебор строки циклом, особенно при обработке больших массивов данных.

Способ 4. Очистка от невидимых символов Excel

Как мы уже упоминали, копирование из Excel часто приносит «мусорные» символы. Одним из самых коварных является символ с кодом 160 (неразрывный пробел). Обычная функция СокрЛП его игнорирует. Рассмотрим, как очистить строку от таких вкраплений:


Функция ОчиститьСтрокуОтМусора(Знач ВходнаяСтрока)
    
    // Заменяем неразрывный пробел (код 160) на обычный
    Результат = СтрЗаменить(ВходнаяСтрока, Символ(160), " ");
    
    // Удаляем все лишние пробелы по краям
    Результат = СокрЛП(Результат);
    
    // Можно также удалить символы табуляции (код 9)
    Результат = СтрЗаменить(Результат, Символ(9), "");
    
    Возврат Результат;
    
КонецФункции

Используя комбинацию этой функции с функцией замены букв, мы получим максимально надежный результат обработки входных данных.

Способ 5. Превентивные меры: Проверка при записи

Чтобы проблема не повторялась, лучше всего внедрить проверку непосредственно в момент создания или редактирования карточки номенклатуры. Проанализируем, как это реализовать в модуле объекта справочника Номенклатура.

Рекомендуется использовать процедуру ПередЗаписью. Мы можем либо автоматически исправлять артикул, либо выдавать предупреждение пользователю:


Процедура ПередЗаписью(Отказ)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Автоматически нормализуем артикул перед сохранением
    НовыйАртикул = ИсправитьАртикул(Артикул);
    
    Если Артикул <> НовыйАртикул Тогда
        // Опционально: сообщаем пользователю об изменениях
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Артикул был автоматически исправлен (заменены русские буквы).");
        Артикул = НовыйАртикул;
    КонецЕсли;
    
КонецПроцедуры

Такой подход гарантирует «чистоту» базы данных «на лету», не позволяя пользователям сохранять некорректные данные.

Визуальное выделение ошибок в списке

Если вы не хотите принудительно менять данные, можно подсвечивать подозрительные артикулы в форме списка номенклатуры. Для этого используем Условное оформление динамического списка:

  1. Откройте форму списка номенклатуры.
  2. Перейдите на закладку «Условное оформление».
  3. Добавьте новое правило: установите цвет текста — красный.
  4. В условии укажите: Артикул ПОДОБНО "%[А-Я]%".

Теперь менеджеры будут сразу видеть карточки, требующие внимания, так как их артикул будет выделен ярким цветом.

Заключение

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

← На главную