Внешняя компонента FormEx является одним из ключевых инструментов расширения возможностей платформы 1С:Предприятие 7.7. Она позволяет управлять элементами интерфейса, событиями форм, низкоуровневыми системными сообщениями, а также оформлением табличных частей и документов. Разберем ключевые нововведения, появившиеся в обновленных версиях компоненты, и на практических примерах рассмотрим, как правильно внедрять и оптимизировать их в конфигурациях 1С 7.7.
Ранее для вывода штрихкодов требовалось подключение сторонних шрифтов или отдельных внешних библиотек. В компоненту интегрирован движок генерации штрихкодов 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 следует соблюдать важные правила:
СоздатьШрифт() внутри циклических функций расчета цвета строк (при раскраске многострочных частей). При частом вызове быстро исчерпывается системный лимит дескрипторов GDI (GDI Handles), что приводит к аварийному закрытию 1С. Шрифт создается один раз при открытии формы или инициализации системы, сохраняется в переменной и переиспользуется.ОтключитьОбновлениеПриРаскраске(1) объекта Сервис. Это предотвращает повторный расчет формул ячеек таблицы при перерисовке.РасширениеФормы: ВысотаЗаголовкаТаблицы("ИмяТЗ", 0).Применяя данные подходы, можно существенно расширить функциональность конфигураций на платформе 1С 7.7, сохраняя высокую скорость работы интерфейса и стабильность клиентских сессий.