Разберем нестандартную ситуацию, с которой часто сталкивались разработчики и пользователи устаревших систем. Представим, что мы заводим элемент в любом справочнике (например, в справочнике номенклатуры) и добавляем перед самим наименованием ведущий пробел. Записываем элемент, выбираем его в документ, и видим, что в самом документе элемент отображается уже без пробела. При этом добраться до наименования с пробелом через встроенный язык (через точку или функцию СоздатьОбъект) никак не получается. Проанализируем причину такого поведения и рассмотрим рабочие варианты решения этой задачи.
Выясним техническую особенность платформы 1С:Предприятие 7.7. Поведение с автоматическим удалением пробелов — это известная аппаратная специфика (многие специалисты считают её неисправимым багом) именно этой версии системы. При программном или визуальном обращении к стандартному реквизиту Наименование платформа принудительно возвращает строку с усеченными пробелами в начале и в конце.
Более того, посмотрим на код типовых конфигураций: практически вся бизнес-логика усыпана вызовами функции СокрЛП(), которая дополнительно «срезает» все пробелы при формировании печатных форм, отчетов и представлений списков. При этом важно отметить, что эта обрезка характерна исключительно для стандартного наименования элемента.
Проанализируем, для чего клиентам вообще может потребоваться добавление пробела в начало строки. Основная цель — управление сортировкой. Клиентам ведущий пробел обычно требуется для того, чтобы при сортировке по алфавиту определенные (наиболее важные или часто используемые) элементы справочника гарантированно поднимались в самый верх списка.
В 1С 7.7 это особенно актуально не только для удобного визуального отображения в диалоговых окнах, но и для программной логики. При выполнении сортировки объекта ТаблицаЗначений по колонке, содержащей элементы справочника, платформа сортирует их именно по их основному строковому представлению.
Рассмотрим наиболее корректный с точки зрения архитектуры способ. Поскольку платформа жестко урезает только стандартное Наименование, мы можем обойти это ограничение, создав собственный реквизит.
НаименованиеДляОтображения.Этот способ позволяет избежать конфликтов с базовыми механизмами платформы, так как пользовательские строковые реквизиты не подвергаются принудительной обрезке системой.
Посмотрим на второй метод, который можно применить, если добавлять новые реквизиты в конфигурацию нецелесообразно. Мы можем использовать специальный символ — неразрывный пробел. Напишем код для присвоения такого наименования:
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.Новый();
Спр.Наименование = Симв(160) + "Особый товар";
Спр.Записать();
Разберем по шагам, почему этот трюк работает. Неразрывный пробел (в ASCII-таблице символов имеет код 160) помогает обойти ограничения движка по двум причинам:
СокрЛП() запрограммирована очищать строку только от стандартных пробелов (с кодом 32) и базовых управляющих спецсимволов. Символ 160 ею игнорируется, поэтому он благополучно «выживает» во всех отчетах и формах.Проанализируем возможные последствия применения второго решения (с символом 160), так как они могут оказаться критичными для бизнес-процессов.
Проблемы с поиском: При ручном поиске элемента в справочнике пользователь будет вводить с клавиатуры обычный пробел, в то время как в базе записан неразрывный. Из-за этого быстрый поиск по строке просто не сработает.
Сбои в интеграциях: Использование спецсимволов часто ломает внешние обмены данными. Зачастую наименования используются для выгрузки данных во внешние системы (например, системы "Клиент-Банк" или различные EDI-системы). Внешние программы ожидают точное совпадение строки или обычный текстовый формат, а получают неизвестный им код 160. Это гарантированно приводит к ошибкам при загрузке банковских выписок, накладных и счетов.
Подводя итог, настоятельно рекомендуем выяснить истинную потребность клиента перед реализацией подобных обходных путей. Если пробел нужен только для сортировки списков, лучше использовать специализированные числовые реквизиты для задания приоритета вывода (например, реквизит ПорядокСортировки), оставляя сами наименования в их естественном виде без спецсимволов.