При повседневной работе со справочником Номенклатура пользователи и администраторы иногда сталкиваются с неожиданным поведением системы: реквизит (например, Артикул) четко виден в карточке элемента и отображается в нижней информационной строке состояния, однако в таблице формы списка соответствующая ячейка остается абсолютно пустой. При этом тестирование и исправление информационной базы не выявляет логических или структурных нарушений, а ручной ввод простых тестовых значений (таких как «123») сразу выводит строку в списке корректно.
Разберем по шагам, почему возникает такой эффект, как быстро исправить проблемную позицию и как защитить базу данных от подобных сбоев при импорте или копировании данных.
Проанализируем ситуацию с точки зрения архитектуры платформы 1С:Предприятие 7.7:
CR / LF, коды ASCII 13 и 10), таблица отображает именно первую, пустую строку. В то же время поле ввода карточки или строка подсказки могут игнорировать этот перевод либо визуализировать его без потери текста.NBSP, код ASCII 160) или группы пробелов в начале строки сдвигает видимый текст вправо за пределы установленной ширины колонки «Артикул».Если проблема носит единичный характер и проявилась на одной или нескольких позициях, выясним причину и исправим её непосредственно в интерфейсе программы:
Артикул и нажмем клавишу Home, чтобы переместиться в самое начало строки.Когда визуально сложно понять, какой именно символ мешает отрисовке, воспользуемся внешним редактором:
Артикул в 1С.Рассмотрим подробнее программные методы защиты. Стандартная системная функция СокрЛП() отсекает только обычные пробелы (ASCII-код 32). Символы перевода строк (коды 10 и 13), табуляцию (код 9) и неразрывный пробел (код 160) данная функция не удаляет.
Чтобы избежать подобных ошибок при интерактивной работе или загрузке номенклатуры из прайс-листов, добавим процедуру очистки реквизита в модуль формы элемента или в модуль объекта при записи:
Процедура ПриЗаписи()
// Удаляем переводы строк и возвраты каретки
Артикул = СтрЗаменить(Артикул, Симв(10), "");
Артикул = СтрЗаменить(Артикул, Симв(13), "");
// Заменяем неразрывный пробел на стандартный
Артикул = СтрЗаменить(Артикул, Симв(160), " ");
// Удаляем табуляцию
Артикул = СтрЗаменить(Артикул, Симв(9), "");
// Удаляем стандартные ведущие и концевые пробелы
Артикул = СокрЛП(Артикул);
КонецПроцедуры
Посмотрим на пример универсальной функции, которую можно поместить в глобальный модуль конфигурации для обработки любых строковых реквизитов перед их сохранением в базу данных:
Функция ОчиститьСтрокуОтСпецсимволов(ВхСтрока) Экспорт
Перем ТекСтрока, Поз, ТекКод;
ТекСтрока = ВхСтрока;
// Очищаем служебные символы с кодами от 0 до 31
Для Поз = 0 По 31 Цикл
ТекСтрока = СтрЗаменить(ТекСтрока, Симв(Поз), "");
КонецЦикла;
// Устраняем неразрывный пробел
ТекСтрока = СтрЗаменить(ТекСтрока, Симв(160), " ");
Возврат СокрЛП(ТекСтрока);
КонецФункции
Применение такой нормализации строк гарантирует, что данные будут корректно отображаться во всех таблицах, отчетах и формах списков конфигурации независимо от источника копирования.