Почему текст в элементах планировщика 1С 8.3.18 обрезается и не переносится автоматически?

Программист 1С v8.3 (Управляемые формы)
← На главную

При работе с платформой 1С:Предприятие версии 8.3.18 и выше, многие пользователи и разработчики столкнулись с неожиданным изменением в поведении компонента Планировщик. Если раньше текст в элементах планировщика мог автоматически переноситься по словам, то после обновления на версию 8.3.18 он стал обрезаться по краю элемента, что значительно ухудшает читаемость и удобство использования.

В этой статье мы подробно разберем, в чем заключается проблема, выясним возможные причины такого поведения и рассмотрим различные подходы к ее решению, включая предложенный пользователями обходной путь и информацию об официальных исправлениях.

В чем суть проблемы с переносом текста в планировщике?

После перехода на версию платформы 1С 8.3.18, разработчики обратили внимание, что текст, размещенный в прямоугольных блоках элементов планировщика на форме, перестал автоматически переноситься по словам. Вместо этого, длинные текстовые строки просто обрезаются, становясь нечитаемыми. Это вызывает серьезные неудобства, особенно когда в элементы планировщика необходимо выводить значительный объем информации.

Мы, как и многие другие, можем изучить

Синтакс-Помощник (СП) по свойствам объекта Планировщик и его ЭлементаПланировщика. К сожалению, мы не обнаружим там прямых свойств или методов, которые управляли бы автоматическим переносом текста именно для элементов. Это отсутствие очевидного механизма усложняет поиск стандартного решения проблемы.

Анализируем причины изменения поведения планировщика в 1С 8.3.18

Чтобы понять, почему возникла эта проблема, давайте проанализируем изменения, внесенные в функционал планировщика в версии 8.3.18. Согласно документации и информации от разработчиков, в этой версии были значительно расширены возможности работы с планировщиком. Среди ключевых нововведений:

  1. Поддержка форматированных строк: Была добавлена возможность использовать форматированные строки в различных частях планировщика, что дает больше гибкости в оформлении текста.
  2. Произвольный набор команд-действий: Элементам стало можно назначать произвольный набор команд, что расширяет их интерактивность.
  3. Дополнительные опции оформления: Появились новые возможности по оформлению элементов, такие как рамка и ее цвет.

Эти обширные изменения, затрагивающие механизмы отрисовки и взаимодействия с элементами планировщика, по всей видимости, повлияли на алгоритмы отображения текста. Возможно, в процессе рефакторинга или добавления новой функциональности, стандартное поведение по автоматическому переносу текста в элементах было непреднамеренно изменено или вовсе отключено.

Попытки использования форматированных строк для решения проблемы

Один из первых логичных шагов, когда сталкиваешься с проблемами отображения текста, это попробовать использовать форматированные строки. Ведь если платформа поддерживает их, возможно, через них можно управлять переносом.

Мы можем попытаться задать текст элемента планировщика как форматированную строку, надеясь, что механизм форматирования учтет переносы. Однако, как показывает практика и опыт других пользователей, автоматических переносов это не дает. Если мы хотим, чтобы текст переносился, нам придется явно указывать символы переноса внутри самой форматированной строки.

Например, чтобы принудительно перенести строку, мы должны использовать специальный символ:


// Пример создания форматированной строки с явным переносом
ТекстЭлемента = Новый ФорматированнаяСтрока;
ТекстЭлемента.Добавить("Часть текста 1" + Символы.ПС + "Часть текста 2");

// Затем этот текст присваивается элементу планировщика
// ЭлементПланировщика.Текст = ТекстЭлемента;

Это означает, что нам придется вручную парсить исходные строки, определять места для переносов и вставлять Символы.ПС, что является довольно трудоемким и не всегда эстетичным решением, особенно для динамического контента.

Свойство "ТипТекстаНовыхЭлементов" и его возможное влияние

