При переходе из среды Excel в разработку на платформе 1С:Предприятие 7.7 многие начинающие специалисты ищут привычные функции, такие как Сцепить. В 1С эта задача решается программными методами, которые на первый взгляд кажутся простыми, но таят в себе ряд технических нюансов, специфичных для "семерки". В этой статье мы разберем, как правильно склеивать текстовые данные, избегать ошибок типизации и красиво оформлять списки документов в отчетах.
Разберем самую основу. В языке программирования 1С 7.7 для соединения (конкатенации) строк используется стандартный оператор "+" (плюс). Если у нас есть две переменные с типом "Строка", мы можем просто сложить их, чтобы получить результат.
Рассмотрим пример:
Текст1 = "Номер документа: ";
Текст2 = "А-001";
Результат = Текст1 + Текст2; // Получим "Номер документа: А-001"
Проанализируем ситуацию, с которой часто сталкиваются новички. В 1С 7.7 система пытается автоматически определить тип результата выражения исходя из первого операнда. Если мы попытаемся сложить число и строку, где число стоит первым, система выдаст ошибку, так как попытается выполнить арифметическое сложение текста с числом.
Выясним причину ошибки на примере:
Количество = 10;
Текст = Количество + " штук"; // ОШИБКА! Система пытается прибавить строку к числу.
Чтобы гарантированно получить строку, мы должны "подсказать" системе, что работаем с текстом. Для этого выражение всегда следует начинать либо с функции Строка(), либо с пустых кавычек. Посмотрим на правильный вариант:
Текст = "" + Количество + " штук"; // Результат: "10 штук"
Важно: Использование "" + ... — это самый быстрый и надежный способ приведения любого значения к строковому виду в 1С 7.7.
В платформе 1С 7.7 строковые реквизиты в базе данных (например, НомерДок) часто имеют фиксированную длину. Если длина номера определена как 10 символов, а номер состоит из трех знаков ("001"), система автоматически дописывает справа 7 пробелов. Если мы просто "сцепим" такие номера, мы получим нечитаемый текст с огромными пропусками.
Для решения этой задачи проанализируем функцию СокрЛП() (Сократить Левые и Правые пробелы). Она обязательна к использованию при работе с номерами и наименованиями объектов.
Разберем по шагам правильную склейку номеров документов:
Номер1 = "001 "; // Номер в базе с пробелами
Номер2 = "002 ";
// Плохой вариант:
Результат1 = Номер1 + ", " + Номер2; // "001 , 002 "
// Хороший вариант:
Результат2 = СокрЛП(Номер1) + ", " + СокрЛП(Номер2); // "001, 002"
Поскольку в задачах часто требуется вывести фразу типа "Отгрузка по документу №123 от 01.01.2023", нам нужно научиться правильно обрабатывать тип Дата. Если просто прибавить дату к строке, 1С 7.7 выдаст ее в стандартном системном формате, который не всегда подходит для отчета.
Рассмотрим использование функции Формат() для управления видом даты:
ДатаДок = ТекущаяДата();
// Простой вариант (зависит от настроек Windows):
Текст = "от " + Строка(ДатаДок);
// Профессиональный вариант с жестким форматом:
Текст = "от " + Формат(ДатаДок, "Д ДДММГГГГ"); // Выведет: "от 25.10.2023"
Рассмотрим более сложную и частую задачу: нам нужно перебрать все документы в цикле и составить из их номеров одну длинную строку для вывода в отчет. Главная проблема здесь — не поставить лишнюю запятую в самом начале или в самом конце списка.
Проанализируем изящное решение с использованием тернарного оператора ?():
СписокНомеров = "";
Док = СоздатьОбъект("Документ.Реализация");
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
// Если СписокНомеров еще пуст, добавляем пустую строку, иначе — добавляем запятую
Разделитель = ?(ПустаяСтрока(СписокНомеров) = 1, "", ", ");
СписокНомеров = СписокНомеров + Разделитель + СокрЛП(Док.НомерДок);
КонецЦикла;
Этот алгоритм позволяет сформировать красивый список "№1, №2, №3" без лишних знаков препинания.
Если вы планируете хранить результат сцепления строк в ТаблицеЗначений (как упоминалось в обсуждении на форуме), обратите внимание на определение колонок. В 1С 7.7 колонки ТЗ могут быть типизированными. Если колонке задана ограниченная длина, ваш сцепленный текст будет безвозвратно обрезан.
Рассмотрим, как правильно создать колонку для неограниченного текста:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
// Если указать просто "Строка", длина может быть ограничена
// Для длинных списков документов указываем тип "Строка" без указания длины:
ТЗ.НоваяКолонка("СписокДокументов", "Строка");
Теперь в ячейку этой колонки можно записывать строки практически любой длины, что критично для формирования сложных аналитических отчетов.
Иногда список документов получается настолько длинным, что он не помещается в ширину одной ячейки отчета. В этом случае мы можем использовать системную константу РазделительСтрок. Это позволит нам "сцепить" строки так, чтобы в печатной форме они располагались друг под другом внутри одной ячейки.
Посмотрим на пример:
ТекстСообщения = "Документы отгрузки:" + РазделительСтрок;
ТекстСообщения = ТекстСообщения + "1. " + СокрЛП(Док1.НомерДок) + РазделительСтрок;
ТекстСообщения = ТекстСообщения + "2. " + СокрЛП(Док2.НомерДок);
// В итоге получим текст в три строки
Для того чтобы ваша работа с текстовыми данными была максимально эффективной, полезно знать еще несколько функций:
СтрЗаменить(Стр, Что, НаЧто) — незаменима, если вы уже "сцепили" строку, но решили изменить разделитель (например, заменить запятые на точки с запятой).ВРег(Стр) и НРег(Стр) — приведение всей сцепленной строки к верхнему или нижнему регистру для единообразия в отчете.Лев(Стр, Колво) — если результирующая строка получилась слишком длинной, ее можно принудительно обрезать перед выводом.Подводя итог, можно сказать, что хотя в 1С 7.7 нет прямой функции с названием "Сцепить", связка оператора "+" с функциями СокрЛП(), Формат() и ?() дает разработчику гораздо более гибкий инструмент для формирования любых текстовых представлений данных.