Разработчики, работающие с платформой 1С:Предприятие 7.7, рано или поздно сталкиваются с удивительным и на первый взгляд необъяснимым феноменом. Если на форме разместить элемент типа Текст и в его свойствах прописать строку, начинающуюся со строчной (маленькой) буквы я, то при запуске программы в режиме «Предприятие» этот текст просто исчезнет. Элемент станет абсолютно пустым, хотя в конфигураторе все выглядит корректно. Рассмотрим подробнее, почему это происходит, разберем техническую подоплеку и выясним, какие существуют способы решения этой исторической проблемы.
Для того чтобы понять природу этого «глюка», нам необходимо заглянуть во внутреннее устройство платформы и вспомнить особенности кодировки символов. Платформа 1С 7.7 была разработана в эпоху доминирования однобайтовых кодировок, в частности, для русского языка использовалась кодировка Windows-1251.
Проанализируем таблицу символов: в кодировке Windows-1251 строчная буква я занимает последнюю позицию и имеет десятичный код 255, что в шестнадцатеричной системе счисления соответствует значению 0xFF.
Выясним, как это влияет на работу программы. Движок 1С:Предприятие 7.7 написан на языке программирования C++. В этом языке тип данных char (используемый для хранения символов) по умолчанию часто интерпретируется как signed char (знаковое целое число). В такой реализации значение 255 преобразуется в -1. В стандартных библиотеках C++ значение -1 зарезервировано для константы EOF (End Of File), которая сигнализирует о конце файла или завершении потока данных.
Таким образом, когда парсер 1С или стандартная функция отрисовки текста Windows встречает байт 0xFF в самом начале строки, срабатывает ошибочное условие: система «думает», что строка закончилась, еще даже не начавшись. В результате обработка текста прекращается, и пользователь видит пустую область вместо ожидаемого слова «яблоко» или «ящик».
Самый простой и распространенный метод обхода данной ошибки — это добавление обычного пробела перед текстом. Рассмотрим, как это работает на практике. Если мы напишем не яблоко, а яблоко, то первым символом в строке станет пробел (код 32). Система успешно считает его, поймет, что строка не пуста, и перейдет к следующему символу. Поскольку буква я окажется уже не в первой позиции, проверка на «конец данных» не сработает критическим образом для всей строки.
Визуально лишний пробел в начале текстовой метки на форме обычно не портит интерфейс, так как элементы управления часто имеют поля (отступы).
Разберем еще один вариант решения. В отличие от строчной я, заглавная буква Я имеет в кодировке Windows-1251 код 223 (0xDF). Это значение не вызывает конфликтов с системными константами типа EOF. Поэтому, если требования к интерфейсу позволяют, можно просто заменить первую букву на прописную. Например, вместо ячейка №5 написать Ячейка №5. Это полностью решает проблему отображения без использования дополнительных символов.
Иногда возникают ситуации, когда текст должен начинаться именно с маленькой буквы, а лишний пробел недопустим (например, при формировании строгих отчетов или специфических заголовков). В этом случае проанализируем возможность программного вывода данных.
Если в конфигураторе в поле Текст элемента формы не вписывать статичную строку, а указать идентификатор переменной или вызвать функцию, баг может проявляться иначе или обходиться. Рассмотрим пример использования формулы:
ПолучитьЗаголовок().
Функция ПолучитьЗаголовок()
Возврат "яблоко сорта Антоновка";
КонецФункции
Хотя этот метод не всегда гарантирует 100% результат (так как ошибка сидит глубоко в методах отрисовки), он часто помогает, если добавить к возвращаемому значению пустую строку или использовать специальные функции обработки строк.
Посмотрим на пример управления текстом через атрибуты формы в программном коде. Если у элемента формы задан идентификатор (например, ТекстСтатус), мы можем установить его значение в процедуре ПриОткрытии():
Процедура ПриОткрытии()
Форма.ТекстСтатус.Заголовок = "якорная стоянка разрешена";
// Если текст все равно пропадает, используем хитрость с невидимым символом
Форма.ТекстСтатус.Заголовок = "" + "якорная стоянка";
КонецПроцедуры
Интересно, что конкатенация (сложение строк) с пустой строкой в начале иногда позволяет «обмануть» внутренние механизмы платформы, которые передают данные в системные API Windows.
Проанализируем другие области платформы 7.7, где буква я может доставить неприятности. Это не только текстовые поля на формах:
я, может не отображаться. Решение аналогичное — пробел или заглавная буква.я, система может некорректно позиционироваться на нужной записи.я. Это может привести к трудноуловимым ошибкам при компиляции конфигурации или работе внешних компонент.Выясним, почему в версиях 8.0, 8.1, 8.2 и 8.3 мы больше не встречаем подобных проблем. Ответ прост: переход на Unicode (UTF-16). В системе Unicode каждый символ кодируется не одним, а двумя байтами. Буква я там имеет код 0x044F. Как мы видим, это значение никак не пересекается с техническим маркером 0xFF (-1). Более того, современные механизмы отрисовки текста в 1С 8.x построены на совершенно иных принципах, которые изначально рассчитаны на многоязыковую поддержку и корректную обработку любых символов алфавита.
Важный итог: если вы продолжаете поддерживать или разрабатывать системы на платформе 7.7, всегда держите в уме «правило буквы я». Это сэкономит вам немало времени при отладке интерфейсов. Используйте заглавные буквы для заголовков или добавляйте лидирующий пробел в тех местах, где визуальная безупречность менее важна, чем корректное отображение информации.