Почему при программном выводе картинки в макет они меняются местами или сбрасывают имена?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разбор проблемы: конфликт имен и зарезервированные слова

Первая и самая распространенная причина — использование имен объектов, которые платформа считает «зарезервированными» или системными. Разберем ситуацию: часто разработчики называют рисунки кратко, например, D1, D2, A1. Начиная с версии платформы 8.3.16 и выше, такие имена могут конфликтовать с внутренней логикой адресации ячеек в табличном документе (наподобие стиля Excel). Платформа может воспринимать D1 не как имя графического объекта, а как координату, и при сохранении макета принудительно «нормализует» имя, возвращая его к значению по умолчанию, например, Рисунок1 или Picture1.

Проанализируем последствия такого поведения. Если в коде мы продолжаем обращаться к Подвал.Рисунки.D1, а в макете имя уже изменилось, мы получим ошибку «Поле объекта не найдено». А если имен было несколько, и платформа переименовала их по-своему, индексы в коллекции Рисунки могут сместиться, что приведет к тому, что картинки визуально поменяются местами.

Особенности работы с конфигуратором: как «победить» сброс имени

Многие разработчики замечают странное поведение конфигуратора: вводим имя ПолеКартинки1, нажимаем «сохранить», закрываем свойства, открываем снова — и там опять D1. Это явный баг интерфейса некоторых версий платформы (особенно часто встречается в 8.3.16.1148). Выясним опытным путем последовательность действий, которая помогает надежно зафиксировать имя объекта в макете:

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

Программный вывод и управление коллекцией рисунков

Когда мы выводим область макета в итоговый документ, мы работаем с коллекцией Рисунки. Посмотрим на пример кода, который обычно используется для заполнения картинок:


ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Установка картинок по именам объектов
ОбластьПодвал.Рисунки.мп_Картинка1.Картинка = КартинкаИзСправочника1;
ОбластьПодвал.Рисунки.мп_Картинка2.Картинка = КартинкаИзСправочника2;
ТабДок.Вывести(ОбластьПодвал);

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

Почему картинки меняются местами? Z-порядок и привязка

Ситуация, когда D1 оказывается на месте D3, часто связана с так называемым Z-порядком (порядком слоев). В 1С объекты в коллекции Рисунки могут располагаться один над другим. Если вы меняли порядок объектов через контекстное меню («На передний план», «На задний план»), их внутренние индексы в коллекции перестраиваются.

Также проанализируем привязку к ячейкам. В свойствах рисунка есть параметр «Тип привязки». Рассмотрим варианты:

Если вы столкнулись с тем, что картинки «прыгают», попробуйте пересоздать их в макете с нуля, не копируя существующие объекты Ctrl+C / Ctrl+V. При копировании рисунков 1С иногда копирует их внутренние идентификаторы, что создает путаницу для обработчика вывода.

Альтернативный способ обращения к рисункам

Если борьба с именами в конфигураторе не приносит успеха, мы можем применить более надежный программный метод — обход коллекции в цикле. Это позволит нам найти нужный рисунок не по имени (которое может сброситься), а по другим признакам.

Рассмотрим пример обхода:


Для каждого ТекущийРисунок Из ОбластьПодвал.Рисунки Цикл
    // Проверяем тип объекта, так как в коллекции могут быть и линии, и диаграммы
    Если ТипЗнч(ТекущийРисунок.Объект) = Тип("Картинка") Тогда
        // Можно идентифицировать по части имени или координатам
        Если Найти(ТекущийРисунок.Имя, "Картинка1") > 0 Тогда
             ТекущийРисунок.Картинка = НужноеИзображение;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Рекомендации по стабильной работе

Подведем итоги и сформируем правила, которые помогут избежать «дичи» (как выразился автор темы) при работе с графикой в макетах:

  1. Никогда не используйте короткие имена типа A1, B2, D1. Всегда добавляйте осмысленный префикс: ЛоготипКомпании, ШтампОТК.
  2. Проверяйте свойства после сохранения. Если имя сбросилось — примените метод «двойного ввода» или перезапустите конфигуратор.
  3. Следите за типами областей. Убедитесь в отладчике, что тип объекта в коллекции действительно РисунокТабличногоДокумента, а его свойство Картинка доступно для записи.
  4. Чистите кэш. Если вы работаете с внешней обработкой и изменения в макете не подхватываются (имена старые, картинки не те), попробуйте очистить кэш метаданных 1С или просто переименуйте файл обработки.

Соблюдение этих правил позволит вам создавать профессиональные печатные формы с динамическим контентом, которые будут работать стабильно на любой версии платформы.

← На главную