В версии 8.3.18 для реквизита формы типа "Планировщик" было реализовано новое свойство ТипТекстаНовыхЭлементов. Это свойство позволяет указать, какой тип текста (обычный или форматированный) может вводиться в новые элементы планировщика, создаваемые пользователем интерактивно.

Теоретически, можно предположить, что это свойство или связанные с ним механизмы могли бы влиять на управление переносом текста. Однако, в доступной документации и форумах нет прямых указаний на то, что изменение ТипТекстаНовыхЭлементов напрямую решает проблему автоматического переноса уже отображаемого текста. Тем не менее, при отладке и поиске решения, мы всегда можем поэкспериментировать с этим свойством, чтобы исключить его влияние.

Разбираем обходное решение: "костыль" с интервалами фона планировщика

Поскольку прямого и простого решения для автоматического переноса текста в самих элементах планировщика не нашлось, сообщество разработчиков часто прибегает к так называемым "костылям" или обходным путям. Один из таких ingenious (изобретательных) подходов был предложен пользователем и заслуживает нашего внимания.

Суть "костыля" заключается в использовании функционала интервалов фона ячеек планировщика. С версии 8.3.17 в фон ячеек планировщика стало можно выводить текст, и этот текст, что критически важно, автоматически переносится по словам. Мы можем использовать эту особенность для создания импровизированного режима просмотра длинного текста.

Пошаговая реализация обходного решения:

  1. Создаем переключатель режима просмотра: На форме, где расположен планировщик, мы можем добавить элемент управления, например, флажок (чекбокс) с надписью "Показать полный текст" или "Режим чтения". Этот флажок будет управлять переключением между режимом редактирования элементов и режимом просмотра полного текста.

  2. Обработчик изменения флажка: При изменении состояния этого флажка, мы будем выполнять следующие действия:

    
    &НаКлиенте
    Процедура ПереключательРежимаЧтенияПриИзменении(Элемент)
        Если Элементы.ПереключательРежимаЧтения.Значение Тогда
            // Активируем режим чтения
            ОтобразитьПолныйТекстВФоне();
        Иначе
            // Возвращаем обычный режим редактирования
            ОчиститьФонИОтобразитьЭлементы();
        КонецЕсли;
    КонецПроцедуры
    
  3. Функция ОтобразитьПолныйТекстВФоне():

    В этой функции мы будем делать следующее:

    1. Скрываем элементы планировщика: Чтобы текст в фоне был хорошо виден и не перекрывался элементами, мы можем временно скрыть сами элементы планировщика. Это можно сделать, установив их свойство Видимость в Ложь или, если элементы не должны быть полностью скрыты, мы можем изменить их цвет фона на прозрачный, а цвет текста на невидимый, чтобы они не мешали чтению.
    2. Очищаем существующие интервалы фона: Перед тем как добавлять новые, всегда хорошей практикой является очистка коллекции ИнтервалыФона объекта Планировщик, чтобы избежать наложения и устаревшей информации.
    3. Заполняем ИнтервалыФона: Для каждого логического события или записи, которая должна быть отображена в планировщике, мы создаем новый объект ИнтервалФонаПланировщика.
      • Устанавливаем свойства Начало и Конец, соответствующие временному интервалу, в котором должен быть показан текст.
      • Устанавливаем свойство Текст, передавая в него полную строку текста, которую мы хотим отобразить. Именно этот текст будет автоматически переноситься по словам в фоне ячейки.
      • При необходимости, устанавливаем свойства оформления, такие как ЦветФона, ЦветТекста и Шрифт, чтобы обеспечить хорошую читаемость.
    4. Добавляем созданный ИнтервалФонаПланировщика в коллекцию Планировщик.ИнтервалыФона.

    Примерный псевдокод для этой функции:

    
    &НаКлиенте
    Процедура ОтобразитьПолныйТекстВФоне()
        // Скрываем или делаем элементы планировщика невидимыми
        Для Каждого ЭлементПл Из Планировщик.Элементы Цикл
            ЭлементПл.Видимость = Ложь; // Или задаем прозрачный фон и невидимый текст
        КонецЦикла;
    
        Планировщик.ИнтервалыФона.Очистить();
    
        // Пример заполнения фона на основе данных (например, из таблицы значений)
        Для Каждого СтрокаДанных Из МоиДанныеПланировщика Цикл
            НовыйИнтервалФона = Планировщик.ИнтервалыФона.Добавить();
            НовыйИнтервалФона.Начало = СтрокаДанных.ДатаНачала;
            НовыйИнтервалФона.Конец  = СтрокаДанных.ДатаОкончания;
            НовыйИнтервалФона.Текст  = СтрокаДанных.ПолныйТекстСобытия; // Этот текст будет переноситься!
            НовыйИнтервалФона.ЦветФона = Новый Цвет(240, 240, 240); // Светло-серый фон
            НовыйИнтервалФона.ЦветТекста = Новый Цвет(0, 0, 0); // Черный текст
            // НовыйИнтервалФона.Шрифт = Новый Шрифт(...);
        КонецЦикла;
    КонецПроцедуры
    
  4. Функция ОчиститьФонИОтобразитьЭлементы():

    Эта функция возвращает планировщик в обычное состояние:

    1. Показываем элементы планировщика: Возвращаем их свойство Видимость в Истина или восстанавливаем их исходные цвета.
    2. Очищаем ИнтервалыФона: Удаляем все интервалы фона, чтобы они не мешали работе с элементами.

    Примерный псевдокод:

    
    &НаКлиенте
    Процедура ОчиститьФонИОтобразитьЭлементы()
        Для Каждого ЭлементПл Из Планировщик.Элементы Цикл
            ЭлементПл.Видимость = Истина; // Или восстанавливаем исходные стили
        КонецЦикла;
    
        Планировщик.ИнтервалыФона.Очистить();
    КонецПроцедуры
    

