В процессе разработки печатных форм в среде 1С:Предприятие 7.7 программисты часто сталкиваются с досадной особенностью платформы: если в макете ячейка имеет тип заполнения Выражение или Шаблон, и результатом вычисления является пустая строка "", система автоматически подставляет в готовую таблицу одиночный пробел " ". В большинстве случаев это незаметно, однако при использовании специфических шрифтов, например, для формирования штрихкодов, этот лишний символ становится критической проблемой. В таких шрифтах пробел часто имеет свое графическое начертание, что приводит к появлению «лишних палочек» там, где их быть не должно.
Разберем подробно причины этого поведения и проанализируем наиболее эффективные методы борьбы с «магическим» пробелом в 1С 7.7.
Выясним причину такого поведения движка табличных документов. Платформа 1С 7.7 при выполнении метода ВывестиСекцию() обрабатывает все параметры. Если значение параметра неопределено или является пустой строкой, ядро системы принудительно вставляет пробел. Это было реализовано для того, чтобы ячейка сохраняла параметры форматирования (рамки, цвет фона, шрифт) и корректно отрисовывалась в сетке документа. К сожалению, штатной настройки, отключающей это поведение, не существует, поэтому нам придется использовать программные методы обхода.
Рассмотрим самый быстрый и точечный метод. Вместо того чтобы полагаться на автоматическое заполнение ячейки через механизм макета, мы можем программно перезаписать содержимое ячейки сразу после того, как секция была добавлена в итоговую таблицу. Для этого в макете ячейку можно оставить пустой (тип Текст) или же оставить Выражение, но дополнить код в модуле.
Проанализируем пример кода:
// Выводим секцию в таблицу
Таб.ВывестиСекцию("СтрокаШтрихкода");
// Обращаемся к текущей выведенной области
// Предположим, штрихкод находится в 5-й колонке
Если ПустаяСтрока(ТекШтрихкод) = 1 Тогда
Таб.Область(Таб.ВысотаТаблицы(), 5).Текст = "";
КонецЕсли;
В данном примере мы используем метод ВысотаТаблицы(), чтобы найти последнюю добавленную строку, и метод Область() для доступа к конкретной ячейке. Прямое присвоение свойства Текст = "" игнорирует стандартный механизм подстановки пробелов и оставляет ячейку действительно пустой.
Если в вашем отчете или печатной форме много полей, которые могут содержать пустые значения, и вы не хотите прописывать условие для каждой ячейки, можно применить «ковровую» очистку. Посмотрим, как реализовать цикл по всей сформированной таблице перед её показом пользователю.
Рассмотрим вариант реализации с использованием функций ВысотаТаблицы() и ШиринаТаблицы():
Для ТекСтр = 1 По ПечТаб.ВысотаТаблицы() Цикл
Для ТекКол = 1 По ПечТаб.ШиринаТаблицы() Цикл
// Проверяем, содержит ли ячейка ровно один пробел
Если ПечТаб.Область(ТекСтр, ТекКол).Текст = " " Тогда
ПечТаб.Область(ТекСтр, ТекКол).Текст = "";
КонецЕсли;
КонецЦикла;
КонецЦикла;
Важный нюанс: если таблица очень большая (тысячи строк), такой перебор может вызвать задержку в работе. Чтобы ускорить процесс, рекомендуется на время выполнения цикла перевести таблицу в режим без перерисовки или использовать методы оптимизации доступа к областям.
Проанализируем ситуацию, когда мы не хотим писать много программного кода. Мы можем создать в макете две идентичные секции: одну с полем для штрихкода (где задано выражение), а вторую — абсолютно пустую на месте штрихкода. В коде формирования печатной формы мы просто будем выбирать, какую именно секцию выводить.
Пример логики:
Если ПустоеЗначение(ЗначениеШтрихкода) = 0 Тогда
// Выводим секцию, где ячейка настроена под шрифт штрихкода
Таб.ВывестиСекцию("СекцияСКодом");
Иначе
// Выводим секцию, где на этом месте просто пустая текстовая ячейка
Таб.ВывестиСекцию("СекцияБезКода");
КонецЕсли;
Этот метод считается самым «чистым» с точки зрения работы платформы, так как мы не вмешиваемся в уже сформированный документ, а управляем выводом на этапе его создания. Единственный минус — необходимость поддерживать актуальность двух одинаковых областей в макете при внесении изменений в дизайн.
Если ваша задача требует профессиональной работы с табличными документами и вы хотите навсегда забыть об ограничениях движка 7.7, стоит обратить внимание на проект Йоксель (Yoksel). Это внешняя компонента, которая заменяет штатный механизм вывода таблиц. Она корректно работает с пустыми строками, не подставляет лишних символов и предоставляет гораздо более широкие возможности по управлению свойствами ячеек и экспорту документов.
При использовании Йоксель работа с текстом выглядит так же просто, но результат будет гарантированно соответствовать переданному значению переменной без вмешательства «интеллектуальных» алгоритмов 1С.
Посмотрим на несколько технических советов, которые помогут сделать решение более надежным:
Формат(Значение, "С0") в самом выражении ячейки. К сожалению, для строковых пустых значений в 1С 7.7 это чаще всего не помогает — платформа все равно видит пустой результат и заменяет его пробелом.ТолькоПросмотр(1). Всегда проверяйте финальный результат в режиме предварительного просмотра печати, так как именно там «вылезают» все артефакты форматирования.ActiveX объект, проблема с пробелом исчезает сама собой. В этом случае вы просто управляете видимостью объекта через Объект.Видимость(0), если данных для кодирования нет.Подводя итог, можно сказать: несмотря на то, что подстановка пробела является встроенным багом (или особенностью) платформы 1С 7.7, она легко обходится либо прямой очисткой Область.Текст, либо грамотным проектированием макета с разделением секций. Выбор метода зависит от сложности вашего отчета и требований к производительности.