1C-CodeОсновы 1С → Строки: склеить, разрезать, найти, проверить

Строки: склеить, разрезать, найти, проверить

Всё, что приходит от человека и из файла, приходит строкой. Здесь — как это разбирать и не обжечься.

Глава 6 из 36 · чтение примерно 26 минут

Строка — это текст: наименование, адрес, комментарий, номер договора. Но главное не это. Главное — что строкой приходит всё, что вводит человек и всё, что лежит в файле. Прежде чем стать числом или датой, данные побывают строкой, и разбирать их придётся вам.

Поэтому глава не столько про текст, сколько про разбор входных данных — работу, из которой состоит половина обмена с внешним миром.

Кавычки и кавычка внутри кавычек

Строка в коде записывается в двойных кавычках: "Гвозди 100мм". Одинарные кавычки в 1С для строк не используются вообще.

Если кавычка нужна внутри текста, её удваивают:

Кавычка внутри строки

Название = "ООО ""Ромашка""";
Сообщить(Название);   // ООО "Ромашка"
ЧастьЧто означает
"" внутридве кавычки подряд означают одну кавычку в тексте
три кавычки в концедве — это кавычка текста, третья закрывает строку
зачемнаименования контрагентов почти всегда в кавычках

Длина и регистр

СтрДлина(Текст) — сколько символов. Пробелы считаются тоже, они такие же символы, как буквы.

Три команды меняют регистр: ВРег — всё заглавными, НРег — всё строчными, ТРег — каждое слово с заглавной.

Регистр

ВыражениеРезультатГде применяют
ВРег("привет")"ПРИВЕТ"привести коды к одному виду перед сравнением
НРег("ПРИВЕТ")"привет"то же самое, выбор — дело вкуса, лишь бы одинаково
ТРег("иванов иван")"Иванов Иван"причесать ФИО, набранное как попало
СтрДлина("Привет")6проверить, что поле заполнено не мусором

Сравнение строк учитывает регистр

"гвозди" = "Гвозди" — это Ложь. Для программы это разные строки, и никакой «похожести» она не ищет.

Поэтому коды, артикулы и любые опознавательные строки перед сравнением приводят к одному регистру: ВРег(СокрЛП(А)) = ВРег(СокрЛП(Б)).

Без этого получается классическая жалоба: «товар в базе есть, а обмен создаёт второй такой же». Есть, только записан как «ГВОЗДИ», а в файле пришли «Гвозди».

Лишние пробелы: СокрЛП

СокрЛП(Текст) убирает пробелы слева и справа. Есть ещё СокрЛ (только слева) и СокрП (только справа), но на практике почти всегда нужен именно СокрЛП.

Правило простое: всё, что пришло извне, сначала СокрЛП. Из файла, из поля ввода, из письма. Пробел в конце строки не видно на экране — и он ломает сравнение молча, без всякой ошибки.

Упражнение 1. Привести код к единому виду

Напишите функцию Нормализовать(Код): убрать лишние пробелы по краям и перевести в верхний регистр. Для строки " ру-15 " должно получиться РУ-15.

Решается в тренажёре: код запускается и проверяется сразу.

Склейка и СтрШаблон

Плюс склеивает строки. Правило из первой главы действует здесь в полную силу: операцию задаёт то, что слева. "Итого: " + 1000 работает, 1000 + "Итого: " — ошибка.

Когда кусков больше трёх, склейка становится нечитаемой. Тогда берут СтрШаблон: в тексте расставляют %1, %2, а значения перечисляют следом.

✓ Склейка плюсами

Текст = "Заказ № " + Строка(Номер)
  + " от " + Формат(Дата, "ДФ=dd.MM.yyyy")
  + " на сумму " + Строка(Сумма);

Читать трудно: текст разорван кавычками и плюсами.

✕ СтрШаблон

Текст = СтрШаблон("Заказ № %1 от %2 на сумму %3",
  Номер, Формат(Дата, "ДФ=dd.MM.yyyy"), Сумма);

Фраза видна целиком — сразу понятно, что увидит человек.

Мелочь, которая выдаёт новичка

Пробелы в склейке. "Итого:" + Строка(Сумма) даёт «Итого:1000» — некрасиво и заметно.

Пробел ставят внутри кавычек: "Итого: ". Между плюсом и кавычкой пробелов сколько угодно, но в текст они не попадут — программа их не видит.

Упражнение 2. Фамилия и инициал

Напишите функцию Инициал(Фамилия, Имя), которая возвращает Иванов И. — фамилия, пробел, первая буква имени и точка.

Решается в тренажёре: код запускается и проверяется сразу.

