Как сохранить правильное отображение картинок и пиктограмм при объединении конфигураций в 1С 7.7?

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

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

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

Почему «съезжают» картинки при объединении конфигураций

Проанализируем архитектуру хранения графики в метаданных файла 1Cv7.MD. В платформе 1С 7.7 привязка картинок к элементам диалогов форм работает по следующему принципу:

  1. Индексная адресация: Элементы форм (статические картинки, кнопки, переключатели) хранят внутри описания диалога не строковый идентификатор изображения, а его порядковый номер (индекс) в глобальной таблице ресурсов библиотеки картинок.
  2. Особенности механизма сравнения и объединения: Штатный конфигуратор 1С 7.7 при объединении метаданных не выполняет сопоставление картинок по их именам с последующим пересчетом индексов во всех формах. Если объединяемая конфигурация содержит иное количество картинок или другой порядок их следования, общая таблица ресурсов смещается.
  3. Результат: Форма запрашивает изображение под номером N, но после объединения под этим номером оказывается уже совершенно другая пиктограмма.

Рассмотрим рабочие подходы, которые позволяют гарантировать правильное отображение изображений вне зависимости от состава библиотек в клиентских базах.

Решение 1. Программная загрузка по идентификатору для элементов диалога (Штатные средства)

Если на форме расположен стандартный элемент управления типа «Картинка», мы можем отказаться от жесткой статической привязки в редакторе диалога и назначить изображение программно в событии инициализации формы.

Разберем по шагам, как это реализовать:

  1. Открываем конфигуратор и переходим в общую библиотеку картинок: Конфигурация — Общие картинки (или библиотека картинок).
  2. Выбираем нужную картинку и нажимаем кнопку Идентификатор, чтобы задать ей уникальное имя (например, ЧернГалочка).
  3. На форме диалога задаем идентификатор самому элементу управления типа «Картинка» (например, ЗнакВопрос). В свойствах диалога в качестве картинки можно выбрать любой временный значок.
  4. В программном модуле формы в предопределенной процедуре ПриОткрытии() пишем код динамической загрузки:

Процедура ПриОткрытии()
    // Создаем объект для работы с графикой
    Карт = СоздатьОбъект("Картинка");
    
    // Загружаем изображение по заданному строковому идентификатору из библиотеки
    Карт.Загрузить("ЧернГалочка");
    
    // Передаем картинку в элемент формы
    ЗнакВопрос.УстановитьКартинку(Карт);
КонецПроцедуры

При таком подходе порядок следования картинок в библиотеке после объединения метаданных перестает иметь значение: платформа находит нужный ресурс по его уникальному строковому идентификатору в момент открытия окна.

Решение 2. Динамическая установка пиктограмм на кнопки через FormEx

Штатный визуальный элемент «Кнопка» в 1С 7.7 не предоставляет встроенного метода для прямой замены пиктограммы на уровне базового языка. Если попытаться применить конструкцию вида Форма.кнОК.УстановитьКартинку(Карт), система выдаст ошибку отсутствия метода.

Для гибкого управления свойствами кнопок используем библиотеку FormEx. Рассмотрим особенности реализации.

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

Разберем пошаговый пример реализации:

  1. Назначаем кнопке на форме идентификатор (например, кнСформировать).
  2. Назначаем в библиотеке картинок уникальный строковый идентификатор нужной иконке (например, ИконкаВыполнить).
  3. В модуле формы реализуем обработку события ПослеОткрытия():

Процедура ПослеОткрытия()
    // Инициализируем объект расширения формы FormEx
    РасшФормы = СоздатьОбъект("РасширениеФормы");
    РасшФормы.УстановитьФорму(Форма);
    
    // Получаем интерфейс управления кнопкой по ее идентификатору
    АтрФормы = РасшФормы.ПолучитьАтрибут("кнСформировать");
    
    Если ПустоеЗначение(АтрФормы) = 0 Тогда
        // Назначаем картинку по имени из библиотеки ресурсов
        АтрФормы.Картинка = "ИконкаВыполнить";
    КонецЕсли;
КонецПроцедуры

Компонента FormEx позволяет привязать картинку не только из внутренней библиотеки по строковому имени, но и подгружать графику напрямую из внешних файлов или динамических библиотек (DLL).

Решение 3. Хранение изображений в табличных документах (MXL)

Если разрабатываемая подсистема должна поставляться в виде автономных внешних обработок (.ert) или изолированных отчетов и не должна вообще модифицировать общую библиотеку картинок конфигурации клиента, применим метод хранения графики в макетах:

  1. Создаем в обработке служебную таблицу (макет).
  2. Вставляем в ячейку таблицы рисунок через меню Таблица — Вставить рисунок — Картинка.
  3. При открытии формы извлекаем графический объект из макета и программно передаем его в элемент формы.

Этот способ полностью изолирует тиражное решение от метаданных целевой базы и исключает любые конфликты ресурсов при обновлениях.

Рекомендации по организации обновлений конфигураций 1С 7.7

Подведем итог и выделим правила, минимизирующие трудозатраты при сопровождении нетиповых конфигураций:

  1. Именование ресурсов: Всегда присваивайте строковые идентификаторы с уникальным префиксом подсистемы (например, прф_ЗначокПечати) всем добавляемым в библиотеку картинкам.
  2. Динамическая инициализация: В коде форм подсистемы используйте динамическую установку картинок по именам вместо статически выбранных иконок в свойствах диалогов.
  3. Порядок объединения: При объединении конфигураций с добавлением ресурсов обращайте внимание на флаги замещения общих таблиц и глобального модуля, чтобы исключить затирание идентификаторов в библиотеке картинок целевой базы.
← На главную