Как программно обвести рисунок в табличном документе 1С?

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

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

Анализ основной проблемы: почему возникает ошибка?

Рассмотрим типичную ситуацию: вы программно обращаетесь к рисунку в табличном документе и пытаетесь изменить его рамку. Код может выглядеть следующим образом:


ТабДокумент.Рисунки.Станок1.Линия.ТипЛинии = ТипЛинииРисункаТабличногоДокумента.Сплошная;

При выполнении этого кода система выдаст ошибку: «Поле объекта недоступно для записи (ТипЛинии)». Выясним причину такого поведения платформы. В системе 1С:Предприятие объекты типа Линия, Шрифт и Цвет являются неизменяемыми (immutable) после их создания. Это означает, что вы не можете зайти «внутрь» существующего объекта линии и поменять только одно его свойство. Чтобы изменить вид линии, необходимо создать новый объект Линия с нужными параметрами и целиком присвоить его соответствующему свойству рисунка.

Правильный способ установки обводки через создание нового объекта

Проанализируем верный алгоритм действий. Если нам нужно обвести рисунок (например, изображение станка на схеме), мы должны сконструировать новую линию. Для этого используется конструктор Новый Линия, который принимает в качестве параметров тип линии и её толщину.

Посмотрим на пример правильного кода:


// Устанавливаем новый тип линии (сплошная, толщина 2)
НоваяЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2);
ТабДокумент.Рисунки.Станок1.Линия = НоваяЛиния;

// Теперь можно установить цвет этой линии (свойство ЦветЛинии доступно для записи напрямую)
ТабДокумент.Рисунки.Станок1.ЦветЛинии = WebЦвета.Кремовый;

Обратите внимание: свойство ЦветЛинии принадлежит самому объекту РисунокТабличногоДокумента, а не объекту Линия, поэтому его можно менять динамически без пересоздания всей рамки.

Управление видимостью границ рисунка

Иногда простого назначения линии недостаточно. В макетах 1С у рисунка могут быть отключены флаги отображения сторон. Даже если вы программно зададите самую толстую линию, она не появится, пока вы не укажете, какие именно стороны рамки должны быть видны. Разберем, как включить полную обводку рисунка по всем четырем сторонам.

Для этого используются булевы свойства рисунка:

  1. ГраницаСверху — включает или отключает верхнюю линию.
  2. ГраницаСнизу — отвечает за нижнюю границу.
  3. ГраницаСлева — управляет левой стороной.
  4. ГраницаСправа — управляет правой стороной.

Пример кода для гарантированного отображения рамки:


ОбъектРисунок = ТабДокумент.Рисунки.Станок1;
ОбъектРисунок.ГраницаСверху = Истина;
ОбъектРисунок.ГраницаСнизу  = Истина;
ОбъектРисунок.ГраницаСлева  = Истина;
ОбъектРисунок.ГраницаСправа = Истина;

Этот метод особенно удобен для реализации интерактивности. Например, когда пользователь выбирает станок на карте, мы можем просто включать или выключать эти границы, не меняя сам объект Линия.

Альтернативный метод: использование заливки фона

Если задача стоит в том, чтобы сделать объект заметным, но возиться с границами не хочется, можно воспользоваться свойством ЦветФона. Это отлично работает для изображений с прозрачностью (например, в формате .gif или .png). Если у картинки есть прозрачные области, закрашивание фона создаст эффект «подсвечивания» объекта.

Рассмотрим пример кода:


// Выделяем рисунок ярким фоном
ТабДокумент.Рисунки.Станок1.ЦветФона = WebЦвета.КрасноФиолетовый;

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

Работа со слоями и порядком отображения

При динамическом выделении рисунков важно учитывать их взаимное расположение (Z-порядок). Если на вашей карте рисунки расположены плотно или перекрывают друг друга, обводка выделенного элемента может оказаться «под» соседним рисунком. Чтобы этого избежать, используем методы управления порядком.

Выясним, как вывести выделенный станок на передний план:


// Помещаем рисунок поверх всех остальных элементов
ТабДокумент.Рисунки.Станок1.УстановитьПорядок(ПорядокРисунковТабличногоДокумента.ПередВсеми);

Это гарантирует, что установленная нами рамка или цвет фона будут полностью видны пользователю и не перекроются другими графическими объектами.

Резюме и рекомендации

Подводя итог, проанализируем основные шаги для реализации качественной обводки в табличном документе:

  1. Не пытайтесь менять свойства внутри линии. Всегда создавайте Новый Линия(...).
  2. Проверяйте видимость сторон. Используйте свойства ГраницаСверху, ГраницаСнизу и другие, чтобы активировать рамку.
  3. Используйте ЦветЛинии отдельно. После того как объект Линия назначен, цвет можно менять в любой момент без лишних затрат ресурсов.
  4. Рассмотрите заливку. Для интерактивных карт выделение цветом фона часто эффективнее обводки.
  5. Следите за порядком. Метод УстановитьПорядок поможет сделать активный элемент самым заметным.

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

← На главную