Отрезать кусок: Лев, Прав, Сред

Лев(Текст, N) — первые N символов. Прав(Текст, N) — последние N. Сред(Текст, Начало, Сколько) — кусок из середины.

И сразу важное: символы нумеруются с единицы. Первый символ имеет номер 1, а не 0. Если вы знаете другой язык — это как раз тот случай, где 1С отличается.

Три способа отрезать

Текст = "Привет";
Лев(Текст, 3);       // "При"
Прав(Текст, 3);      // "вет"
Сред(Текст, 2, 3);   // "рив" — с 2-го символа, длиной 3
Сред(Текст, 3);      // "ивет" — с 3-го и до конца
ЧастьЧто означает
нумерацияпервый символ — номер 1
Сред без третьегоесли длину не указать, берётся всё до конца
Правсчитает с конца — удобно для последних цифр счёта или года в дате

Короткая строка не ломает Лев и Прав

Что будет, если попросить Прав("аб", 5) — пять символов там, где их два?

Ничего страшного: вернётся "аб". Ни ошибки, ни мусора. Эти команды сами ограничиваются тем, что есть.

Это стоит знать, потому что защитная проверка «а вдруг строка короче» здесь ничего не меняет — она просто повторяет то, что команда уже делает сама. Лишний код, который выглядит осторожным, но не защищает ни от чего.

Упражнение 3. Последние четыре цифры

Напишите функцию Хвост(Счёт) — последние четыре символа номера счёта. Если символов меньше четырёх, вернуть строку целиком. Проверьте на строке "12": ожидается 12.

Решается в тренажёре: код запускается и проверяется сразу.

Поиск: СтрНайти

СтрНайти(Где, Что) возвращает номер позиции, с которой начинается найденный кусок. СтрНайти("Привет", "вет") даёт 4.

А если не нашлось — возвращается 0. Не −1, не Неопределено, а именно ноль. И поскольку позиций с номером 0 не бывает, проверка звучит так: Если СтрНайти(Где, Что) > 0 Тогда.

Ловушка для тех, кто знает другие языки

Во многих языках поиск возвращает −1, когда ничего не найдено, и там пишут если результат >= 0. Перенесите эту привычку в 1С — и условие станет всегда истинным: ноль тоже больше либо равен нулю.

Код будет работать «почти правильно»: находить там, где надо, и ещё срабатывать там, где не надо. Такие ошибки живут в базе месяцами.

Упражнение 4. Есть ли в тексте

Напишите функцию ЕстьВТексте(Текст, Что), возвращающую Истина или Ложь. Для "Гвозди 100мм" и "мм" — Истина.

Решается в тренажёре: код запускается и проверяется сразу.

Заменить и посчитать

СтрЗаменить(Где, Что, НаЧто) заменяет все вхождения сразу, а не первое. Если заменять на пустую строку — получится удаление.

СтрЧислоВхождений(Где, Что) считает, сколько раз кусок встречается.

Ещё две команды читаются как обычная фраза: СтрНачинаетсяС(Текст, Начало) и СтрЗаканчиваетсяНа(Текст, Конец). Они возвращают Истину или Ложь и заменяют возню с Лев и Прав.

Упражнение 5. Телефон в чистом виде

Телефоны приходят как +7 (900) 123-45-67, а хранить надо только цифры. Напишите ТолькоЦифры(Телефон), убирающую пробелы, скобки, дефисы и плюс. Ожидается 79001234567 строкой.

Решается в тренажёре: код запускается и проверяется сразу.

Строку нельзя изменить — только заменить целиком

Строка в 1С неизменяема. Никакая команда не правит её на месте: СтрЗаменить, ВРег, СокрЛП — все возвращают новую строку, а исходная остаётся прежней.

Отсюда самая частая ошибка при работе с текстом:

СокрЛП(Наименование); — строка выполнилась, пробелы обрезались, результат выброшен. Надо: Наименование = СокрЛП(Наименование);

Ошибка тихая: ни предупреждения, ни ошибки, просто ничего не произошло.

Разобрать строку на части

СтрРазделить(Текст, Разделитель) режет строку по разделителю и возвращает массив кусков. Обратная команда — СтрСоединить(Массив, Разделитель).

Это основной способ разобрать строку из файла: одна строка CSV — одно обращение к СтрРазделить.

Разбор строки из файла

