К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как найти кавычку в 1С: способы для строки, кода и данных

Как найти кавычку в 1С: удвоение кавычек в строковых литералах, Символ(34), функции СтрНайти и Найти, поиск в конфигураторе и типичные ошибки разработчика.

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

Задача встречается в нескольких сценариях. Первый — поиск кавычек в тексте, который пришёл из файла, формы или базы данных: например, при разборе CSV, где поля обрамлены кавычками, или при проверке наименований контрагентов. Второй — формирование строк, содержащих кавычки: XML, JSON, SQL-подобные запросы, тексты сообщений. Третий — поиск кавычек в исходном коде конфигурации через конфигуратор. Каждый сценарий решается своим инструментом.

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

Как задать кавычку в строковом литерале 1С

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

Пример: литерал "Наименование с ""кавычками"" внутри" даст строку Наименование с "кавычками" внутри. Соответственно, строка, состоящая из одной кавычки, записывается как четыре знака подряд: "'''" — открывающая кавычка, две удвоенные (значение) и закрывающая. Именно такой литерал чаще всего передают в функции поиска.

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

Альтернатива: функция Символ(34)

Второй способ задать кавычку — функция Символ(34), где 34 — код двойной кавычки в таблице Unicode. Такой вариант часто читается легче, чем четыре кавычки подряд, особенно в сложных выражениях, где литералы и так перегружены знаками. Результат идентичен: функция возвращает строку из одного символа кавычки.

Символ(34) удобно комбинировать с конкатенацией при сборке текстов запросов, XML или сообщений: Текст = "Поле = " + Символ(34) + Значение + Символ(34);. При этом На практике разница в производительности несущественна, выбор определяется читаемостью кода.

Через Символ() можно задавать и другие трудновводимые знаки: одинарную кавычку (код 39), неразрывный пробел (160), табуляцию (9), перевод строки (10) и возврат каретки (13). Это полезно, когда поиск ведётся сразу по нескольким служебным символам, например при очистке текста, скопированного из внешних источников.

bsl
Кавычка = Символ(34);
// или литералом:
Кавычка = """";
// оба варианта дают один и тот же символ

Как найти кавычку в строке: СтрНайти и Найти

Основной инструмент поиска подстроки в современных версиях платформы — функция СтрНайти(Строка, ПодстрокаПоиска). Она возвращает позицию первого вхождения подстроки (нумерация с единицы) или 0, если вхождение не найдено. Для поиска кавычки вызов выглядит так: Позиция = СтрНайти(Текст, """"); или Позиция = СтрНайти(Текст, Символ(34));.

У СтрНайти есть необязательные параметры: направление поиска (с начала или с конца строки), начальная позиция и номер вхождения. Это позволяет найти не первую, а, например, вторую кавычку — что нужно при разборе строк вида поле = "значение", где важны позиции открывающей и закрывающей кавычек. Устаревшая функция Найти() работает аналогично, но поддерживает только поиск с начала строки и встречается в старом коде.

Практический пример — проверка, содержит ли наименование кавычки, перед выгрузкой в файл: если СтрНайти(Наименование, Символ(34)) > 0, значение нужно дополнительно экранировать или обрамить по правилам формата. Такая проверка предотвращает порчу CSV- и XML-файлов, где кавычка является служебным символом.

Порядок действий при поиске кавычки в строке
  1. 1
    Определите, откуда берётся строка: реквизит объекта, текст файла, ввод пользователя
  2. 2
    Задайте символ поиска: литерал из четырёх кавычек или Символ(34)
  3. 3
    Вызовите СтрНайти(Строка, СимволПоиска) и сохраните результат в переменную
  4. 4
    Проверьте результат: значение больше 0 — кавычка найдена, позиция известна; 0 — кавычки нет
  5. 5
    При необходимости найдите следующие вхождения, указав начальную позицию и номер вхождения

Замена и удаление кавычек в данных

Часто найти кавычку — только половина задачи, дальше её нужно заменить или удалить. Для этого служит функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Удаление кавычек из строки: Результат = СтрЗаменить(Текст, Символ(34), ""); — все кавычки заменяются пустой строкой.

Типовой сценарий — экранирование кавычек при формировании строки, которая сама будет использоваться как литерал: Экранировано = СтрЗаменить(Значение, Символ(34), Символ(34) + Символ(34));. Каждая кавычка удваивается, и полученный текст можно безопасно вставлять внутрь строкового литерала, формируемого программно, например при генерации кода или текста запроса.

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

Как найти кавычку в коде конфигурации

Если искать нужно не в данных, а в исходном коде — например, все места, где формируются строки с кавычками, — используется глобальный поиск конфигуратора. Откройте конфигуратор, нажмите Ctrl+Shift+F (Правка — Глобальный поиск), введите искомый текст и укажите область поиска: вся конфигурация или выбранные объекты.

Нюанс в том, что искать приходится именно текстовое представление: чтобы найти в коде литерал из четырёх кавычек, в поле поиска вводятся те же четыре знака подряд — конфигуратор ищет по тексту модулей, а не по значениям. Полезно включить поиск по целому слову или с учётом регистра, если нужно сузить результаты.

Результаты глобального поиска отображаются списком с указанием объекта, модуля и строки. По двойному щелчку открывается нужное место модуля. Такой приём помогает при рефакторинге: например, найти все места, где кавычки заданы литералом, чтобы заменить их на Символ(34) для единообразия, или наоборот.

