При написании программного кода на платформе 1С:Предприятие 7.7 и обработке внешних данных часто возникает вопрос: как правильно включить символ двойной кавычки внутрь строковой переменной. Символ " является служебным и служит ограничителем строкового литерала, поэтому прямое его использование внутри текста может приводить к синтаксическим ошибкам или некорректной интерпретации выражений. Разберем детально, как устроена работа со строками, содержащими кавычки, в коде и при чтении из текстовых файлов.
Рассмотрим базовый механизм встроенного языка 1С. Чтобы компилятор воспринял кавычку как печатный символ внутри строковой константы, а не как признак окончания строки, эту кавычку необходимо удвоить. Посмотрим на примеры объявления строк в модуле:
// Вывод текста: Операция "Копирование" закончена
Сообщить("Операция """"Копирование"""" закончена");
// Вывод слова в кавычках: "текст"
Сообщить("""текст""");
Проанализируем синтаксис: внешние кавычки открывают и закрывают строковый литерал, а каждая пара внутренних кавычек "" превращается ровно в один символ двойной кавычки внутри результирующего значения.
Если строка собирается динамически из нескольких фрагментов или удвоенные кавычки ухудшают читаемость исходного кода, можно использовать вставку символа по его ASCII-коду. Код символа двойной кавычки — 34.
Важное отличие платформы 1С 7.7: во встроенном языке версии 7.7 используется функция Симв(), в то время как функция Символ() появилась только в 1С 8.х. Попытка вызова Символ(34) в семерке приведет к ошибке выполнения.
Разберем по шагам конкатенацию строк с использованием кода символа:
Кавычка = Симв(34);
СтрокаСообщения = "Операция " + Кавычка + "Копирование" + Кавычка + " закончена";
Сообщить(СтрокаСообщения);
Выясним причину частых сомнений разработчиков при загрузке внешних данных. При считывании информации из файлов через стандартный объект Текст платформа не требует дополнительного экранирования кавычек в самом файле. Строка считывается как есть.
Посмотрим на пример работы с объектом Текст:
Файл = СоздатьОбъект("Текст");
Файл.Открыть("C:\data.txt");
Для НомерСтроки = 1 По Файл.КоличествоСтрок() Цикл
Стр = Файл.ПолучитьСтроку(НомерСтроки);
// Значение Стр уже содержит все исходные кавычки без синтаксических ошибок
Сообщить(Стр);
КонецЦикла;
Если текстовый файл представляет собой выгрузку в формате CSV, где значения колонок обрамлены кавычками согласно стандарту, для дальнейшей обработки потребуется очистить строку или заменить спецсимволы с помощью функции СтрЗаменить():
// Замена двойных кавычек на типографские «елочки» или апострофы
СтрокаБезКавычек = СтрЗаменить(Стр, Симв(34), "''");
При дальнейшей обработке строк, содержащих кавычки, обратим внимание на ситуации, в которых могут возникнуть скрытые ошибки:
Шаблон(): Если строка с кавычками попадает внутрь вычисляемых выражений в квадратных скобках [...], синтаксический анализатор завершит работу с ошибкой. Значения с кавычками следует выносить за пределы вычисляемых блоков или формировать обычной конкатенацией.КомандаСистемы): При передаче путей к файлам или аргументов командной строки Windows, содержащих пробелы, их необходимо принудительно оборачивать в кавычки, например: КомандаСистемы("notepad.exe """ + ИмяФайла + """");.СтрЗаменить(Текст, "'", "''")), чтобы избежать нарушения синтаксиса SQL.