Двойные, одинарные и «ёлочки»: где и чем искать кавычки в базе и в коде 1С

· 10 мин

Содержание

Найти кавычку в 1С проще всего расширенным поиском списка: Alt+F → поле, например «Наименование» → режим «по части строки» → в строку поиска ввести сам символ " или «. В коде модуля — Ctrl+F в Конфигураторе, а в тексте программы кавычку внутри строки ищут как удвоенную: "".

Частая ошибка — набрать кавычку в обычное поле поиска над списком и решить, что «1С не ищет символы». Это поле работает как полнотекстовый поиск, а там двойная кавычка — служебный знак: ею обрамляют точную фразу. Символ просто съедается. Вторая ловушка — визуально одинаковые, но разные символы: прямая ", «ёлочки» и «лапки» „“ из Word. Ищете одну — находите не всё.

Поиск кавычки в списках и полях режима Предприятия

В пользовательском режиме (интерфейс «Такси», платформа 8.3.2x) есть три инструмента. Они ищут по-разному.

ИнструментКак вызватьНайдёт ли кавычкуКогда брать
Строка поиска над спискомКурсор в список → начать печатать или Ctrl+FНенадёжно: при полнотекстовом поиске " — операторПоиск по словам
Расширенный поискAlt+F или команда «Расширенный поиск» в меню «Ещё»Да, по выбранной колонкеСправочники, журналы документов
Отбор через «Настроить список»Меню «Ещё» → «Настроить список» → вкладка «Отбор»Да, условие «Содержит»Нужно сохранить отбор или совместить с другими

Расширенный поиск: пошагово

  1. Откройте список, например Справочники → Контрагенты или любой журнал документов .
  2. Встаньте курсором в колонку, по которой ищете, — «Наименование», «Комментарий», «Номер».
  3. Нажмите Alt+F. Откроется окно с полями «Где искать», «Что искать», «Как искать».
  4. В «Что искать» введите один символ: ", «, » или '.
  5. В «Как искать» выберите «по части строки». Режим «по началу строки» найдёт только записи, где кавычка стоит первой.
  6. Нажмите «Найти». Список отфильтруется, над ним появится плашка с условием. Крестик на плашке снимает отбор.

💡 Надо найти сразу и «ёлочки», и прямые кавычки — сделайте два прохода или используйте отбор с группой «ИЛИ» в «Настроить список».

Отбор «Содержит»

Окно «Настроить список» удобнее, когда условий несколько. На вкладке «Отбор» добавьте поле «Наименование», вид сравнения «Содержит», значение — символ кавычки. Чтобы искать любой из вариантов, добавьте «Группа ИЛИ» и положите в неё три строки: с ", с « и с „.

Поиск внутри текстового поля и табличного документа

В многострочном поле (комментарий, текст письма) и в открытой печатной форме работает 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Клавиатура, фамилии, литералы дат
«ёлочка открывающая171Word, сайты, ручной ввод Alt+0171
»ёлочка закрывающая187То же, Alt+0187
„лапка нижняя8222Word с немецкой автозаменой
“лапка верхняя левая8220Word, письма, мессенджеры
”лапка верхняя правая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С?
В Windows — Alt+0171 и Alt+0187 на цифровом блоке при включённом NumLock. В русской раскладке типографских кавычек на отдельной клавише нет.
Влияют ли кавычки в наименовании на выгрузку в ФНС и банк?
Платформа при записи XML сама экранирует кавычку как ", файл остаётся корректным. Проблемы бывают при сверке: банк и контрагент видят прямые кавычки, а у вас «ёлочки» — строки не совпадают.
Можно ли найти кавычку в поиске по всем данным базы?
Полнотекстовый поиск индексирует слова, а знаки препинания пропускает. Найти символ кавычки им нельзя — используйте отбор в конкретном списке или запрос с ПОДОБНО.
Как в коде убрать кавычки по краям строки?
Проверьте первый и последний символы через Лев(Стр, 1) и Прав(Стр, 1) и отрежьте их Сред(Стр, 2, СтрДлина(Стр) - 2). Сначала примените СокрЛП, иначе пробел по краю помешает проверке.