Строка = "Иванов;ООО Ромашка;12000";
Части = СтрРазделить(Строка, ";");
Части[0];   // "Иванов"
Части[1];   // "ООО Ромашка"
Части[2];   // "12000" — это ещё строка, не число
ЧастьЧто означает
СтрРазделитьвозвращает массив — про массивы будет отдельная глава
Части[0]элементы массива нумеруются с НУЛЯ — в отличие от символов в строке
"12000"из файла всё приходит текстом, число надо получать отдельно
пустые кускисохраняются: "а,,б" даст три элемента, средний пустой

Символы с единицы, элементы массива с нуля

Да, в одном языке уживаются обе нумерации, и это правда путает.

Лев(Текст, 1) — первый символ, нумерация с 1. Массив[0] — первый элемент, нумерация с 0.

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

Строка в число: только с проверкой

Число("250") даёт 250. А Число("двести") прекращает работу программы — это ошибка, а не ноль.

Разница принципиальна. Если файл прислали с опечаткой, обработка не «пропустит строку», а упадёт целиком, посреди загрузки, оставив половину данных.

Поэтому строку проверяют до преобразования: например, убедиться, что в ней только цифры. Ловить ошибку постфактум через Попытку тоже можно, но это последнее средство, а не первое.

Упражнение 6. Сумма из строки файла

Строка файла выглядит так: Иванов;ООО Ромашка;12000. Напишите СуммаСтроки(СтрокаФайла), возвращающую третье поле числом: ожидается 12000.

Решается в тренажёре: код запускается и проверяется сразу.

Пустая строка

ПустаяСтрока(Текст) — Истина, если строка пустая или состоит из одних пробелов. Это не то же самое, что Текст = "": строка из трёх пробелов пустой не равна, а ПустаяСтрока про неё скажет Истина.

Для проверки заполненности полей нужна именно ПустаяСтрока — человек, нажавший пробел в поле ввода, не должен считаться заполнившим его.

Текст в несколько строк

Строку можно продолжить на следующей строке кода. Продолжение начинают с вертикальной черты — и без неё код не скомпилируется.

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

Как пишут текст запроса

Запрос.Текст =
"ВЫБРАТЬ
|	Ссылка,
|	Наименование
|ИЗ
|	Справочник.Номенклатура
|ГДЕ
|	Не ПометкаУдаления";
ЧастьЧто означает
"ВЫБРАТЬкавычка открывается один раз — в начале всего текста
|вертикальная черта в начале каждой следующей строки: это продолжение той же строки
всё до чертыотступы перед чертой в текст НЕ попадают — можно выравнивать код как удобно
после чертыа вот после неё попадает всё, включая табуляцию: так запрос и получает свои отступы
";кавычка закрывается один раз — в самом конце

Забытая черта и лишняя кавычка

Две ошибки, которые делают все и по многу раз.

Забыли черту в одной из строк — компилятор ругается на что угодно, кроме настоящей причины: он считает, что строка закончилась, и дальше читает текст как код.

Закрыли кавычку на каждой строке — привычка из других языков. Тогда это не одна строка, а несколько выражений подряд, и код не собирается.

Полезно помнить: перенос строки в исходнике внутри такого текста превращается в настоящий перевод строки. Поэтому многострочными пишут не только запросы, но и длинные сообщения.

Служебные символы

Перевод строки и табуляцию в кавычках не напечатать — их берут из Символы.

Символы, которые нужны

ИмяЧто этоГде нужно
Символы.ПСперевод строкимногострочное сообщение, текст письма, лог
Символы.Табтабуляциявыгрузка в файл с разделителем-табуляцией
Символы.НППнеразрывный пробелчтобы «10 шт» не разорвалось переносом
Символы.ВКвозврат кареткифайлы и протоколы, где перевод строки состоит из двух символов

Многострочный текст умеют разбирать две команды: СтрЧислоСтрок(Текст) — сколько в нём строк, и СтрПолучитьСтроку(Текст, Номер) — одна строка по номеру. Нумерация, как и у символов, с единицы.

Так читают файл, загруженный целиком, и так разбирают ответ внешней системы.

Упражнение 7. Вторая строка

Напишите Вторая(Текст): вернуть вторую строку многострочного текста, без лишних пробелов по краям. Проверка передаёт три фамилии, по одной в строке, и ждёт Петров.

Решается в тренажёре: код запускается и проверяется сразу.

Формат: как показать число и дату человеку

Строка(1234567.891) даёт «1234567,891» — верно и нечитаемо. В документе, в отчёте, в письме нужно «1 234 567,89».

За это отвечает Формат(Значение, Строка). Вторая часть — набор указаний через точку с запятой. Их много, но в работе используются пять.

Что нужно помнить из Формат

