Работа со строковыми данными в системе 1С:Предприятие часто требует объединения нескольких текстовых фрагментов в единое целое. Разработчики регулярно сталкиваются с задачей формирования сложных составных полей, таких как полные наименования контрагентов, адреса или составные коды классификаторов.

В языке запросов 1С для этой операции предусмотрен стандартный и интуитивно понятный механизм. Однако, как и в любой строгой типизированной среде, здесь существуют свои нюансы, связанные с типами данных и обработкой пустых значений.

Правильное использование конкатенации позволяет оптимизировать код, перенося логику формирования строк непосредственно в запрос, что снижает нагрузку на клиентскую часть приложения.

Основной синтаксис оператора сложения

Для объединения строковых выражений в языке запросов используется арифметический оператор сложения +. Несмотря на то, что символ ассоциируется с математикой, в контексте работы с типом Строка он выполняет функцию конкатенации.

Процесс соединения происходит последовательно слева направо. Если вы хотите объединить содержимое двух полей таблицы, вам достаточно записать их через этот оператор в списке выбранных полей.

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

💡

Для улучшения читаемости кода в запросе используйте пробелы вокруг оператора +: Поле1 + " " + Поле2. Это не влияет на производительность, но облегчает поддержку.

Рассмотрим базовый пример, где мы формируем полное ФИО из трех отдельных полей справочника ФизическиеЛица.

ВЫБРАТЬ

ФизическиеЛица.Фамилия + " " + ФизическиеЛица.Имя + " " + ФизическиеЛица.Отчество КАК ПолноеФИО

ИЗ

Справочник.ФизическиеЛица КАК ФизическиеЛица

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

Работа с константами и переменными

Часто возникает необходимость добавить к данным из базы фиксированный текст, например, префикс документа или пояснительную надпись. В языке запросов строковые литералы заключаются в двойные кавычки.

Если внутри самой строки необходимо использовать двойную кавычку, её следует экранировать путем удвоения. Это стандартное правило для большинства языков программирования, и 1С здесь не исключение.

  • 📝 Пример простого добавления текста: "Номер: " + Документ.Номер
  • 📝 Пример с экранированием: "Счет ""А"" открыт" + Счет.Наименование
  • 📝 Пример сложной конструкции: "Контрагент: " + Контрагент.Наименование + " (ИНН " + Контрагент.ИНН + ")"

Использование переменных в тексте запроса осуществляется через параметрирование. Вы передаете значение из кода 1С в запрос, а затем соединяете его с полями выборки.

ВЫБРАТЬ

&Префикс + Документы.Номер КАК ПолныйНомер

ИЗ

Документ.РеализацияТоваровУслуг КАК Документы

Здесь &Префикс — это параметр, значение которого подставляется перед выполнением запроса. Такой подход защищает от SQL-инъекций и упрощает переподготовку запроса при изменении условий.

📊 Какой способ формирования строк вы используете чаще?
Только в запросе (+)
В коде 1С (Строка())
Смешанный вариант
Использую СКД

Проблема NULL значений при соединении

Самая распространенная ошибка при работе с конкатенацией — это появление значения NULL (Неопределено) в одном из полей. В математике сложение с нулем дает исходное число, но в логике баз данных сложение строки с NULL всегда дает NULL.

Если в поле "Отчество" у сотрудника нет значения (оно пусто), то всё выражение Фамилия + " " + Имя + " " + Отчество вернет пустоту вместо ожидаемого "Иванов Иван".

Чтобы избежать этого критического поведения, необходимо явно обрабатывать возможные пустые значения. Для этого используется функция ЕСТЬNULL().

⚠️ Внимание: Если вы не обработаете NULL значения, то при наличии хотя бы одного пустого поля в цепочке сложения, итоговая строка для этой записи будет полностью потеряна (станет Неопределено).

Функция ЕСТЬNULL(Значение, Замена) проверяет первое выражение: если оно не пусто, возвращается оно; если пусто — возвращается значение замены.

ВЫБРАТЬ

Сотрудники.Фамилия

+ " "

+ Сотрудники.Имя

+ " "

+ ЕСТЬNULL(Сотрудники.Отчество, "") КАК ФИО

ИЗ

Справочник.Сотрудники КАК Сотрудники

В этом примере, если отчество не заполнено, функция подставит пустую строку "", и конкатенация пройдет успешно, просто не добавив лишнего текста.

Преобразование типов данных в строку

Часто требуется соединить строку с числом, датой или булевым значением. Язык запросов 1С пытается автоматически привести типы, но это не всегда работает предсказуемо или может привести к потере формата.

Например, при сложении строки и числа, число превратится в строку, но формат может быть нестандартным (например, потеря ведущих нулей или разделителей). Для дат автоматическое преобразование часто дает строку вида "дд.мм.гггд", что может не подходить для ваших задач.

Для надежного контроля формата рекомендуется использовать функции явного преобразования непосредственно в тексте запроса или готовить данные в временных таблицах.

  • 🔄 Для чисел: используйте СТРОКА(Число) внутри запроса, если версия платформы позволяет, или форматирование в коде.
  • 🔄 Для дат: форматирование даты в строку с нужным разделителем лучше делать через ФОРМАТ() в коде 1С перед передачей в запрос, либо использовать ГОД(), МЕСЯЦ() в запросе для сборки по частям.
  • 🔄 Для булевых значений: используйте условный оператор ЕСЛИ для подстановки текста "Да"/"Нет".

Рассмотрим пример формирования кода из года и номера документа, где важно сохранить ведущие нули в номере.

ВЫБРАТЬ

СТРОКА(Документы.Год) + "-" + Документы.НомерДокумента КАК УникальныйКод

