При работе с расширениями в платформе 1С разработчики часто сталкиваются с неожиданным поведением, особенно когда речь заходит о модификации типовых печатных форм. Одна из таких проблем проявляется в дублировании графических элементов, например, штрихкодов, когда макет печатной формы помещается в расширение. Давайте подробно разберем, почему это происходит и какие существуют эффективные методы решения данной ситуации.
Рассмотрим типовую ситуацию, когда мы помещаем макет печатной формы (например, накладной) в расширение. В этом макете присутствует картинка, скажем, штрихкод, которая имеет имя «КартинкаШтрихкода». В типовом коде есть функциональность, позволяющая управлять видимостью этого штрихкода – если соответствующая опция не установлена, картинка должна быть удалена программно. Однако, после незначительных изменений в макете расширения (например, корректировка выравнивания ячеек) и даже при выполнении кода по удалению, штрихкод все равно выводится, а иногда даже появляется его дубликат с именем «D2».
На первый взгляд, ситуация кажется парадоксальной: в конфигураторе открываем макет из расширения – видим только одну картинку («КартинкаШтрихкода»), а на печати получаем две, одна из которых имеет странное имя «D2». Это наводит на мысль, что платформа 1С каким-то образом объединяет старый и новый макеты, и при этом дублирует картинку, давая ей новое имя.
Для того чтобы понять, почему происходит дублирование, нам необходимо обратиться к механизмам работы 1С с расширениями и, в частности, к способам расширения макетов табличных документов. Платформа 1С предоставляет два основных режима для макетов в расширениях: «Объединять» и «Замещать».
По умолчанию, если мы просто помещаем макет в расширение и вносим в него изменения, применяется режим «Объединять». В этом режиме система анализирует доработки макета из основной конфигурации и доработки макета из расширения. Сопоставление изменений происходит на уровне именованных строк, отдельных строк и отдельных ячеек. Если эти доработки пересекаются, применяются изменения из расширения.
Именно здесь кроется суть проблемы с дублированием изображений. Когда в типовом макете уже есть картинка с определенным именем (например, «КартинкаШтрихкода»), а мы добавляем этот же макет в расширение и даже просто сохраняем его, платформа может воспринять картинку из расширения как *новую*, несмотря на одинаковое исходное имя. В режиме объединения 1С стремится сохранить все элементы, и если она не может однозначно сопоставить элемент как *тот же самый*, она создает дубликат. При этом, чтобы обеспечить уникальность, платформа автоматически присваивает дубликату новое имя, например, «D2». Это известная особенность поведения платформы при копировании или изменении графических элементов, особенно в контексте расширений.
Таким образом, когда мы получаем макет из расширения, 1С фактически *объединяет* его с оригинальным макетом, а не полностью заменяет. Если при этом она видит "свою" картинку в основном макете и "аналогичную, но потенциально измененную" картинку в макете расширения, она может решить, что это две разные картинки, и вывести обе.
Теперь, когда мы понимаем причину, давайте рассмотрим несколько подходов к решению проблемы дублирования изображений в макетах расширений.
Это самый простой и часто наиболее эффективный способ, который подтвердил свою работоспособность в рассматриваемом случае. Суть метода заключается в том, чтобы полностью удалить проблемную картинку из макета, который находится в расширении.
Почему это работает: Когда мы удаляем картинку из макета расширения, мы явно говорим платформе, что в этом макете данного графического элемента *нет*. В процессе объединения макетов, 1С обнаруживает картинку штрихкода в *оригинальном* макете конфигурации и использует её. Поскольку в макете расширения нет "своей" версии этой картинки, отсутствует повод для дублирования и присвоения нового имени. Код, который управляет видимостью штрихкода, теперь будет работать с оригинальной картинкой из основной конфигурации, как и предполагалось.
Этот подход особенно полезен, когда изображение само по себе не требует изменений в расширении, а необходимо лишь управлять его видимостью.
Если ваши изменения в макете расширения являются обширными, или вы хотите, чтобы версия макета из расширения полностью перекрывала типовой макет, вместо объединения можно явно указать режим «Замещать».
Почему это работает: При режиме "Замещать" платформа полностью игнорирует оригинальный макет из основной конфигурации и использует исключительно версию макета из расширения. Это гарантирует, что на печать будет выведен только тот макет, который вы подготовили в расширении, со всеми его элементами, и без риска дублирования из-за объединения.
Данный метод подходит, когда изменения макета в расширении являются существенными, и вы хотите полностью контролировать его содержимое, не допуская влияния оригинального макета.
Вместо того чтобы программно удалять картинку или полагаться на сложные механизмы объединения, можно реализовать более надежный способ управления видимостью элементов – через использование различных областей макета.
"ОбластьСоШтрихкодом")."ОбластьБезШтрихкода").Пример кода:
Функция ПечатьНакладной(...)
// Получаем макет из расширения (или основной конфигурации, если макет не изменен)
Макет = ПолучитьМакет("МакетНакладной");
// ... Заполнение данных ...
Если ПараметрыПечати.ВыводитьШтрихкод Тогда
// Выводим область, которая содержит штрихкод
ТабДок.Вывести(Макет.ПолучитьОбласть("ОбластьСоШтрихкодом"));
Иначе
// Выводим область, которая НЕ содержит штрихкод
ТабДок.Вывести(Макет.ПолучитьОбласть("ОбластьБезШтрихкода"));
КонецЕсли;
// ... Продолжение формирования формы ...
Возврат ТабДок;
КонецФункции;
Почему это работает: Этот подход полностью обходит проблемы, связанные с программным удалением графических элементов или непредсказуемым поведением при объединении. Мы заранее готовим все возможные варианты макета и просто выбираем нужный. Это делает код более предсказуемым и устойчивым к изменениям платформы.
Данный метод является более универсальным и рекомендованным, когда необходимо гибко управлять содержимым печатной формы в зависимости от условий.
Работа с печатными формами и их модификация через расширения в 1С требует понимания внутренних механизмов платформы, особенно процессов объединения макетов. Проблема дублирования изображений, таких как штрихкоды, когда появляется элемент с именем "D2", является следствием того, как 1С обрабатывает и сопоставляет элементы из основной конфигурации и расширения в режиме "Объединять".
Мы выяснили, что наиболее простым и эффективным решением в данном конкретном случае было полное удаление картинки штрихкода из макета, расположенного в расширении, полагаясь на то, что оригинал из основной конфигурации будет корректно использован. Помимо этого, мы рассмотрели другие полезные подходы:
Всегда помните, что при работе с расширениями важно тщательно проверять, как платформа интерпретирует и применяет ваши изменения, чтобы избежать подобных неожиданных эффектов.