В практике разработки на платформе 1С:Предприятие часто возникает задача создания интерактивных инструментов для работы с графикой. Например, когда пользователю необходимо открыть схему или чертеж изделия и прямо на нем проставить размеры (длину, ширину, диаметр), которые затем должны сохраниться в системе. Рассмотрим, как это реализовать наиболее эффективно, используя стандартные инструменты платформы.
Самый доступный и быстрый способ реализации — это использование Табличного документа. Этот объект позволяет не только выводить текст, но и размещать поверх ячеек графические элементы (рисунки). Проанализируем, как настроить такой интерфейс по шагам.
Шаг 1. Создание макета чертежа
Для начала создадим Макет в обработке или документе. В этом макете мы размещаем основной чертеж. Важно понимать, что сам чертеж может быть статичной картинкой, а области для ввода параметров мы наложим сверху. Разберем два варианта размещения зон ввода:
РисунокТабличногоДокумента с типом Текст.Шаг 2. Настройка интерактивности
Чтобы пользователь мог редактировать текст в рисунке, необходимо в свойствах рисунка на макете (или программно) установить флаг Разрешить редактирование. Проанализируем ситуацию: когда пользователь открывает форму, он видит табличный документ. Нам нужно вывести его программно:
// Пример вывода макета на форму
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
Макет = ПолучитьМакет("ЧертежСРазмерами");
ОбластьЧертеж = Макет.ПолучитьОбласть("ОсновнаяЧасть");
ТабДок.Вывести(ОбластьЧертеж);
ТабДок.ТолькоПросмотр = Ложь; // Разрешаем редактирование для ввода данных
После того как пользователь ввел значения (например, "500 мм") в текстовые блоки на чертеже, нам нужно считать эти данные для записи в базу. Выясним, как обратиться к этим значениям. Каждый рисунок в табличном документе имеет имя. Если мы назвали объект D2, то доступ к нему в модуле формы будет выглядеть следующим образом:
// Получение значения из конкретного графического объекта
ВведеннаяДлина = ЭтаФорма.ТабДок.Рисунки.D2.Текст;
Сообщить("Пользователь ввел длину: " + ВведеннаяДлина);
Если на чертеже много параметров, мы можем обойти их все в цикле, чтобы не обращаться к каждому по имени:
Для Каждого ТекРисунок Из ТабДок.Рисунки Цикл
Если Найти(ТекРисунок.Имя, "Размер_") > 0 Тогда
// Сохраняем введенное значение в структуру или регистр
ЗначениеРазмера = ТекРисунок.Текст;
// Логика сохранения...
КонецЕсли;
КонецЦикла;
Рассмотрим подробнее вопрос удобства интерфейса. Хорошим тоном считается визуальное выделение полей, которые еще не заполнены. Посмотрим на пример реализации логики смены цвета:
Для ячеек таблицы это реализуется свойством ЦветФона, а для рисунков — свойствами линии и текста. Посмотрим на пример кода:
// Изменение цвета рисунка при проверке
Рисунок = ТабДок.Рисунки.D2;
Если ПустаяСтрока(Рисунок.Текст) Тогда
Рисунок.ЦветТекста = ЦветаСтиля.ТекстВторостепеннойНадписи; // Серый
Иначе
Рисунок.ЦветТекста = WebЦвета.Черный;
КонецЕсли;
Если задача требует более сложной графики (например, динамического изменения формы чертежа при вводе размеров), рассмотрим другие варианты:
В 1С существует объект Графическая схема. Хотя она предназначена для бизнес-процессов, ее можно использовать как холст. Она позволяет программно создавать линии, стрелки и текстовые блоки. Каждый элемент схемы имеет свойство Значение, куда можно сохранить дополнительные данные.
Для продвинутых решений разберем вариант с SVG. Мы можем сформировать XML-строку SVG-изображения и вывести ее в поле HTML-документа на форме 1С. Это дает полный контроль над визуализацией:
Для передачи данных обратно в 1С из HTML-поля обычно используется перехват события ПриНажатии или анализ навигации браузера.
Чтобы сохранить чертеж именно в том виде, в котором его заполнил пользователь (со всеми подписями), воспользуемся методом Записать() объекта ТабличныйДокумент. Выясним, какие форматы наиболее подходят:
// Сохранение в PDF для отправки клиенту
ПутьКФайлу = "C:\Drawings\Result.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
// Сохранение во внутренний формат 1С для последующего редактирования
ТабДок.Записать(ПутьКФайлуMXL, ТипФайлаТабличногоДокумента.MXL);
Важный нюанс: Если вы планируете хранить историю изменений размеров, рекомендуется сохранять не только файл, но и значения координат и текстов в отдельный Регистр сведений. Это позволит в будущем программно воссоздать чертеж, даже если макет шаблона изменится.
Подведем итог: для реализации ввода размеров на обычных формах связка Табличный документ + Рисунки с типом Текст является наиболее оптимальной по соотношению "затраты/результат". Она не требует внешних компонент и легко поддерживается программистами 1С.