ИЗ

РегистрСведений.АрхивДокументов КАК Документы

Нюансы функции СТРОКА() в запросе

Функция СТРОКА() доступна в запросах начиная с определенных версий платформы 1С. В старых конфигурациях может потребоваться выгрузка данных во временную таблицу и преобразование типов там.

Если автоматическое приведение типов работает некорректно в вашей версии платформы, самым надежным способом остается использование временных таблиц.

Использование временных таблиц для сложной логики

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

Этот подход позволяет разбить задачу на этапы: сначала выбрать данные, затем преобразовать типы и обработать NULL, и только в финальном запросе выполнить соединение.

⚠️ Внимание: Временные таблицы хранятся в оперативной памяти сервера 1С. При работе с огромными массивами данных (миллионы строк) это может увеличить потребление ресурсов сервера.

Алгоритм работы обычно выглядит так: создание временной таблицы с исходными данными, обновление полей в этой таблице с использованием функций 1С (не запроса), и финальная выборка.

// Шаг 1: Создание временной таблицы

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Артикул,

Номенклатура.Наименование

ПОМЕСТИТЬ ВТ_Номенклатура

ИЗ

Справочник.Номенклатура КАК Номенклатура

;

// Шаг 2: Обновление (преобразование типов, если нужно)

// (Здесь можно использовать код 1С для сложного форматирования)

// Шаг 3: Финальное соединение

ВЫБРАТЬ

ВТ_Номенклатура.Артикул + " | " + ВТ_Номенклатура.Наименование КАК ПолноеНаименование

ИЗ

ВТ_Номенклатура КАК ВТ_Номенклатура

Такой метод дает максимальную гибкость и позволяет использовать весь арсенал встроенного языка 1С для подготовки данных перед их объединением.

☑️ Оптимизация запроса на соединение строк

Выполнено: 0 / 4

Сравнение производительности методов

Выбор между соединением строк непосредственно в запросе или в коде 1С влияет на производительность системы. Передача больших объемов данных по сети между сервером и клиентом — дорогой ресурсоемкий процесс.

Выполнение конкатенации на стороне сервера баз данных (в тексте запроса) обычно быстрее, так как данные передаются уже в готовом виде. Однако сложные вычисления в запросе могут нагружать СУБД.

Ниже приведена сравнительная таблица подходов к решению задачи соединения строк.

Метод Где выполняется Нагрузка на сеть Гибкость форматов
Оператор + в запросе Сервер 1С / СУБД Минимальная Средняя
Функция СТРОКА() в запросе Сервер 1С Минимальная Высокая
Обработка в цикле (Код 1С) Клиент / Сервер приложений Высокая (передача сырых данных) Максимальная
Временные таблицы Сервер 1С Средняя Высокая

Для типовых задач отчетности и формирования печатных форм приоритет следует отдавать выполнению операций внутри запроса.

Если же требуется сложная бизнес-логика, зависящая от прав доступа или контекста сеанса, которую трудно выразить языком запросов, тогда оправдано использование обработки на уровне приложения.

💡

Золотое правило: старайтесь выполнять фильтрацию и первичное формирование данных (включая соединение строк) максимально близко к данным, то есть в запросе.

Частые ошибки и способы их устранения

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

Результатом становится слипшийся текст, который трудно читать пользователю. Всегда проверяйте результат выполнения запроса в консоли запросов перед внедрением кода в конфигурацию.

Другая ошибка — попытка соединить несовместимые типы без явного приведения. Хотя 1С часто прощает это, поведение может отличаться на разных СУБД (MSSQL, PostgreSQL, Oracle), если используется файловая или клиент-серверная версия.

⚠️ Внимание: При переходе с файловой версии 1С на клиент-серверную (SQL) некоторые неявные преобразования типов в запросах могут перестать работать или выдавать ошибки. Всегда проверяйте совместимость типов явно.

Также стоит помнить о лимите длины строки. Хотя в 1С строки динамические, при формировании огромных текстовых полей (например, сводных комментариев) можно упереться в технические ограничения длины поля в базе данных или метаданных.

Регулярное тестирование запросов на реальных данных с различными вариантами заполнения полей (пустые, длинные, специальные символы) поможет избежать проблем в промышленной эксплуатации.

💡

Используйте консоль запросов (Ctrl+Shift+F1) для быстрой отладки выражений конкатенации. Там можно сразу увидеть результат и тип получившегося поля.

Можно ли соединять более двух строк в одном выражении?

Да, оператор + является бинарным, но его можно chaining (цепочить) бесконечное количество раз: А + Б + В + Г. Ограничений на количество слагаемых в языке запросов 1С нет, кроме общих ограничений на длину строки запроса.

Что делать, если одно из полей имеет тип "Хранилище значения"?

Тип Хранилище значения нельзя напрямую соединить со строкой. Необходимо сначала извлечь данные из хранилища (обычно это делается в коде 1С, а не в запросе) или выбрать ссылку на объект, к которому относится хранилище, и работать с его строковыми реквизитами.

Влияет ли кодировка базы данных на соединение строк?

В современных версиях 1С и СУБД проблемы с кодировкой при конкатенации внутри системы встречаются крайне редко. Однако, если вы выгружаете результат запроса во внешние файлы (txt, csv), убедитесь, что сохраняется кодировка UTF-8 для корректного отображения кириллицы.

Как добавить перенос строки при соединении?

Для добавления переноса строки используйте системную константу Символы.ПС (Перевод Строки) в коде 1С, передавая её как параметр в запрос, или используйте символ Char(10) / Char(13) непосредственно в SQL-запросе, если вы работаете на уровне конкретной СУБД, но в языке запросов 1С лучше использовать параметры.