Разработка и Конфигурация · 9 мин
Как объединить два поля в 1С
Способы объединить два поля в 1С: конкатенация в запросе, вычисляемые поля СКД, объединение на форме и в печатных формах. Примеры кода и типичные ошибки.
Задача объединить два поля в одно возникает в 1С постоянно: склеить фамилию и имя в ФИО, собрать полный адрес из индекса, города и улицы, вывести в отчёте номенклатуру вместе с артикулом. Способ решения зависит от того, где нужен результат — в запросе, в отчёте на СКД, на форме, в печатной форме или в самих данных справочника.
Важно сразу разделить два сценария. Первый — объединение «на лету», когда исходные поля остаются как есть, а склеенное значение формируется только при выводе. Второй — физическое объединение данных, когда в базе создаётся новый реквизит и в него записывается результат. Первый сценарий безопасен и обратим, второй меняет данные и требует резервной копии.
Ниже разобраны все основные способы с примерами кода, условиями выбора и типичными ошибками. Материал применим к конфигурациям на управляемых и обычных формах — синтаксис языка и запросов одинаков.
Как выбрать способ объединения полей
Прежде чем писать код, ответьте на два вопроса: где должен появиться результат и нужно ли его хранить. Если склеенное значение требуется только в отчёте или на экране — не трогайте данные, используйте вычисляемое поле. Если объединённое значение должно участвовать в поиске, обмене или печати как самостоятельный реквизит — потребуется изменение структуры или заполнение существующего поля.
Отдельный случай — объединение при выгрузке во внешние системы. Здесь склейку обычно делают в запросе или в коде обмена, чтобы не менять ни отчёты, ни данные.
Как выбрать действие
Объединение полей в запросе через конкатенацию
В языке запросов 1С строки склеиваются оператором «+». Типичный пример — сборка ФИО из трёх полей с пробелами:
ВЫБРАТЬ
Сотрудники.Фамилия + " " + Сотрудники.Имя + " " + Сотрудники.Отчество КАК ФИО
ИЗ
Справочник.Сотрудники КАК Сотрудники
Главное ограничение: оператор «+» в запросе работает только со строками. Если одно из полей — число, дата или ссылка, запрос выдаст ошибку «Несовместимые типы». Такие значения нужно либо приводить к строке в коде после выполнения запроса, либо выбирать их отдельными полями и склеивать при обходе результата.
Вторая тонкость — значение NULL. Если объединяете поля из левого соединения и одно из них может отсутствовать, результат конкатенации станет NULL, а не строкой с пустой частью. Обработайте это через ЕСТЬNULL:
ВЫБРАТЬ
ЕСТЬNULL(Контрагенты.Наименование, "") + " (" + ЕСТЬNULL(Контрагенты.ИНН, "") + ")" КАК Представление
ИЗ
Справочник.Контрагенты КАК Контрагенты
Объединение полей в отчёте на СКД
В системе компоновки данных есть два пути. Первый — та же конкатенация в запросе набора данных, как описано выше. Второй — вычисляемое поле на закладке «Вычисляемые поля» схемы компоновки. Второй вариант удобнее, когда запрос менять нежелательно: например, он типовой, а отчёт дорабатывается через расширение.
Для вычисляемого поля укажите выражение на языке выражений СКД. Здесь доступна конкатенация через «+» и приведение типов функцией СТРОКА():
СТРОКА(Номенклатура.Артикул) + " — " + Номенклатура.Наименование
После добавления вычисляемого поля не забудьте включить его в настройки отчёта: на закладке «Настройки» перетащите поле в выбранные поля нужной группировки. Частая причина «поле не появилось в отчёте» — именно пропущенный шаг с настройками.
Объединение ресурсов и итогов
Если склеенное поле должно корректно сворачиваться в итогах, проверьте выражение агрегации. Для строк обычно используют МАКСИМУМ() или МИНИМУМ(), иначе в итоговой строке появится пустое значение.
Объединение полей в коде и на форме
В модуле объекта или формы строки склеиваются тем же оператором «+», а для нестроковых значений используется функция Строка() или форматирование через Формат():
ПолноеПредставление = СокрЛП(Объект.Фамилия) + " " + СокрЛП(Объект.Имя);
СуммаПрописью = "Итого: " + Формат(Объект.Сумма, "ЧДЦ=2") + " руб.";
Для отображения на управляемой форме без хранения данных удобно добавить реквизит формы строкового типа и заполнять его в обработчиках ПриСозданииНаСервере и ПриИзменении исходных полей. Так склеенное значение всегда актуально и не попадает в базу данных.
Для длинных составных строк вместо цепочки «+» используйте СтрШаблон — код читается легче и меньше риск потерять пробел или разделитель:
Адрес = СтрШаблон("%1, %2, %3", Индекс, Город, Улица);
Перед склейкой всегда оборачивайте строковые реквизиты в СокрЛП — в справочниках часто встречаются хвостовые пробелы, которые портят вид объединённой строки.
Постоянное объединение: новый реквизит и заполнение данных
Когда объединённое значение должно храниться в базе — например, единое поле «Полный адрес» для выгрузки на сайт — добавьте новый реквизит в справочник или документ через конфигуратор и заполните его обработкой. Минимальный код обхода:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Город, Улица ИЗ Справочник.Контрагенты");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.ПолныйАдрес = СокрЛП(Выборка.Город) + ", " + СокрЛП(Выборка.Улица);
Объект.Записать();
КонецЦикла;
На больших объёмах записывайте объекты порциями и в транзакции, а для справочников с сотнями тысяч элементов рассмотрите обмен через промежуточную таблицу. Перед массовой обработкой обязательно сделайте резервную копию или хотя бы выгрузку затрагиваемого справочника.
Объединение полей в печатных формах и при обмене
В макетах печатных форм склейку обычно делают до вывода: в коде формирования печатной формы собирают строку и помещают её в параметр области. Это надёжнее, чем пытаться объединять значения прямо в тексте макета, где доступны только параметры.
При обмене данными (правила конвертации, обмен с сайтом, выгрузка в Excel) объединение выполняют в запросе-источнике или в обработчике перед выгрузкой. Принцип тот же: исходные поля остаются нетронутыми, склеенное значение формируется только в момент передачи.
Проверка результата
После внедрения любого способа проверьте объединение на граничных случаях: пустое второе поле, значения с лишними пробелами, максимально длинные строки, записи из левого соединения без связанных данных. Убедитесь, что длина результата не превышает ограничение реквизита, если значение сохраняется в базу, — лишнее будет молча обрезано.
Для отчётов дополнительно проверьте групповые итоги и выгрузку в Excel: иногда склеенное поле корректно на экране, но ломает структуру при выгрузке из-за переносов строк в исходных данных.
Как проверить результат
Поля разделены пробелом или разделителем, нет двойных пробелов
Слитный текст, лишние пробелы или обрезанный конец
Строка содержит только заполненную часть без висящего разделителя
Пустая строка, NULL или запятая без значения
В итоговой строке осмысленное значение
Пустая ячейка в итогах
Что важно запомнить
Для вывода используйте конкатенацию в запросе или вычисляемое поле СКД, для хранения — новый реквизит с заполнением обработкой. Всегда учитывайте типы данных, NULL и длину результата, а массовые изменения данных делайте только после резервной копии.
Частые вопросы
Можно ли объединить поля разных типов, например строку и число?
В запросе напрямую нельзя — будет ошибка несовместимых типов. В коде используйте Строка(Число) или Формат(Число, "ЧДЦ=2"), а в вычисляемых полях СКД — функцию СТРОКА().
Как объединить поля с переносом строки?
Используйте символ переноса через Символы.ПС в коде: Поле1 + Символы.ПС + Поле2. Учтите, что в некоторых отчётах и при выгрузке в Excel переносы могут отображаться некорректно.
Обрежется ли результат, если реквизит имеет ограничение длины?
Да. Если вы записываете склеенное значение в строковый реквизит с фиксированной длиной, лишние символы будут отброшены без предупреждения. Проверяйте длину через СтрДлина() перед записью.
Как объединить поля без изменения конфигурации?
Используйте внешнюю обработку, произвольный отчёт на СКД с вычисляемым полем или консоль запросов. Всё это не требует доработки конфигурации и снятия её с поддержки.
Почему в результате конкатенации пусто, хотя одно поле заполнено?
Скорее всего, второе поле содержит NULL — типично для левых соединений. Обработайте оба поля функцией ЕСТЬNULL(Поле, "") и результат появится.
Как объединить поля в динамическом списке формы?
Динамический список строится на запросе — добавьте конкатенацию прямо в текст запроса списка и выведите новую колонку в таблицу формы. Исходные поля при этом можно оставить скрытыми.