При обмене данными между 1С и внешними системами (например, WMS-системами, использующими SQL-запросы или XML-файлы) часто возникает проблема некорректной обработки спецсимволов в наименованиях товаров. Символы типа &, <, >, @ или различные виды кавычек могут приводить к сбоям при записи в базу данных или нарушению структуры передаваемых файлов. Рассмотрим, как эффективно решить эту задачу средствами 1С.
Этот способ является наиболее лаконичным и рекомендуемым, так как не требует использования внешних COM-объектов. Суть метода заключается в разделении строки на массив по списку запрещенных символов с последующим слиянием частей обратно в одну строку без них.
Давайте разберем по шагам реализацию этого подхода:
СтрРазделить для разбиения исходной строки.СтрСоединить для сборки результата.Посмотрим на пример кода:
// Определяем строку, которую нужно очистить
ИсходнаяСтрока = Выборка.Наименование;
// Список всех символов, которые нужно удалить
Разделители = "&<>`“‘|%/\@()";
// Разбиваем строку по каждому из символов и соединяем обратно без них
Результат = СтрСоединить(СтрРазделить(ИсходнаяСтрока, Разделители), "");
Важное примечание: Если вы столкнулись с ситуацией, когда символы не удаляются, проверьте, не являются ли они невидимыми спецсимволами Unicode. Иногда визуально похожие кавычки имеют разные коды в таблице символов. В таких случаях рекомендуем использовать функцию КодСимвола() для идентификации реального содержимого строки.
Если задача требует более сложных манипуляций (например, замена группы символов на один конкретный или поиск по шаблону), отлично подойдет использование VBScript.RegExp. Этот подход позволяет гибко настраивать правила фильтрации.
Разберем пример реализации через COMОбъект:
// Создаем объект для работы с регулярными выражениями
RegExp = Новый COMОбъект("VBScript.RegExp");
// Указываем шаблон для поиска
RegExp.Pattern = "[&<>|%/\@()]";
// Устанавливаем флаг Global для поиска всех вхождений, а не только первого
RegExp.Global = Истина;
// Выполняем замену на пустую строку
Результат = RegExp.Replace(ИсходнаяСтрока, "");
Этот метод удобен тем, что позволяет одной командой Replace обрабатывать множество правил поиска, заданных в параметре Pattern.
Проанализируем ситуацию, когда данные передаются в WMS напрямую запросом к SQL. Чтобы не нагружать систему вычислениями при каждой выгрузке, рекомендуем следовать лучшим практикам:
Номенклатура дополнительный реквизит, например, НаименованиеДляВыгрузки. Заполняйте его в процедуре ПередЗаписью() в модуле объекта. Таким образом, при выгрузке вы будете просто считывать уже готовое, очищенное значение.Выбирая между СтрРазделить и регулярными выражениями, ориентируйтесь на производительность. Для большинства повседневных задач достаточно штатных функций платформы, так как они работают быстрее и не требуют обращения к COM-технологиям.