Таким образом, мы получаем два режима работы: режим редактирования (где элементы видны, но текст обрезается) и режим просмотра (где элементы скрыты, а читаемый, перенесенный текст отображается в фоне ячеек). Это, безусловно, "костыль", но он эффективно решает проблему читаемости длинного текста до появления официального исправления.

Официальные исправления и баг-репорты на bugboard.1c.ru

Важным источником информации о проблемах и их решениях является официальный баг-трекер 1С. В обсуждении упоминается ошибка с номером 000098200 на

bugboard.v8.1c.ru (актуальный адрес -

bugboard.1c.ru). Однако, как было отмечено одним из пользователей, это исправление касалось "Элементов измерения", а не напрямую "Элементов планировщика". Хотя это не одно и то же, есть надежда, что разработчики 1С, занимаясь похожими компонентами, могли попутно исправить и проблему с переносом текста в планировщике.

Мы настоятельно рекомендуем регулярно проверять обновления платформы 1С:Предприятие. При каждом новом релизе выпускается список изменений и исправленных ошибок. Внимательно изучайте этот список, особенно разделы, касающиеся компонента "Планировщик" или общего механизма отображения текста. Весьма вероятно, что в одной из будущих версий платформы проблема с автоматическим переносом текста в элементах планировщика будет официально исправлена, что сделает все "костыли" ненужными.

Для получения самой актуальной и подробной информации по работе с планировщиком и его свойствами, а также по вопросам, связанным с отображением текста, всегда обращайтесь к официальной документации по платформе "1С:Предприятие" соответствующей версии на сайте ИТС.

Заключение

Проблема с отсутствием автоматического переноса текста в элементах планировщика 1С, появившаяся в версии 8.3.18, является достаточно неприятной, но не безвыходной. Пока официальное исправление не будет выпущено, мы можем использовать предложенный обходной путь с интервалами фона ячеек для обеспечения читаемости длинного текста.

Продолжайте следить за обновлениями платформы и официальной документацией. Разработчики 1С постоянно улучшают платформу, и, скорее всего, эта проблема будет решена в одном из следующих релизов, что позволит нам использовать компонент "Планировщик" с полным комфортом и функциональностью.

← На главную