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

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

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

Как найти кавычку в строке 1С: работа функции СтрНайти, экранирование двойных кавычек, поиск позиции и подсчёт вхождений с готовыми примерами кода.

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

Во встроенном языке 1С двойная кавычка внутри строки записывается как две кавычки подряд. Значит, строковый литерал, состоящий из одной кавычки, выглядит как четыре кавычки: """". Именно это значение передаётся в функции поиска СтрНайти, Найти (устаревшая), СтрЧислоВхождений и другие строковые функции.

Ниже разобраны рабочие примеры: поиск позиции кавычки, проверка её наличия, подсчёт количества, поиск парных кавычек и разбор типичных ошибок, из-за которых код ведёт себя неожиданно.

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

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

Примеры записи:

Кавычка = """";           // строка из одного символа "

Текст = "Он сказал ""привет"""; // строка: Он сказал "привет"

Четыре кавычки подряд читаются так: первая открывает литерал, вторая и третья — экранированная кавычка внутри строки, четвёртая закрывает литерал. Начинающие разработчики часто путаются именно здесь, поэтому полезно запомнить: количество кавычек в литерале всегда чётное, а две кавычки внутри дают одну в значении.

Поиск позиции кавычки через СтрНайти

Основной инструмент — функция СтрНайти(Строка, ПодстрокаПоиска). Она возвращает позицию первого вхождения подстроки (нумерация с 1) или 0, если вхождение не найдено.

Строка = "Номенклатура ""Кресло офисное"" в наличии";

Позиция = СтрНайти(Строка, """");

// Позиция = 14 — позиция первой кавычки

Если нужно найти кавычку не с начала, а после определённой позиции, используйте третий параметр — номер начального символа поиска:

Первая = СтрНайти(Строка, """");

Вторая = СтрНайти(Строка, """", Первая + 1);

Такой приём применяется, когда нужно выделить текст между парными кавычками — например, извлечь значение атрибута из простой XML- или CSV-подобной строки.

Проверка наличия и подсчёт количества кавычек

Если позиция не важна, а нужно только узнать, есть ли кавычка в строке, достаточно сравнить результат СтрНайти с нулём:

Если СтрНайти(Строка, """") > 0 Тогда

// кавычка присутствует

КонецЕсли;

Для подсчёта всех вхождений есть отдельная функция СтрЧислоВхождений:

Количество = СтрЧислоВхождений(Строка, """");

Это удобно для контроля корректности данных: например, если в поле ожидается пара кавычек, а СтрЧислоВхождений вернуло нечётное число — вероятно, данные повреждены или кавычки не сбалансированы.

Извлечение текста внутри кавычек

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

Строка = "Артикул: ""АБВ-123"", склад основной";

П1 = СтрНайти(Строка, """");

П2 = СтрНайти(Строка, """", П1 + 1);

Если П1 > 0 И П2 > П1 Тогда

Значение = Сред(Строка, П1 + 1, П2 - П1 - 1);

// Значение = АБВ-123

КонецЕсли;

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

Порядок действий
  1. 1
    Найдите позицию первой кавычки: СтрНайти(Строка, """")
  2. 2
    Найдите вторую кавычку, начав поиск со следующей позиции
  3. 3
    Проверьте, что обе позиции больше нуля и вторая больше первой
  4. 4
    Извлеките текст функцией Сред(Строка, П1 + 1, П2 - П1 - 1)
  5. 5
    Проверьте результат на тестовой строке с кавычками и без

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

Для удаления всех кавычек или замены их на другой символ используется СтрЗаменить:

БезКавычек = СтрЗаменить(Строка, """", "");          // удалить

СЗаменой = СтрЗаменить(Строка, """", "'"); // заменить на апостроф

Замена на апостроф часто применяется перед подстановкой текста в SQL-подобные запросы внешних источников или при выгрузке в форматы, где двойная кавычка — служебный символ. Учтите: в запросах 1С строковые литералы тоже ограничиваются двойными кавычками, поэтому правило удвоения действует и там.

Кавычки в запросах 1С и при конкатенации

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

Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка

|ГДЕ Номенклатура.Наименование ПОДОБНО ""%"" + &Часть + ""%""";

Для JSON и других структурированных форматов надёжнее не собирать строку вручную, а использовать ЗаписьJSON — платформа сама корректно расставит и экранирует кавычки. Это исключает целый класс ошибок.

Типичные ошибки
01
Поиск через СтрНайти(Строка, """) — одна кавычка в литерале не компилируется, нужно четыре
02
Отсутствие проверки, что вторая кавычка найдена, перед вызовом Сред — ошибка или пустой результат
03
Путаница между позицией и длиной при вычислении параметров функции Сред
04
Игнорирование нечётного количества кавычек в загружаемых данных — признак повреждённого файла
05
Ручная сборка JSON конкатенацией вместо ЗаписьJSON — лишние ошибки экранирования

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

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

Сообщить("Длина: " + СтрДлина(Строка) + ", П1=" + П1 + ", П2=" + П2);

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

Контрольные точки

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

Результат СтрНайти
Норма

Число больше 0 — кавычка найдена на указанной позиции

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

0 — кавычки нет или в тексте типографские кавычки «»

Количество вхождений
Норма

Чётное число при ожидании парных кавычек

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

Нечётное число — вероятно, данные повреждены

Извлечённая подстрока
Норма

Текст без кавычек по краям, совпадает с ожидаемым

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

Пустая строка или обрезанный текст — неверно рассчитаны позиции

FAQ

Почему код СтрНайти(Строка, """) не компилируется?

Три кавычки — синтаксически неверный литерал: первая открывает строку, вторая и третья воспринимаются как экранированная кавычка, но литерал остаётся незакрытым. Строка из одной кавычки записывается четырьмя символами: """".

Как найти одинарную кавычку (апостроф)?

Апостроф не является служебным символом в строковых литералах 1С, поэтому экранировать его не нужно: СтрНайти(Строка, "'").

Как найти типографские кавычки «ёлочки»?

Это отдельные символы Unicode, их нужно искать явно: СтрНайти(Строка, "«") и СтрНайти(Строка, "»"). Обычный поиск двойной кавычки их не находит, что часто становится причиной «непонятного» нулевого результата при обработке текстов из Word.

Чем СтрНайти отличается от устаревшей функции Найти?

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

Как найти последнюю кавычку в строке?

Используйте перебор вхождений в цикле, сохраняя каждую найденную позицию, либо параметры направления поиска СтрНайти с поиском с конца строки. Альтернатива — найти количество через СтрЧислоВхождений и затем получить позицию последнего вхождения соответствующим параметром.

Можно ли искать кавычку в запросе 1С?

Да, в языке запросов есть функция ПОДСТРОКА, но полноценного поиска позиции в запросе нет. Обычно строку обрабатывают после выборки в коде, либо фильтруют через ПОДОБНО с шаблоном, где кавычки также удваиваются.

Итог

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

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