Как правильно добавлять и искать наименования с двойными кавычками в 1С?

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

При разработке на платформе «1С:Предприятие» программисты часто сталкиваются с необходимостью обработки строк, которые уже содержат в себе служебные символы. Один из самых коварных символов — это двойная кавычка. Поскольку в языке 1С кавычки используются для обозначения начала и конца строкового литерала, включение этого же символа внутрь самой строки требует особого подхода. Если не соблюдать правила синтаксиса, система выдаст ошибку еще на этапе компиляции кода.

В этой статье мы подробно разберем, как правильно формировать строки с кавычками, как добавлять их в СписокЗначений и как эффективно организовать поиск по таким наименованиям в справочниках и запросах.

Способ 1. Метод удвоения кавычек (Классический подход)

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

Рассмотрим конкретный пример. Предположим, нам нужно записать в переменную название подразделения: Подразделение "Номер первое". Проанализируем, как это будет выглядеть в коде:


// Неправильно (вызовет ошибку синтаксиса):
// ИмяПодразделения = "Подразделение "Номер первое""; 

// Правильно (с использованием удвоения):
ИмяПодразделения = "Подразделение ""Номер первое""";

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


СписокПодразделений = Новый СписокЗначений;
// Добавляем значение правильно
СписокПодразделений.Добавить("Подразделение ""Номер первое""");

Способ 2. Использование функции Символ()

Иногда код становится трудночитаемым из-за обилия кавычек (так называемый «забор» из символов). В таких ситуациях мы рекомендуем использовать функцию Символ(). Код ASCII для двойной кавычки — 34. Этот метод позволяет визуально отделить текст от спецсимволов.

Проанализируем ситуацию, когда такой подход удобнее:


Кавычка = Символ(34);
НаименованиеДляПоиска = "Подразделение " + Кавычка + "Номер первое" + Кавычка;
СписокПодразделений.Добавить(НаименованиеДляПоиска);

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

Способ 3. Использование функции СтрШаблон

Начиная с версии платформы 8.3.6, разработчикам доступна функция СтрШаблон. Она позволяет вставлять значения в текст по маске. Однако важно помнить: правила экранирования внутри самого шаблона остаются прежними.


// Используем шаблон для формирования строки
ТекстШаблона = "Объект: ""%1""";
Результат = СтрШаблон(ТекстШаблона, "Номер первое");
// В итоге получим: Объект: "Номер первое"

Проблема «умных» или типографских кавычек

Выясним важную причину, по которой поиск может не находить существующие элементы, даже если код написан правильно. Пользователи часто копируют данные из Microsoft Word, Excel или браузеров. В этих программах обычные кавычки автоматически заменяются на «елочки» (« ») или «лапки» („ “).

Для платформы 1С символ с кодом 34 и типографская кавычка — это абсолютно разные символы. Перед тем как выполнять поиск или добавлять данные в список, мы рекомендуем проводить нормализацию строки. Рассмотрим пример функции, которая подготавливает строку к поиску:


Функция НормализоватьСтрокуДляПоиска(ВходнаяСтрока)
    Результат = ВходнаяСтрока;
    Результат = СтрЗаменить(Результат, "«", """");
    Результат = СтрЗаменить(Результат, "»", """");
    Результат = СтрЗаменить(Результат, "„", """");
    Результат = СтрЗаменить(Результат, "“", """");
    Возврат Результат;
КонецФункции

Особенности поиска в запросах

Если вы планируете искать наименования через механизм запросов, используя оператор В или ПОДОБНО, следует учитывать нюансы платформы. При передаче СпискаЗначений в качестве параметра запроса, 1С самостоятельно обрабатывает внутреннее содержимое строк. Вам достаточно правильно сформировать список в коде на встроенном языке (как мы разобрали выше).

Однако, если вы пишете текст запроса вручную в консоли запросов или внутри конфигуратора и хотите жестко задать строку, кавычки в тексте запроса также должны удваиваться:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Подразделения.Ссылка
    |ИЗ
    |	Справочник.Подразделения КАК Подразделения
    |ГДЕ
    |	Подразделения.Наименование = ""Подразделение """"Номер первое""""""";

Если же вы используете поиск по подстроке с оператором ПОДОБНО, помните, что кавычка не является спецсимволом для этого оператора (в отличие от % или _), поэтому её не нужно экранировать через ключевое слово СПЕЦСИМВОЛ, только обычное удвоение.

Новые возможности: Регулярные выражения (8.3.24+)

В современных версиях платформы (8.3.24 и выше) появилась встроенная поддержка регулярных выражений. Это позволяет игнорировать кавычки при поиске или искать их более гибко. Например, можно найти все подразделения, где в названии есть слово "первое", независимо от того, в кавычках оно или нет, используя объект РезультатПоискаПоРегулярномуВыражению.

Подведем итог: работа с кавычками требует внимательности к деталям. Основное правило — удваивайте кавычки внутри строк. Для сложных конструкций используйте Символ(34), а для корректного поиска всегда проверяйте входящие данные на наличие типографских символов. Использование этих подходов сделает ваш код надежным и устойчивым к ошибкам ввода пользователей.

← На главную