При тиражировании решений, обновлении баз данных и внедрении отдельных подсистем в среде 1С:Предприятие 7.7 разработчики регулярно сталкиваются с проблемой «съезжания» графических ресурсов. После выполнения процедуры объединения конфигураций элементы управления на формах (декоративные рамки, значки состояния, пиктограммы кнопок) начинают отображать совершенно другие картинки из общей библиотеки.
Разберем природу возникновения этой проблемы на уровне платформы 1С 7.7, а также детально проанализируем практические способы ее решения как штатными средствами встроенного языка, так и с помощью внешней компоненты FormEx.
Проанализируем архитектуру хранения графики в метаданных файла 1Cv7.MD. В платформе 1С 7.7 привязка картинок к элементам диалогов форм работает по следующему принципу:
Рассмотрим рабочие подходы, которые позволяют гарантировать правильное отображение изображений вне зависимости от состава библиотек в клиентских базах.
Если на форме расположен стандартный элемент управления типа «Картинка», мы можем отказаться от жесткой статической привязки в редакторе диалога и назначить изображение программно в событии инициализации формы.
Разберем по шагам, как это реализовать:
ЧернГалочка).ЗнакВопрос). В свойствах диалога в качестве картинки можно выбрать любой временный значок.ПриОткрытии() пишем код динамической загрузки:
Процедура ПриОткрытии()
// Создаем объект для работы с графикой
Карт = СоздатьОбъект("Картинка");
// Загружаем изображение по заданному строковому идентификатору из библиотеки
Карт.Загрузить("ЧернГалочка");
// Передаем картинку в элемент формы
ЗнакВопрос.УстановитьКартинку(Карт);
КонецПроцедуры
При таком подходе порядок следования картинок в библиотеке после объединения метаданных перестает иметь значение: платформа находит нужный ресурс по его уникальному строковому идентификатору в момент открытия окна.
Штатный визуальный элемент «Кнопка» в 1С 7.7 не предоставляет встроенного метода для прямой замены пиктограммы на уровне базового языка. Если попытаться применить конструкцию вида Форма.кнОК.УстановитьКартинку(Карт), система выдаст ошибку отсутствия метода.
Для гибкого управления свойствами кнопок используем библиотеку FormEx. Рассмотрим особенности реализации.
Важный нюанс: Обращение к визуальным атрибутам через расширение формы должно происходить в момент, когда диалоговое окно уже полностью создано операционной системой. Поэтому код необходимо размещать не в ПриОткрытии(), а в процедуре ПослеОткрытия().
Разберем пошаговый пример реализации:
кнСформировать).ИконкаВыполнить).ПослеОткрытия():
Процедура ПослеОткрытия()
// Инициализируем объект расширения формы FormEx
РасшФормы = СоздатьОбъект("РасширениеФормы");
РасшФормы.УстановитьФорму(Форма);
// Получаем интерфейс управления кнопкой по ее идентификатору
АтрФормы = РасшФормы.ПолучитьАтрибут("кнСформировать");
Если ПустоеЗначение(АтрФормы) = 0 Тогда
// Назначаем картинку по имени из библиотеки ресурсов
АтрФормы.Картинка = "ИконкаВыполнить";
КонецЕсли;
КонецПроцедуры
Компонента FormEx позволяет привязать картинку не только из внутренней библиотеки по строковому имени, но и подгружать графику напрямую из внешних файлов или динамических библиотек (DLL).
Если разрабатываемая подсистема должна поставляться в виде автономных внешних обработок (.ert) или изолированных отчетов и не должна вообще модифицировать общую библиотеку картинок конфигурации клиента, применим метод хранения графики в макетах:
Этот способ полностью изолирует тиражное решение от метаданных целевой базы и исключает любые конфликты ресурсов при обновлениях.
Подведем итог и выделим правила, минимизирующие трудозатраты при сопровождении нетиповых конфигураций:
прф_ЗначокПечати) всем добавляемым в библиотеку картинкам.