Кавычки в запросах и динамических списках

В языке запросов 1С строковые литералы также ограничиваются двойными кавычками, и правило удвоения действует аналогично: ГДЕ Наименование ПОДОБНО "%""%" найдёт записи, содержащие кавычку. Конструкция ПОДОБНО со спецсимволами требует аккуратности: процент и подчёркивание — служебные знаки шаблона, сама кавычка в шаблоне специальной обработки не требует, кроме удвоения как части литерала.

Если текст запроса собирается программно и в него подставляется значение с кавычками, надёжнее использовать параметры запроса: Запрос.УстановитьПараметр("Значение", СтрокаСКавычками);. Параметры передаются в запрос как значения, а не как текст, поэтому кавычки внутри них не ломают синтаксис. Это одновременно защита от ошибок и от подобия SQL-инъекций при подстановке пользовательского ввода.

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

Сравнение способов задать кавычку

Удвоенные кавычки в литерале

Быстрее пишется, это константа времени компиляции; минус — плохо читается в сложных выражениях

Символ(34)

Наглядно и удобно в конкатенациях; минус — чуть длиннее запись и вызов функции в момент выполнения

Параметр запроса

Единственный безопасный способ подставить произвольное значение с кавычками в запрос; требует изменения структуры кода

Частые ошибки и как их проверить

Самая распространённая ошибка — нечётное количество кавычек в литерале. Симптом: модуль не компилируется, конфигуратор указывает на строку с ошибкой. Лечение простое: посчитайте знаки — строка из одной кавычки это четыре знака, строка с парой кавычек внутри — шесть и так далее.

Вторая ошибка — путаница между прямыми кавычками и типографскими («ёлочки», «лапки»). В данных из Word, Excel или веб-страниц часто встречаются типографские кавычки с другими кодами символов. СтрНайти с Символ(34) их не найдёт, потому что это другие символы. Если поиск «не видит» кавычку, которая явно присутствует на экране, проверьте код символа через КодСимвола(Строка, Позиция).

Третья ошибка — поиск кавычки в строке, где её уже удалили или заменили ранее в цепочке обработок. Если СтрНайти возвращает 0, а по логике кавычка должна быть, выведите само значение в сообщение или журнал и посмотрите его фактическое содержимое — возможно, данные изменила предыдущая обработка или обмен.

Типичные ошибки
01
Нечётное число кавычек в литерале — модуль не компилируется, пересчитайте знаки
02
Поиск прямой кавычки там, где стоят типографские — проверьте код символа через КодСимвола()
03
Подстановка значения с кавычками прямо в текст запроса — используйте параметры запроса
04
Массовая замена кавычек без резервной копии — риск необратимой порчи наименований
Контрольные точки

Как проверить результат

СтрНайти вернула позицию
Норма

Число больше 0, символ на этой позиции — кавычка

Тревожный признак

0 при явно видимой кавычке — вероятно, другой код символа

Модуль компилируется
Норма

Конфигуратор не выдаёт синтаксических ошибок

Тревожный признак

Ошибка в строке с литералом — нечётное число кавычек

Запрос с параметром
Норма

Запрос выполняется, записи с кавычками находятся

Тревожный признак

Ошибка текста запроса — значение подставлено строкой, а не параметром

FAQ

Как записать строку, состоящую из одной кавычки?

Литералом из четырёх знаков кавычек подряд: открывающая, две удвоенные (это и есть значение) и закрывающая. Альтернатива — выражение Символ(34), которое возвращает тот же символ и часто читается проще.

Почему СтрНайти не находит кавычку, хотя она видна на экране?

Скорее всего, в данных стоит типографская кавычка («ёлочка» или «лапки») — это другой символ с другим кодом. Определите фактический код через КодСимвола(Строка, Позиция) и ищите именно его через Символ(Код).

Чем СтрНайти отличается от Найти?

Найти() — устаревшая функция, ищет только с начала строки и только первое вхождение. СтрНайти() поддерживает направление поиска, начальную позицию и номер вхождения. В новом коде следует использовать СтрНайти.

Как удалить все кавычки из строки?

Используйте СтрЗаменить(Текст, Символ(34), "") — все вхождения кавычки заменятся пустой строкой. Перед массовой обработкой данных сделайте резервную копию базы и проверьте результат на нескольких элементах.

Как вставить значение с кавычками в запрос?

Через параметр: Запрос.УстановитьПараметр("Имя", Значение). Параметры передаются как значения, поэтому кавычки внутри не нарушают синтаксис запроса. Прямая подстановка в текст запроса опасна ошибками и уязвимостями.

Как найти кавычки в модулях всей конфигурации?

Откройте конфигуратор и нажмите Ctrl+Shift+F, введите нужные знаки кавычек в поле поиска и выберите область — всю конфигурацию или отдельные объекты. Поиск идёт по тексту модулей, поэтому удвоение кавычек в поле поиска не требуется.

Итог

Что важно запомнить

Кавычка в строковом литерале 1С задаётся удвоением или функцией Символ(34). Для поиска используйте СтрНайти, для замены — СтрЗаменить, в запросах подставляйте значения только через параметры. Проверяйте код символа, если поиск не находит видимую кавычку, и делайте резервную копию перед массовой обработкой данных.