Двойные, одинарные и «ёлочки»: где и чем искать кавычки в базе и в коде 1С
Содержание
Найти кавычку в 1С проще всего расширенным поиском списка: Alt+F → поле, например «Наименование» → режим «по части строки» → в строку поиска ввести сам символ " или «. В коде модуля — Ctrl+F в Конфигураторе, а в тексте программы кавычку внутри строки ищут как удвоенную: "".
Частая ошибка — набрать кавычку в обычное поле поиска над списком и решить, что «1С не ищет символы». Это поле работает как полнотекстовый поиск, а там двойная кавычка — служебный знак: ею обрамляют точную фразу. Символ просто съедается. Вторая ловушка — визуально одинаковые, но разные символы: прямая ", «ёлочки» и «лапки» „“ из Word. Ищете одну — находите не всё.
Поиск кавычки в списках и полях режима Предприятия
В пользовательском режиме (интерфейс «Такси», платформа 8.3.2x) есть три инструмента. Они ищут по-разному.
| Инструмент | Как вызвать | Найдёт ли кавычку | Когда брать |
|---|---|---|---|
| Строка поиска над списком | Курсор в список → начать печатать или Ctrl+F | Ненадёжно: при полнотекстовом поиске " — оператор | Поиск по словам |
| Расширенный поиск | Alt+F или команда «Расширенный поиск» в меню «Ещё» | Да, по выбранной колонке | Справочники, журналы документов |
| Отбор через «Настроить список» | Меню «Ещё» → «Настроить список» → вкладка «Отбор» | Да, условие «Содержит» | Нужно сохранить отбор или совместить с другими |
Расширенный поиск: пошагово
- Откройте список, например
Справочники → Контрагентыили любой журнал документов . - Встаньте курсором в колонку, по которой ищете, — «Наименование», «Комментарий», «Номер».
- Нажмите
Alt+F. Откроется окно с полями «Где искать», «Что искать», «Как искать». - В «Что искать» введите один символ:
",«,»или'. - В «Как искать» выберите «по части строки». Режим «по началу строки» найдёт только записи, где кавычка стоит первой.
- Нажмите «Найти». Список отфильтруется, над ним появится плашка с условием. Крестик на плашке снимает отбор.
💡 Надо найти сразу и «ёлочки», и прямые кавычки — сделайте два прохода или используйте отбор с группой «ИЛИ» в «Настроить список».
Отбор «Содержит»
Окно «Настроить список» удобнее, когда условий несколько. На вкладке «Отбор» добавьте поле «Наименование», вид сравнения «Содержит», значение — символ кавычки. Чтобы искать любой из вариантов, добавьте «Группа ИЛИ» и положите в неё три строки: с ", с « и с „.
Поиск внутри текстового поля и табличного документа
В многострочном поле (комментарий, текст письма) и в открытой печатной форме работает Ctrl+F. Печатная форма — это табличный документ: поиск идёт по ячейкам, найденная подсвечивается. Замены в пользовательском режиме для таких полей обычно нет — правят вручную или обработкой (о ней ниже).
Кавычки в модулях: возможности Конфигуратора и EDT
Разработчику нужна кавычка в тексте модулей: найти строку с незакрытым литералом, проверить экранирование, заменить «ёлочки» в сообщениях пользователю.
Конфигуратор
- 🔎
Ctrl+F— поиск в текущем модуле. В окне есть флажки «Учитывать регистр» и «Слово целиком», направление поиска. - ✏️
Ctrl+H— поиск и замена в текущем модуле, с кнопками «Заменить» и «Заменить все». - 🌐
Ctrl+Shift+F— глобальный поиск по всем текстам конфигурации. Можно ограничить область: вся конфигурация, выбранные объекты, макеты. - ↩️
F3— следующее вхождение после первого поиска.
Регулярных выражений и подстановочных символов поиск Конфигуратора не поддерживает. Он ищет буквальную подстроку. Поэтому подбирайте строку так, чтобы она отсекала лишнее.
| Что ищете | Что вводить | Почему так |
|---|---|---|
| Кавычку-символ внутри строки | "" | В коде 1С кавычка в литерале удваивается |
| Литерал из одной кавычки | """" | Строка, состоящая только из " |
| Обращение через код символа | Символ(34 | Так кавычку пишут без экранирования |
| «Ёлочки» в текстах сообщений | « | Символ ищется как есть |
| Одинарную кавычку | ' | Найдутся и литералы дат вида '20240101' — это нормально |
⚠️ Простой поиск " в модуле бесполезен: он остановится на каждом строковом литерале, а их тысячи.
1C:EDT
В EDT поиск и замена — стандартные окна Eclipse. В диалоге Ctrl+F есть флажок «Regular expressions», а Ctrl+H открывает поиск по всему проекту. Здесь и работают «подстановки» в полном смысле: шаблоны, классы символов, группы.
Пример: найти «ёлочки» и прямые кавычки одним запросом — шаблон [«»"]. Найти строку, где кавычка стоит перед закрывающей скобкой: "\). Регулярные выражения в EDT — синтаксис Java, не язык запросов 1С.
Шаблоны поиска: ПОДОБНО в запросах и подстановки в EDT
Когда нужно найти кавычки в данных базы целиком, а не в одном списке, работает язык запросов. Оператор ПОДОБНО понимает шаблоны:
%— любая последовательность символов, в том числе пустая;_— ровно один любой символ;[...]— один символ из перечисленных;[^...]— один символ, кроме перечисленных.
Кавычка для ПОДОБНО не служебный символ. Мешает другое: текст запроса сам записан в строке встроенного языка, и кавычки приходится удваивать дважды. Проще передать шаблон параметром.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка,
| Спр.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Спр
|ГДЕ
| Спр.Наименование ПОДОБНО &Шаблон";
// любая из кавычек: прямая, «, », „, “
Шаблон = "%[" + Символ(34) + Символ(171) + Символ(187)
+ Символ(8222) + Символ(8220) + "]%";
Запрос.УстановитьПараметр("Шаблон", Шаблон);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Такой запрос можно выполнить в консоли запросов: параметр задаётся в её окне, достаточно вставить туда сам символ кавычки внутри шаблона %[«»"]%.
💡 Нужно найти записи, где кавычек нечётное число (одна открыта и не закрыта), — ПОДОБНО с этим не справится. Отберите запросом все строки с кавычками, а подсчёт сделайте в коде (пример ниже).
Работа с кавычками во встроенном языке 1С
Как записать кавычку в строке
Внутри строкового литерала кавычку удваивают. Альтернатива — код символа.
Текст1 = "ООО ""Ромашка"""; // ООО "Ромашка"
Текст2 = "ООО " + Символ(34) + "Ромашка" + Символ(34); // то же
Кавычка = """"; // строка из одного символа "
У системного перечисления Символы отдельного значения для кавычки нет — есть Символы.ПС, Символы.Таб, Символы.НПП и другие служебные. Для кавычки используйте Символ(34) или """".
Найти, посчитать, заменить
| Задача | Функция | Пример |
|---|---|---|
| Позиция первой кавычки | СтрНайти | СтрНайти(Стр, """") → 0, если нет |
| Позиция последней | СтрНайти с направлением | СтрНайти(Стр, """", НаправлениеПоиска.СКонца) |
| Сколько кавычек | СтрЧислоВхождений | СтрЧислоВхождений(Стр, Символ(34)) |
| Заменить | СтрЗаменить | СтрЗаменить(Стр, Символ(171), """") |
| Код символа в позиции | КодСимвола | КодСимвола(Стр, 5) → 34, 171, 8222… |
СтрНайти появилась в 8.3.6. В старом коде встречается Найти(Стр, """") — работает так же, но с первого вхождения и без направления.
Проверка «все ли кавычки закрыты»
Функция КавычкиСбалансированы(Стр)
Прямых = СтрЧислоВхождений(Стр, Символ(34));
Открыто = СтрЧислоВхождений(Стр, Символ(171));
Закрыто = СтрЧислоВхождений(Стр, Символ(187));
Возврат Прямых % 2 = 0 И Открыто = Закрыто;
КонецФункции
% здесь — остаток от деления. Для строки ООО "Ромашка прямых кавычек 1, остаток 1 — функция вернёт Ложь.
Почему одинаковые на вид кавычки не находятся: символы и кодировки
Одна и та же «кавычка» на экране — это минимум пять разных символов Юникода. Поиск в 1С сравнивает коды, а не картинку.
| Символ | Название | Код (Символ(...)) | Откуда берётся |
|---|---|---|---|
" | прямая двойная | 34 | Клавиатура, выгрузки, XML |
' | апостроф | 39 | Клавиатура, фамилии, литералы дат |
« | ёлочка открывающая | 171 | Word, сайты, ручной ввод Alt+0171 |
» | ёлочка закрывающая | 187 | То же, Alt+0187 |
„ | лапка нижняя | 8222 | Word с немецкой автозаменой |
“ | лапка верхняя левая | 8220 | Word, письма, мессенджеры |
” | лапка верхняя правая | 8221 | Англоязычная автозамена |
Откуда берётся разнобой:
- 📋 Копирование из Word и почты. Автозамена превращает
"в «ёлочки» или лапки ещё до вставки в 1С. - 📥 Загрузка из Excel
и CSV. В CSV кавычка внутри поля удваивается, при кривом разборе в наименовании остаются лишние
"". - 🌐 Обмен через XML. В файле кавычка хранится как
". При разборе вручную, безЧтениеXML, этот текст может попасть в базу буквально. - 🔤 Файлы в Windows-1251. В этой кодировке «ёлочки» есть, а лапок
„“нет: при сохранении они превращаются в?.
Определить, какая именно кавычка в строке, можно кодом: КодСимвола(Стр, Позиция). Позицию даёт СтрНайти или подбор вручную.
Массовая замена кавычек обработкой
Типовая задача: в справочнике контрагентов или номенклатуры наименования введены с разными кавычками, и нужно привести их к одному виду. Перед поиском дублей, перед выгрузкой в ЭДО, перед сверкой с банком.
Готовые инструменты БСП здесь помогают ограниченно. «Групповое изменение реквизитов» в Бухгалтерии 3.0 (Администрирование → Обслуживание → Корректировка данных) присваивает реквизиту новое значение целиком, а заменять часть строки не умеет. Для замены символа нужна своя внешняя обработка.
Перед массовой записью объектов сделайте резервную копию базы и проверьте обработку на копии.
Каркас серверной процедуры:
&НаСервере
Процедура ЗаменитьКавычкиНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Спр
|ГДЕ
| Спр.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон",
"%[" + Символ(171) + Символ(187) + Символ(8222)
+ Символ(8220) + Символ(8221) + "]%");
Выборка = Запрос.Выполнить().Выбрать();
Изменено = 0;
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Наименование = ПривестиКавычки(Объект.Наименование);
Попытка
Объект.Записать();
Изменено = Изменено + 1;
Исключение
Сообщить("Не записан: " + Выборка.Ссылка + ". "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Сообщить(СтрШаблон("Изменено элементов: %1", Формат(Изменено, "ЧН=0; ЧГ=0")));
КонецПроцедуры
&НаСервере
Функция ПривестиКавычки(Стр)
Результат = Стр;
Для Каждого Код Из СтрРазделить("171,187,8222,8220,8221", ",") Цикл
Результат = СтрЗаменить(Результат, Символ(Число(Код)), Символ(34));
КонецЦикла;
Возврат Результат;
КонецФункции
Что учесть:
- 🧾 У контрагентов в Бухгалтерии 3.0 кроме «Наименования» есть «Полное наименование» — его обработайте тем же способом.
- 🔄 Каждая запись объекта регистрируется в планах обмена. Если база в обмене, изменения уедут в узлы — это обычно и нужно, но предупредите тех, кто сопровождает обмен.
- 👥 Обработку запускайте, когда в базе мало пользователей: запись сотен элементов может натыкаться на блокировки, если кто-то держит карточку открытой.
- 🧪 Сначала запустите вариант без
Записать(), только сСообщитьстарого и нового значения, — увидите, что именно поменяется.
Направление замены выбирайте под задачу. Для печатных форм и писем чаще приводят к «ёлочкам». Для выгрузок, сверок и поиска дублей — к прямым кавычкам: так строки проще сравнивать.
Где обычно ошибаются при поиске и замене
- ❌ Ищут прямую кавычку, а в данных «ёлочки». Список «пустой», хотя кавычки видны. Проверьте код символа или ищите все варианты сразу.
- ❌ «Заменить все» по
"в модуле. Ломает каждый строковый литерал, модуль перестаёт компилироваться. Замену в коде делайте только по уникальной строке, например«или""Ромашка"". - ❌ Пишут в запросе
ПОДОБНО "%""%"внутри строки модуля. Кавычки нужно удваивать и для текста запроса, и для строки встроенного языка — легко запутаться. Параметр снимает проблему. - ❌ Меняют кавычки в наименовании, но не в полном наименовании. В печатных формах и ЭДО выходит полное наименование — и там остаются старые символы.
- ❌ Склеивают счётчик со строкой без
Формат. Для числа больше 999 в сообщении появится неразрывный пробел-разделитель, а в логе это выглядит как мусор.
Частые вопросы
Почему поиск по ИНН находит контрагента, а по названию с кавычками — нет?
Alt+F по части строки.Как ввести «ёлочки» с клавиатуры в поле 1С?
Alt+0171 и Alt+0187 на цифровом блоке при включённом NumLock. В русской раскладке типографских кавычек на отдельной клавише нет.Влияют ли кавычки в наименовании на выгрузку в ФНС и банк?
", файл остаётся корректным. Проблемы бывают при сверке: банк и контрагент видят прямые кавычки, а у вас «ёлочки» — строки не совпадают.Можно ли найти кавычку в поиске по всем данным базы?
ПОДОБНО.Как в коде убрать кавычки по краям строки?
Лев(Стр, 1) и Прав(Стр, 1) и отрежьте их Сред(Стр, 2, СтрДлина(Стр) - 2). Сначала примените СокрЛП, иначе пробел по краю помешает проверке.