При разработке интерактивных инструментов в среде 1С:Предприятие, таких как редакторы графов или схем, разработчики часто сталкиваются с необходимостью изменить визуальное поведение интерфейса. Типичный сценарий: пользователь выбирает инструмент (например, «Прямоугольник»), и курсор мыши должен измениться на «перекрестие», как это происходит в стандартном режиме редактирования табличного документа. Разберем подробно, насколько это реализуемо и какие существуют альтернативные пути для достижения цели.
Начнем с анализа базовых возможностей встроенного языка. В платформе 1С:Предприятие 8 объект ТабличныйДокумент (Spreadsheet Document) не обладает свойством, позволяющим программно управлять формой указателя мыши. Вид курсора жестко зашит в логику работы платформы и меняется автоматически в зависимости от контекста:
Проблема заключается в том, что режим рисования активируется внутренней командой платформы, которая не имеет эквивалента во встроенном языке. Мы не можем вызвать метод типа ТабДок.УстановитьРежимРисования(ТипРисунка.Прямоугольник), чтобы заставить систему вести себя так, будто пользователь нажал кнопку в меню.
Кроме того, ТабличныйДокумент крайне ограничен в обработке событий мыши. У него отсутствуют события OnMouseMove (перемещение мыши) или OnMouseDown (нажатие кнопки мыши). Без этих событий даже изменение вида курсора не позволило бы реализовать полноценное «рисование» (когда фигура тянется за мышкой), так как код 1С просто не будет знать текущие координаты указателя в реальном времени.
Если нам нужно добавить рисунок на лист без интерактивного изменения курсора, мы можем воспользоваться коллекцией Рисунки объекта ТабличныйДокумент. Проанализируем, как это сделать программно. Рассмотрим пример добавления прямоугольника:
// Создаем новый рисунок в табличном документе
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
// Устанавливаем координаты и размеры (в мм)
НовыйРисунок.Верх = 10;
НовыйРисунок.Лево = 10;
НовыйРисунок.Ширина = 50;
НовыйРисунок.Высота = 30;
// Настраиваем внешний вид
НовыйРисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 1);
НовыйРисунок.ЦветЛинии = ЦветаСтиля.ЦветРамки;
В контексте создания редактора графов через контекстное меню (как хотел автор вопроса), мы можем предложить пользователю следующий алгоритм:
Для реализации этого метода проанализируем следующий пример кода:
Область = ТабДок.ТекущаяОбласть;
// Проверяем, что выделена область ячеек
Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда
Блок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник);
// Привязываем рисунок к координатам выделенных ячеек
Блок.Расположить(Область);
Блок.Текст = "Новый узел графа";
КонецЕсли;
Если задача заключается именно в создании редактора графов, то использование ТабличногоДокумента может быть не самым оптимальным путем. Разберем объект Графическая схема. Этот объект специально предназначен для визуализации бизнес-процессов, алгоритмов и произвольных связей.
Преимущества графической схемы:
Хотя программное управление курсором здесь также ограничено, сам интерфейс взаимодействия гораздо ближе к потребностям «редактора графов», чем статичная сетка табличного документа.
Для тех, кому нужен полный контроль над интерфейсом, включая изменение курсора и отслеживание каждого пикселя перемещения мыши, единственным надежным вариантом в 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.
В обсуждении упоминался экзотический метод: сделать ячейки табличного документа крайне мелкими (например, высотой и шириной в 1-2 пикселя) и «рисовать» закрашиванием фона ячеек. Проанализируем этот подход:
// Пример установки "пиксельного" режима
Для НомерКолонки = 1 По 200 Цикл
ТабДок.Область(, НомерКолонки).ШиринаКолонки = 0.1;
КонецЦикла;
Несмотря на оригинальность, этот метод крайне непроизводителен. При большом количестве закрашенных ячеек (виртуальных пикселей) табличный документ начнет сильно тормозить, а экспорт такого документа превратится в проблему. Этот способ не рекомендуется для создания редакторов графов.
Подводя итог, можно констатировать: программное изменение курсора в Табличном документе 1С невозможно из-за архитектурных ограничений платформы. Однако задачу автора можно решить другими способами:
ТабДок.Рисунки с привязкой к текущей области (ТабДок.ТекущаяОбласть).ГрафическаяСхема.Поле HTML-документа с подключением JS-библиотек — это даст вам 100% контроль над курсором, событиями мыши и графикой.Выбор конкретного метода зависит от требуемого уровня интерактивности и времени, которое вы готовы затратить на разработку компонента.