При разработке и сопровождении сложных конфигураций на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с неприятной особенностью: визуальные элементы, такие как наборы пиктограмм в табличных частях, могут «съезжать» при объединении конфигураций или обновлении баз у разных клиентов. Это происходит из-за того, что штатные механизмы платформы привязывают картинку к объекту формы не по уникальному идентификатору, а по порядковому номеру (индексу) в библиотеке картинок метаданных.
В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько способов её решения — от административных методов до использования мощных внешних компонент, таких как FormEx и 1С++. Мы научимся программно управлять картинками, чтобы интерфейс ваших решений оставался стабильным независимо от состава библиотеки ресурсов в конкретной информационной базе.
Проанализируем ситуацию: в типовой конфигурации 1С 7.7 библиотека картинок содержит определенный набор ресурсов. Когда вы добавляете свои картинки в процессе разработки, платформа присваивает им следующие порядковые номера. Однако у клиента база может быть другого релиза, или в ней могут быть установлены другие доработки. При объединении конфигураций индексы в глобальной библиотеке ресурсов пересчитываются.
Для обычных картинок на форме мы можем использовать программную установку через идентификатор:
Карт = СоздатьОбъект("Картинка");
Карт.Загрузить("МойЗначок"); // "МойЗначок" — идентификатор в библиотеке
ТекКарт.УстановитьКартинку(Карт); // ТекКарт — идентификатор объекта на форме
Однако для табличной части (многострочной части) на форме штатно невозможно задать идентификатор картинки. В свойствах таблицы в конфигураторе мы просто выбираем картинку из списка. Платформа запоминает её индекс, и если после обновления ваша картинка «МойЗначок» стала 55-й вместо 50-й, то в таблице отобразится то, что теперь находится под индексом 50. Это создает огромные трудности при тиражировании решений.
Самым популярным и надежным способом решения данной проблемы является использование компоненты FormEx. Она расширяет возможности работы с формами 1С 7.7, позволяя обращаться к объектам, которые штатно недоступны для программного управления.
Разберем по шагам, как программно назначить картинку для многострочной части с помощью FormEx. Для этого используется метод УстановитьКартинкуМногострочнойЧасти.
Во-первых, нам необходимо убедиться, что компонента загружена и объект расширения формы инициализирован. Рассмотрим пример кода, который можно разместить в процедуре ПриОткрытии:
Процедура ПриОткрытии()
// Загружаем компоненту, если она еще не загружена
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
Сообщить("Ошибка загрузки FormEx.dll", "!");
Возврат;
КонецЕсли;
// Создаем объект Сервис для доступа к расширенным методам
Сервис = СоздатьОбъект("Сервис");
// Подготавливаем объект Картинка
// Мы можем загрузить её из библиотеки по идентификатору
МояКартинка = СоздатьОбъект("Картинка");
МояКартинка.Загрузить("ИмяКартинкиВБиблиотеке");
// Устанавливаем картинку для многострочной части текущей формы
// Метод принимает объект типа Картинка или путь к файлу
Сервис.УстановитьКартинкуМногострочнойЧасти(МояКартинка);
КонецПроцедуры
Важный нюанс: Метод УстановитьКартинкуМногострочнойЧасти заменяет стандартный набор пиктограмм таблицы. Если ваша таблица должна отображать разные значки в строках (например, в зависимости от статуса документа), вам нужно подготовить картинку в виде «ленты» (strip), где все иконки (обычно размером 16x16 пикселей) идут друг за другом по горизонтали. Тогда в коде вы сможете обращаться к конкретному номеру иконки в этой ленте через стандартную функцию НомерПиктограммы().
Если возможностей стандартной многострочной части даже с расширением FormEx вам недостаточно, проанализируем более радикальный, но мощный метод — использование компоненты 1С++ и объекта Табличное поле.
В отличие от родной таблицы 1С, «Табличное поле» является полноценным ActiveX-объектом. Оно позволяет полностью контролировать визуальное представление данных. Рассмотрим, как реализована работа с картинками в этом случае:
ImageList (список изображений).ImageList картинками из файлов или ресурсов и привязываем его к колонке таблицы.Пример инициализации (упрощенно):
ТП = СоздатьОбъект("ТабличноеПоле");
Иконки = СоздатьОбъект("ImageList");
Иконки.Добавить("Путь_К_Файлу\icon1.bmp");
Иконки.Добавить("Путь_К_Файлу\icon2.bmp");
// Назначаем список картинок табличному полю
ТП.ПоставитьКартинки(Иконки);
Этот метод полностью избавляет разработчика от зависимости от MD-файла, так как все ресурсы могут храниться во внешних папках или DLL-библиотеках.
Если использование внешних компонент в вашей организации запрещено политикой безопасности, выясним, как можно минимизировать риск «съезда» картинок штатными средствами. Единственный стабильный путь здесь — строгая дисциплина ведения библиотеки картинок.
Соблюдайте следующие правила при разработке:
Также существует «хитрый» прием с внешними обработками (файлы .ert). Если вы назначите картинку на таблицу во внешней обработке и сохраните её, то при открытии в другой базе 1С попытается найти картинку по внутреннему GUID (если он совпадает). Однако этот метод работает нестабильно и не подходит для встроенных в конфигурацию документов.
Подводя итог, можно сказать, что штатная невозможность программного задания картинки для таблицы — это одно из известных ограничений платформы 1С 7.7. Для профессиональной разработки наиболее правильным путем будет использование FormEx. Это позволяет:
ПриОткрытии).Используя предложенные методы, вы сделаете свои разработки на «семерке» гораздо более надежными и удобными в сопровождении.