УказаниеЧто делаетПример
ЧДЦ=2знаков после запятой ровно столькоФормат(12.5, "ЧДЦ=2") → 12,50
ЧРГ=' 'разделитель групп разрядовФормат(12500, "ЧРГ=' '") → 12 500
ЧН=чем показывать нольФормат(0, "ЧН=") → пустая строка вместо 0
ДФ=dd.MM.yyyyформат даты по частямФормат(Дата, "ДФ=dd.MM.yyyy") → 15.01.2026
ДЛФ=Dдлинный формат датыФормат(Дата, "ДЛФ=D") → 15 января 2026 г.
БЛ=нет; БИ=дакак показывать Ложь и ИстинуФормат(Истина, "БЛ=нет; БИ=да") → да

ММ — это месяцы, мм — минуты

В строке формата даты регистр букв значим, и на этом спотыкаются все по одному разу: dd.mm.yyyy напечатает минуты вместо месяца. Месяцы — большие MM.

И второе: ЧН= с пустым значением — не ошибка, а частый приём. Нули в отчёте засоряют таблицу, и их убирают именно так.

Строка или Формат

Строка(Значение) — быстрый способ получить хоть какое-то текстовое представление. Годится для журнала, для отладки, для склейки служебного текста.

Формат(Значение, …) — способ показать значение человеку. Всё, что человек увидит на форме, в печатной форме или в письме, проходит через него.

Разницу видно на дате: Строка(Дата) даст «15.01.2026 0:00:00» — с бессмысленным нулевым временем, которое в документе выглядит как ошибка.

Упражнение 8. Сумма для человека

Напишите Деньги(Сумма): вернуть сумму с двумя знаками после запятой и пробелом между разрядами. Для 1234567.891 ожидается 1 234 567,89.

Решается в тренажёре: код запускается и проверяется сразу.

Три команды, которых ждут на собеседовании

СтрНачинаетсяС(Текст, Начало) и СтрЗаканчиваетсяНа(Текст, Конец) — вместо Лев и Прав с подсчётом длины. Короче и не ошибётся на единицу.

СтрСравнить(А, Б) — сравнение без учёта регистра: 0 — строки равны, −1 и 1 — какая раньше. Это правильный ответ на вопрос «как сравнить строки, не обращая внимания на заглавные»: ВРег с обеих сторон работает, но СтрСравнить для этого и сделан.

СтрЗаменить, СтрНайти и СтрРазделить вы уже знаете — вместе с этими тремя они и есть весь набор, который нужен в обычной работе.

НСтр: строки, которые видит человек

В типовых конфигурациях текст сообщений пишут не кавычками, а так: НСтр("ru = 'Не заполнен склад'").

Это «национальная строка»: в ней хранятся варианты на разных языках, и платформа берёт тот, на котором работает пользователь. В базе, где работают на двух языках, обычная строка в кавычках останется русской для всех.

Правило простое: текст для человека — через НСтр, служебный текст — обычной строкой. Имена колонок, ключи структур и тексты запросов в НСтр не заворачивают.

Шпаргалка по строкам

КомандаЧто делает
СтрДлина(Т)сколько символов
СокрЛП(Т)убрать пробелы по краям
ВРег(Т) / НРег(Т) / ТРег(Т)верхний / нижний / каждое слово с заглавной
Лев(Т, N) / Прав(Т, N)первые / последние N символов
Сред(Т, Начало, Сколько)кусок из середины, нумерация с 1
СтрНайти(Т, Что)позиция или 0, если не найдено
СтрЗаменить(Т, Что, НаЧто)заменить все вхождения
СтрЧислоВхождений(Т, Что)сколько раз встречается
СтрНачинаетсяС / СтрЗаканчиваетсяНаИстина или Ложь
СтрРазделить(Т, Р)разрезать в массив
СтрСоединить(М, Р)собрать массив в строку
СтрШаблон("%1 из %2", А, Б)подставить значения в текст
ПустаяСтрока(Т)пустая или одни пробелы
Строка(Значение) / Число(Т)преобразование в текст и обратно

Что дальше

Строки разобраны. Следующая глава — даты: тип, в котором больше всего неочевидного. Начало дня, конец дня, «дата с временем» там, где ждали просто дату, — из-за этого отчёты теряют последний день периода, и это самая частая ошибка во всём учёте.

Как закрепить

Читать про код и писать код — разные умения. В тренажёре к этой главе идут упражнения: вы пишете решение, оно запускается на настоящем интерпретаторе 1С и проверяется сразу, без установки платформы.

Открыть эту главу в тренажёре

Числа: арифметика, округление и деньги
Даты: границы периода и потерянный последний день