Как программно установить картинку для табличной части в 1С 7.7?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько способов её решения — от административных методов до использования мощных внешних компонент, таких как FormEx и 1С++. Мы научимся программно управлять картинками, чтобы интерфейс ваших решений оставался стабильным независимо от состава библиотеки ресурсов в конкретной информационной базе.

Суть проблемы: почему «съезжают» картинки?

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

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


Карт = СоздатьОбъект("Картинка");
Карт.Загрузить("МойЗначок"); // "МойЗначок" — идентификатор в библиотеке
ТекКарт.УстановитьКартинку(Карт); // ТекКарт — идентификатор объекта на форме

Однако для табличной части (многострочной части) на форме штатно невозможно задать идентификатор картинки. В свойствах таблицы в конфигураторе мы просто выбираем картинку из списка. Платформа запоминает её индекс, и если после обновления ваша картинка «МойЗначок» стала 55-й вместо 50-й, то в таблице отобразится то, что теперь находится под индексом 50. Это создает огромные трудности при тиражировании решений.

Решение №1: Использование внешней компоненты FormEx

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

Разберем по шагам, как программно назначить картинку для многострочной части с помощью FormEx. Для этого используется метод УстановитьКартинкуМногострочнойЧасти.

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


Процедура ПриОткрытии()
    // Загружаем компоненту, если она еще не загружена
    Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
        Сообщить("Ошибка загрузки FormEx.dll", "!");
        Возврат;
    КонецЕсли;

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

Важный нюанс: Метод УстановитьКартинкуМногострочнойЧасти заменяет стандартный набор пиктограмм таблицы. Если ваша таблица должна отображать разные значки в строках (например, в зависимости от статуса документа), вам нужно подготовить картинку в виде «ленты» (strip), где все иконки (обычно размером 16x16 пикселей) идут друг за другом по горизонтали. Тогда в коде вы сможете обращаться к конкретному номеру иконки в этой ленте через стандартную функцию НомерПиктограммы().

Решение №2: Переход на «Табличное поле» от 1С++

Если возможностей стандартной многострочной части даже с расширением FormEx вам недостаточно, проанализируем более радикальный, но мощный метод — использование компоненты 1С++ и объекта Табличное поле.

В отличие от родной таблицы 1С, «Табличное поле» является полноценным ActiveX-объектом. Оно позволяет полностью контролировать визуальное представление данных. Рассмотрим, как реализована работа с картинками в этом случае:

  1. Вместо стандартной многострочной части на форму помещается объект «Текст» с определенным идентификатором, который при открытии формы «подменяется» Табличным полем.
  2. Для работы с иконками используется объект ImageList (список изображений).
  3. Мы программно наполняем ImageList картинками из файлов или ресурсов и привязываем его к колонке таблицы.

Пример инициализации (упрощенно):


ТП = СоздатьОбъект("ТабличноеПоле");
Иконки = СоздатьОбъект("ImageList");
Иконки.Добавить("Путь_К_Файлу\icon1.bmp");
Иконки.Добавить("Путь_К_Файлу\icon2.bmp");

// Назначаем список картинок табличному полю
ТП.ПоставитьКартинки(Иконки);

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

Решение №3: Административный подход без внешних компонент

Если использование внешних компонент в вашей организации запрещено политикой безопасности, выясним, как можно минимизировать риск «съезда» картинок штатными средствами. Единственный стабильный путь здесь — строгая дисциплина ведения библиотеки картинок.

Соблюдайте следующие правила при разработке:

  1. Никогда не удаляйте картинки из середины списка библиотеки ресурсов. Если картинка больше не нужна, замените её на пустую «заглушку», но сохраните её позицию.
  2. Добавляйте новые элементы только в конец списка. Это гарантирует, что индексы всех существующих картинок останутся неизменными.
  3. При объединении конфигураций всегда внимательно проверяйте раздел ресурсов. Если вы видите, что 1С предлагает изменить порядок картинок, делайте это вручную, чтобы сохранить идентичность индексов в основной базе и базе-источнике обновления.

Также существует «хитрый» прием с внешними обработками (файлы .ert). Если вы назначите картинку на таблицу во внешней обработке и сохраните её, то при открытии в другой базе 1С попытается найти картинку по внутреннему GUID (если он совпадает). Однако этот метод работает нестабильно и не подходит для встроенных в конфигурацию документов.

Резюме

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

Используя предложенные методы, вы сделаете свои разработки на «семерке» гораздо более надежными и удобными в сопровождении.

← На главную