В процессе разработки печатных форм во внешней обработке или отчете программисты часто сталкиваются с задачей динамического вывода изображений. Казалось бы, задача тривиальная: создать в макете объект типа Рисунок, дать ему имя и обратиться к нему из кода. Однако на практике можно столкнуться с тем, что платформа 1С начинает вести себя непредсказуемо: имена рисунков сбрасываются к стандартным, а сами изображения при выводе на печать меняются местами. Рассмотрим подробнее, почему это происходит и как решить данную проблему.
Первая и самая распространенная причина — использование имен объектов, которые платформа считает «зарезервированными» или системными. Разберем ситуацию: часто разработчики называют рисунки кратко, например, D1, D2, A1. Начиная с версии платформы 8.3.16 и выше, такие имена могут конфликтовать с внутренней логикой адресации ячеек в табличном документе (наподобие стиля Excel). Платформа может воспринимать D1 не как имя графического объекта, а как координату, и при сохранении макета принудительно «нормализует» имя, возвращая его к значению по умолчанию, например, Рисунок1 или Picture1.
Проанализируем последствия такого поведения. Если в коде мы продолжаем обращаться к Подвал.Рисунки.D1, а в макете имя уже изменилось, мы получим ошибку «Поле объекта не найдено». А если имен было несколько, и платформа переименовала их по-своему, индексы в коллекции Рисунки могут сместиться, что приведет к тому, что картинки визуально поменяются местами.
Многие разработчики замечают странное поведение конфигуратора: вводим имя ПолеКартинки1, нажимаем «сохранить», закрываем свойства, открываем снова — и там опять D1. Это явный баг интерфейса некоторых версий платформы (особенно часто встречается в 8.3.16.1148). Выясним опытным путем последовательность действий, которая помогает надежно зафиксировать имя объекта в макете:
мп_КартинкаПодпись).Tab или зеленую галочку в окне свойств. Если кнопки стали неактивными — это хороший знак, но не гарантия.Когда мы выводим область макета в итоговый документ, мы работаем с коллекцией Рисунки. Посмотрим на пример кода, который обычно используется для заполнения картинок:
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Установка картинок по именам объектов
ОбластьПодвал.Рисунки.мп_Картинка1.Картинка = КартинкаИзСправочника1;
ОбластьПодвал.Рисунки.мп_Картинка2.Картинка = КартинкаИзСправочника2;
ТабДок.Вывести(ОбластьПодвал);
Важно понимать, что если вы используете метод Вывести() несколько раз для одной и той же области, 1С может начать автоматически переименовывать рисунки в результирующем документе (например, добавляя цифровой индекс в конец имени), чтобы избежать дублирования имен в рамках одного ТабличныйДокумент. Поэтому обращаться к рисункам нужно строго до момента вывода области в итоговый документ.
Ситуация, когда D1 оказывается на месте D3, часто связана с так называемым Z-порядком (порядком слоев). В 1С объекты в коллекции Рисунки могут располагаться один над другим. Если вы меняли порядок объектов через контекстное меню («На передний план», «На задний план»), их внутренние индексы в коллекции перестраиваются.
Также проанализируем привязку к ячейкам. В свойствах рисунка есть параметр «Тип привязки». Рассмотрим варианты:
Если вы столкнулись с тем, что картинки «прыгают», попробуйте пересоздать их в макете с нуля, не копируя существующие объекты Ctrl+C / Ctrl+V. При копировании рисунков 1С иногда копирует их внутренние идентификаторы, что создает путаницу для обработчика вывода.
Если борьба с именами в конфигураторе не приносит успеха, мы можем применить более надежный программный метод — обход коллекции в цикле. Это позволит нам найти нужный рисунок не по имени (которое может сброситься), а по другим признакам.
Рассмотрим пример обхода:
Для каждого ТекущийРисунок Из ОбластьПодвал.Рисунки Цикл
// Проверяем тип объекта, так как в коллекции могут быть и линии, и диаграммы
Если ТипЗнч(ТекущийРисунок.Объект) = Тип("Картинка") Тогда
// Можно идентифицировать по части имени или координатам
Если Найти(ТекущийРисунок.Имя, "Картинка1") > 0 Тогда
ТекущийРисунок.Картинка = НужноеИзображение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Подведем итоги и сформируем правила, которые помогут избежать «дичи» (как выразился автор темы) при работе с графикой в макетах:
A1, B2, D1. Всегда добавляйте осмысленный префикс: ЛоготипКомпании, ШтампОТК.РисунокТабличногоДокумента, а его свойство Картинка доступно для записи.Соблюдение этих правил позволит вам создавать профессиональные печатные формы с динамическим контентом, которые будут работать стабильно на любой версии платформы.