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С и проверяется сразу, без установки платформы.
← Числа: арифметика, округление и деньги
→ Даты: границы периода и потерянный последний день