При разработке на платформе «1С:Предприятие» программисты часто сталкиваются с необходимостью обработки строк, которые уже содержат в себе служебные символы. Один из самых коварных символов — это двойная кавычка. Поскольку в языке 1С кавычки используются для обозначения начала и конца строкового литерала, включение этого же символа внутрь самой строки требует особого подхода. Если не соблюдать правила синтаксиса, система выдаст ошибку еще на этапе компиляции кода.
В этой статье мы подробно разберем, как правильно формировать строки с кавычками, как добавлять их в СписокЗначений и как эффективно организовать поиск по таким наименованиям в справочниках и запросах.
Самый простой и стандартный способ, заложенный в синтаксис языка, — это удвоение внутренней кавычки. Когда парсер платформы встречает две идущие подряд двойные кавычки внутри строкового литерала, он воспринимает их не как окончание строки, а как один символ кавычки, который должен стать частью текста.
Рассмотрим конкретный пример. Предположим, нам нужно записать в переменную название подразделения: Подразделение "Номер первое". Проанализируем, как это будет выглядеть в коде:
// Неправильно (вызовет ошибку синтаксиса):
// ИмяПодразделения = "Подразделение "Номер первое"";
// Правильно (с использованием удвоения):
ИмяПодразделения = "Подразделение ""Номер первое""";
Обратите внимание на правую часть: в конце строки стоят три кавычки подряд. Это не ошибка. Первая и вторая кавычки превращаются в одну «текстовую» кавычку, а третья закрывает всю строковую конструкцию. Разберем еще один пример, когда нам нужно добавить это значение в СписокЗначений для последующего поиска:
СписокПодразделений = Новый СписокЗначений;
// Добавляем значение правильно
СписокПодразделений.Добавить("Подразделение ""Номер первое""");
Иногда код становится трудночитаемым из-за обилия кавычек (так называемый «забор» из символов). В таких ситуациях мы рекомендуем использовать функцию Символ(). Код ASCII для двойной кавычки — 34. Этот метод позволяет визуально отделить текст от спецсимволов.
Проанализируем ситуацию, когда такой подход удобнее:
Кавычка = Символ(34);
НаименованиеДляПоиска = "Подразделение " + Кавычка + "Номер первое" + Кавычка;
СписокПодразделений.Добавить(НаименованиеДляПоиска);
Этот способ особенно полезен при динамическом формировании сложных строк, где кавычки зависят от условий или значений переменных. Код становится прозрачнее, и вероятность допустить ошибку в количестве кавычек снижается.
Начиная с версии платформы 8.3.6, разработчикам доступна функция СтрШаблон. Она позволяет вставлять значения в текст по маске. Однако важно помнить: правила экранирования внутри самого шаблона остаются прежними.
// Используем шаблон для формирования строки
ТекстШаблона = "Объект: ""%1""";
Результат = СтрШаблон(ТекстШаблона, "Номер первое");
// В итоге получим: Объект: "Номер первое"
Выясним важную причину, по которой поиск может не находить существующие элементы, даже если код написан правильно. Пользователи часто копируют данные из Microsoft Word, Excel или браузеров. В этих программах обычные кавычки автоматически заменяются на «елочки» (« ») или «лапки» („ “).
Для платформы 1С символ с кодом 34 и типографская кавычка — это абсолютно разные символы. Перед тем как выполнять поиск или добавлять данные в список, мы рекомендуем проводить нормализацию строки. Рассмотрим пример функции, которая подготавливает строку к поиску:
Функция НормализоватьСтрокуДляПоиска(ВходнаяСтрока)
Результат = ВходнаяСтрока;
Результат = СтрЗаменить(Результат, "«", """");
Результат = СтрЗаменить(Результат, "»", """");
Результат = СтрЗаменить(Результат, "„", """");
Результат = СтрЗаменить(Результат, "“", """");
Возврат Результат;
КонецФункции
Если вы планируете искать наименования через механизм запросов, используя оператор В или ПОДОБНО, следует учитывать нюансы платформы. При передаче СпискаЗначений в качестве параметра запроса, 1С самостоятельно обрабатывает внутреннее содержимое строк. Вам достаточно правильно сформировать список в коде на встроенном языке (как мы разобрали выше).
Однако, если вы пишете текст запроса вручную в консоли запросов или внутри конфигуратора и хотите жестко задать строку, кавычки в тексте запроса также должны удваиваться:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Подразделения.Ссылка
|ИЗ
| Справочник.Подразделения КАК Подразделения
|ГДЕ
| Подразделения.Наименование = ""Подразделение """"Номер первое""""""";
Если же вы используете поиск по подстроке с оператором ПОДОБНО, помните, что кавычка не является спецсимволом для этого оператора (в отличие от % или _), поэтому её не нужно экранировать через ключевое слово СПЕЦСИМВОЛ, только обычное удвоение.
В современных версиях платформы (8.3.24 и выше) появилась встроенная поддержка регулярных выражений. Это позволяет игнорировать кавычки при поиске или искать их более гибко. Например, можно найти все подразделения, где в названии есть слово "первое", независимо от того, в кавычках оно или нет, используя объект РезультатПоискаПоРегулярномуВыражению.
Подведем итог: работа с кавычками требует внимательности к деталям. Основное правило — удваивайте кавычки внутри строк. Для сложных конструкций используйте Символ(34), а для корректного поиска всегда проверяйте входящие данные на наличие типографских символов. Использование этих подходов сделает ваш код надежным и устойчивым к ошибкам ввода пользователей.