Как использовать новые возможности и методы компоненты FormEx в 1С:Предприятие 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Генерация штрихкодов и QR-кодов с помощью встроенной библиотеки Zint

Ранее для вывода штрихкодов требовалось подключение сторонних шрифтов или отдельных внешних библиотек. В компоненту интегрирован движок генерации штрихкодов Zint, что позволяет напрямую программно отрисовывать различные форматы (включая EAN-13, Code 128, QR-коды) на объекте Картинка как на форме, так и в табличных документах.

Для рисования штрихкода используется метод объекта Сервис — НарисоватьШтрихкод(). Метод принимает параметры целевого объекта картинки, числовой тип штрихкода, значение для кодирования и флаг отображения текстовой подписи под штрихкодом.

Посмотрим на пример вывода штрихкода на форму обработки:


Процедура СформироватьШтрихкод()
    Сервис = СоздатьОбъект("Сервис");
    
    // Тип штрихкода: 58 - QR Code, 20 - Code 128, 8 - EAN-13
    ТипШтрихкода = 58; 
    ДанныеШК = "https://example.com/invoice?id=12345";
    
    // 4-й параметр управляет показом текста (0 - скрыть текст под кодом, 1 - показать)
    ФлагТекста = 0; 
    
    // Картинка - идентификатор элемента управления "Картинка" на форме диалога
    Сервис.НарисоватьШтрихкод(Картинка, ТипШтрихкода, ДанныеШК, ФлагТекста);
КонецПроцедуры

Отладка и получение текущего стека вызовов в режиме Предприятия

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

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


Процедура глСообщить(ТекстСообщения, ФлагОшибки = 0) Экспорт
    Сообщить(ТекстСообщения);
    
    Если ФлагОшибки = 1 Тогда
        Сервис = СоздатьОбъект("Сервис");
        ТЗ_Стек = Сервис.ПолучитьСтекВызова();
        
        Сообщить("--- Стек вызовов ---");
        Для Стр = 1 По ТЗ_Стек.КоличествоСтрок() Цикл
            Сообщить("Модуль: " + ТЗ_Стек.ПолучитьЗначение(Стр, "Модуль") + 
                     ", Строка: " + ТЗ_Стек.ПолучитьЗначение(Стр, "Строка") + 
                     ", Процедура: " + ТЗ_Стек.ПолучитьЗначение(Стр, "Процедура"));
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Дополнительно метод РежимКонфигуратораУСообщений(1) переводит стандартное окно сообщений в режим быстрой навигации: при двойном клике на строку сообщения платформа открывает Конфигуратор и автоматически позиционирует курсор на строке модуля, из которой был выполнен вывод.

Управление окнами сообщений и перехват системных команд

Объект ОкноСообщений позволяет создавать собственные изолированные панели вывода и программно привязывать их к главному окну программы (докинг/парковка), а также перехватывать системный вывод.

Рассмотрим пример инициализации собственного окна сообщений:


Перем мОкно;

Процедура ИнициализацияОкна()
    Если мОкно = 0 Тогда
        мОкно = СоздатьОбъект("ОкноСообщений");
        мОкно.Парковать(4); // Пристыковать к нижней части экрана
        мОкно.Видимость(1);
    КонецЕсли;
    
    мОкно.Сообщить("Служебное сообщение: " + ТекущееВремя(), 1);
КонецПроцедуры

Для взаимодействия с оконной подсистемой Windows в объект Окна добавлены методы SendCommand() (русский синоним: ОтправитьКоманду()) и PostCommand() (русский синоним: ПослатьКоманду()). Они отправляют сообщение WM_COMMAND главному окну приложения. Для перехвата таких команд в глобальном модуле объявляется предопределенная процедура ПриПолученииКомандыГлавнымОкном().

Разберем по шагам перехват горячих клавиш и системных кнопок:


// Перехват системных команд в глобальном модуле
Процедура ПриПолученииКомандыГлавнымОкном(Команда, ПараметрКоманды) Экспорт
    // Блокировка стандартного вызова справки по F1 (ID команды = 57670)
    Если Команда = 57670 Тогда
        СтатусВозврата(0);
        Сообщить("Вызов встроенной справки перехвачен.");
    КонецЕсли;
КонецПроцедуры

Переопределение создания документов из журналов

В глобальном модуле доступен механизм перехвата открытия форм через процедуру ПриОткрытииФормыДокумента(). Это позволяет ограничить список видов создаваемых документов в общем журнале без необходимости переработки структуры метаданных:


Процедура ПриОткрытииФормыДокумента(ФлагСтандартнойОбработки,
                                    идВидаОткрываемогоДокумента,
                                    идОткрываемогоОбъекта,
                                    идТекущегоЖурнала,
                                    п4,
                                    идКопируемогоОбъекта,
                                    идВидаТекущегоВЖурнале,
                                    флВводНаОсновании,
                                    идВидаДокументаОснования,
                                    флРежимПросмотра,
                                    п10, п11, п12, п13, ПараметрФормы) Экспорт

    // Если создается новый документ в общем журнале
    Если (идТекущегоЖурнала <> 0) И (флВводНаОсновании = 0) И (идОткрываемогоОбъекта = 0) Тогда
        спДоступных = СоздатьОбъект("СписокЗначений");
        спДоступных.ДобавитьЗначение("ПриходнаяНакладная", "Приходная накладная");
        спДоступных.ДобавитьЗначение("РасходнаяНакладная", "Расходная накладная");
        
        ВыбранныйВид = "";
        Если спДоступных.ВыбратьЗначение(ВыбранныйВид, "Выберите вид документа") = 1 Тогда
            ФлагСтандартнойОбработки = 0;
            ОткрытьФорму("Документ." + ВыбранныйВид);
        Иначе
            // Пользователь нажал "Отмена"
            ФлагСтандартнойОбработки = 0;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Оптимизация производительности и предотвращение падений

При интенсивной работе с графическими элементами FormEx следует соблюдать важные правила:

  1. Корректное создание шрифтов: Ни в коем случае нельзя вызывать метод СоздатьШрифт() внутри циклических функций расчета цвета строк (при раскраске многострочных частей). При частом вызове быстро исчерпывается системный лимит дескрипторов GDI (GDI Handles), что приводит к аварийному закрытию 1С. Шрифт создается один раз при открытии формы или инициализации системы, сохраняется в переменной и переиспользуется.
  2. Управление обновлением при раскраске: Если при прокрутке журнала или списка документов наблюдается повышенная нагрузка на процессор, вызывайте метод ОтключитьОбновлениеПриРаскраске(1) объекта Сервис. Это предотвращает повторный расчет формул ячеек таблицы при перерисовке.
  3. Управление шапкой Таблицы Значений: Для скрытия заголовков колонок таблицы на форме используйте метод объекта РасширениеФормы: ВысотаЗаголовкаТаблицы("ИмяТЗ", 0).

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

← На главную