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

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

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

Ограничение платформы: почему нельзя изменить курсор напрямую

Начнем с анализа базовых возможностей встроенного языка. В платформе 1С:Предприятие 8 объект ТабличныйДокумент (Spreadsheet Document) не обладает свойством, позволяющим программно управлять формой указателя мыши. Вид курсора жестко зашит в логику работы платформы и меняется автоматически в зависимости от контекста:

  1. При наведении на ячейку — стандартная стрелка или крестик.
  2. При наведении на границу колонок или строк — двусторонняя стрелка изменения размера.
  3. При наведении на гиперссылку — «указательный палец».
  4. В режиме интерактивного рисования (через меню «Таблица — Рисунки») — большой крест.

Проблема заключается в том, что режим рисования активируется внутренней командой платформы, которая не имеет эквивалента во встроенном языке. Мы не можем вызвать метод типа ТабДок.УстановитьРежимРисования(ТипРисунка.Прямоугольник), чтобы заставить систему вести себя так, будто пользователь нажал кнопку в меню.

Кроме того, ТабличныйДокумент крайне ограничен в обработке событий мыши. У него отсутствуют события OnMouseMove (перемещение мыши) или OnMouseDown (нажатие кнопки мыши). Без этих событий даже изменение вида курсора не позволило бы реализовать полноценное «рисование» (когда фигура тянется за мышкой), так как код 1С просто не будет знать текущие координаты указателя в реальном времени.

Решение №1: Программное добавление рисунков

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


// Создаем новый рисунок в табличном документе
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);

// Устанавливаем координаты и размеры (в мм)
НовыйРисунок.Верх = 10;
НовыйРисунок.Лево = 10;
НовыйРисунок.Ширина = 50;
НовыйРисунок.Высота = 30;

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

В контексте создания редактора графов через контекстное меню (как хотел автор вопроса), мы можем предложить пользователю следующий алгоритм:

  1. Пользователь выделяет область ячеек в документе (это штатное действие, не требующее смены курсора).
  2. Пользователь вызывает контекстное меню и выбирает «Добавить блок».
  3. Программа вычисляет координаты выделенной области и вписывает туда рисунок.

Для реализации этого метода проанализируем следующий пример кода:


Область = ТабДок.ТекущаяОбласть;
// Проверяем, что выделена область ячеек
Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
    Блок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
    // Привязываем рисунок к координатам выделенных ячеек
    Блок.Расположить(Область);
    Блок.Текст = "Новый узел графа";
КонецЕсли;

Решение №2: Использование специализированного объекта «Графическая схема»

Если задача заключается именно в создании редактора графов, то использование ТабличногоДокумента может быть не самым оптимальным путем. Разберем объект Графическая схема. Этот объект специально предназначен для визуализации бизнес-процессов, алгоритмов и произвольных связей.

Преимущества графической схемы:

Хотя программное управление курсором здесь также ограничено, сам интерфейс взаимодействия гораздо ближе к потребностям «редактора графов», чем статичная сетка табличного документа.

Решение №3: Поле HTML-документа как профессиональный подход

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

Внутри Поля HTML-документа мы работаем с веб-технологиями (HTML5, CSS3, JavaScript). С помощью CSS мы можем легко изменить курсор на любой стандартный или даже загрузить свою картинку:


/* CSS код внутри HTML-страницы */
.canvas-area {
    cursor: crosshair; /* Курсор в виде перекрестия */
}

С помощью JavaScript библиотек, таких как JointJS, GoJS или простого HTML5 Canvas API, можно реализовать полноценный графический редактор с drag-and-drop, изменением размеров и динамическими связями. Передача данных в 1С осуществляется через событие ПриНажатии (в старых версиях) или через механизм Средства.ИнтерактивнаяАктивация (в новых), а также через метод Документ.parentWindow.external.

Решение №4: Эмуляция рисования «пикселями»

В обсуждении упоминался экзотический метод: сделать ячейки табличного документа крайне мелкими (например, высотой и шириной в 1-2 пикселя) и «рисовать» закрашиванием фона ячеек. Проанализируем этот подход:


// Пример установки "пиксельного" режима
Для НомерКолонки = 1 По 200 Цикл
    ТабДок.Область(, НомерКолонки).ШиринаКолонки = 0.1;
КонецЦикла;

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

Итоги и рекомендации

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

  1. Для простых схем: Используйте программное добавление объектов в ТабДок.Рисунки с привязкой к текущей области (ТабДок.ТекущаяОбласть).
  2. Для классических графов: Перейдите на использование объекта ГрафическаяСхема.
  3. Для сложных интерактивных систем: Используйте Поле HTML-документа с подключением JS-библиотек — это даст вам 100% контроль над курсором, событиями мыши и графикой.

Выбор конкретного метода зависит от требуемого уровня интерактивности и времени, которое вы готовы затратить на разработку компонента.

← На главную