Разработка и Конфигурация · 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). Это полезно, когда поиск ведётся сразу по нескольким служебным символам, например при очистке текста, скопированного из внешних источников.
Кавычка = Символ(34);
// или литералом:
Кавычка = """";
// оба варианта дают один и тот же символКак найти кавычку в строке: СтрНайти и Найти
Основной инструмент поиска подстроки в современных версиях платформы — функция СтрНайти(Строка, ПодстрокаПоиска). Она возвращает позицию первого вхождения подстроки (нумерация с единицы) или 0, если вхождение не найдено. Для поиска кавычки вызов выглядит так: Позиция = СтрНайти(Текст, """"); или Позиция = СтрНайти(Текст, Символ(34));.
У СтрНайти есть необязательные параметры: направление поиска (с начала или с конца строки), начальная позиция и номер вхождения. Это позволяет найти не первую, а, например, вторую кавычку — что нужно при разборе строк вида поле = "значение", где важны позиции открывающей и закрывающей кавычек. Устаревшая функция Найти() работает аналогично, но поддерживает только поиск с начала строки и встречается в старом коде.
Практический пример — проверка, содержит ли наименование кавычки, перед выгрузкой в файл: если СтрНайти(Наименование, Символ(34)) > 0, значение нужно дополнительно экранировать или обрамить по правилам формата. Такая проверка предотвращает порчу CSV- и XML-файлов, где кавычка является служебным символом.
- 1Определите, откуда берётся строка: реквизит объекта, текст файла, ввод пользователя
- 2Задайте символ поиска: литерал из четырёх кавычек или Символ(34)
- 3Вызовите СтрНайти(Строка, СимволПоиска) и сохраните результат в переменную
- 4Проверьте результат: значение больше 0 — кавычка найдена, позиция известна; 0 — кавычки нет
- 5При необходимости найдите следующие вхождения, указав начальную позицию и номер вхождения
Замена и удаление кавычек в данных
Часто найти кавычку — только половина задачи, дальше её нужно заменить или удалить. Для этого служит функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Удаление кавычек из строки: Результат = СтрЗаменить(Текст, Символ(34), ""); — все кавычки заменяются пустой строкой.
Типовой сценарий — экранирование кавычек при формировании строки, которая сама будет использоваться как литерал: Экранировано = СтрЗаменить(Значение, Символ(34), Символ(34) + Символ(34));. Каждая кавычка удваивается, и полученный текст можно безопасно вставлять внутрь строкового литерала, формируемого программно, например при генерации кода или текста запроса.
При замене учитывайте регламент данных: если кавычки являются частью официального наименования организации (кавычки-«ёлочки» или прямые), их удаление может сделать данные некорректными для печатных форм и отчётности. Перед массовой обработкой справочника сделайте резервную копию базы и сначала выполните замену на копии или на ограниченной выборке.
Как найти кавычку в коде конфигурации
Если искать нужно не в данных, а в исходном коде — например, все места, где формируются строки с кавычками, — используется глобальный поиск конфигуратора. Откройте конфигуратор, нажмите Ctrl+Shift+F (Правка — Глобальный поиск), введите искомый текст и укажите область поиска: вся конфигурация или выбранные объекты.
Нюанс в том, что искать приходится именно текстовое представление: чтобы найти в коде литерал из четырёх кавычек, в поле поиска вводятся те же четыре знака подряд — конфигуратор ищет по тексту модулей, а не по значениям. Полезно включить поиск по целому слову или с учётом регистра, если нужно сузить результаты.
Результаты глобального поиска отображаются списком с указанием объекта, модуля и строки. По двойному щелчку открывается нужное место модуля. Такой приём помогает при рефакторинге: например, найти все места, где кавычки заданы литералом, чтобы заменить их на Символ(34) для единообразия, или наоборот.
Кавычки в запросах и динамических списках
В языке запросов 1С строковые литералы также ограничиваются двойными кавычками, и правило удвоения действует аналогично: ГДЕ Наименование ПОДОБНО "%""%" найдёт записи, содержащие кавычку. Конструкция ПОДОБНО со спецсимволами требует аккуратности: процент и подчёркивание — служебные знаки шаблона, сама кавычка в шаблоне специальной обработки не требует, кроме удвоения как части литерала.
Если текст запроса собирается программно и в него подставляется значение с кавычками, надёжнее использовать параметры запроса: Запрос.УстановитьПараметр("Значение", СтрокаСКавычками);. Параметры передаются в запрос как значения, а не как текст, поэтому кавычки внутри них не ломают синтаксис. Это одновременно защита от ошибок и от подобия SQL-инъекций при подстановке пользовательского ввода.
Проверить корректность запроса с кавычками удобно в консоли запросов или через конструктор запроса в конфигураторе: если запрос выполняется и возвращает ожидаемые записи, литералы записаны правильно. Синтаксическая ошибка вида «Ошибка в тексте запроса» рядом с кавычкой почти всегда означает нечётное количество знаков.
Сравнение способов задать кавычку
Быстрее пишется, это константа времени компиляции; минус — плохо читается в сложных выражениях
Наглядно и удобно в конкатенациях; минус — чуть длиннее запись и вызов функции в момент выполнения
Единственный безопасный способ подставить произвольное значение с кавычками в запрос; требует изменения структуры кода
Частые ошибки и как их проверить
Самая распространённая ошибка — нечётное количество кавычек в литерале. Симптом: модуль не компилируется, конфигуратор указывает на строку с ошибкой. Лечение простое: посчитайте знаки — строка из одной кавычки это четыре знака, строка с парой кавычек внутри — шесть и так далее.
Вторая ошибка — путаница между прямыми кавычками и типографскими («ёлочки», «лапки»). В данных из Word, Excel или веб-страниц часто встречаются типографские кавычки с другими кодами символов. СтрНайти с Символ(34) их не найдёт, потому что это другие символы. Если поиск «не видит» кавычку, которая явно присутствует на экране, проверьте код символа через КодСимвола(Строка, Позиция).
Третья ошибка — поиск кавычки в строке, где её уже удалили или заменили ранее в цепочке обработок. Если СтрНайти возвращает 0, а по логике кавычка должна быть, выведите само значение в сообщение или журнал и посмотрите его фактическое содержимое — возможно, данные изменила предыдущая обработка или обмен.
Как проверить результат
Число больше 0, символ на этой позиции — кавычка
0 при явно видимой кавычке — вероятно, другой код символа
Конфигуратор не выдаёт синтаксических ошибок
Ошибка в строке с литералом — нечётное число кавычек
Запрос выполняется, записи с кавычками находятся
Ошибка текста запроса — значение подставлено строкой, а не параметром
FAQ
Как записать строку, состоящую из одной кавычки?
Литералом из четырёх знаков кавычек подряд: открывающая, две удвоенные (это и есть значение) и закрывающая. Альтернатива — выражение Символ(34), которое возвращает тот же символ и часто читается проще.
Почему СтрНайти не находит кавычку, хотя она видна на экране?
Скорее всего, в данных стоит типографская кавычка («ёлочка» или «лапки») — это другой символ с другим кодом. Определите фактический код через КодСимвола(Строка, Позиция) и ищите именно его через Символ(Код).
Чем СтрНайти отличается от Найти?
Найти() — устаревшая функция, ищет только с начала строки и только первое вхождение. СтрНайти() поддерживает направление поиска, начальную позицию и номер вхождения. В новом коде следует использовать СтрНайти.
Как удалить все кавычки из строки?
Используйте СтрЗаменить(Текст, Символ(34), "") — все вхождения кавычки заменятся пустой строкой. Перед массовой обработкой данных сделайте резервную копию базы и проверьте результат на нескольких элементах.
Как вставить значение с кавычками в запрос?
Через параметр: Запрос.УстановитьПараметр("Имя", Значение). Параметры передаются как значения, поэтому кавычки внутри не нарушают синтаксис запроса. Прямая подстановка в текст запроса опасна ошибками и уязвимостями.
Как найти кавычки в модулях всей конфигурации?
Откройте конфигуратор и нажмите Ctrl+Shift+F, введите нужные знаки кавычек в поле поиска и выберите область — всю конфигурацию или отдельные объекты. Поиск идёт по тексту модулей, поэтому удвоение кавычек в поле поиска не требуется.
Что важно запомнить
Кавычка в строковом литерале 1С задаётся удвоением или функцией Символ(34). Для поиска используйте СтрНайти, для замены — СтрЗаменить, в запросах подставляйте значения только через параметры. Проверяйте код символа, если поиск не находит видимую кавычку, и делайте резервную копию перед массовой обработкой данных.