Почему дублируется штрихкод в печатной форме, перенесенной в расширение 1С, и как это исправить?

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

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

Анализируем проблему: дублирование изображений в макете расширения

Рассмотрим типовую ситуацию, когда мы помещаем макет печатной формы (например, накладной) в расширение. В этом макете присутствует картинка, скажем, штрихкод, которая имеет имя «КартинкаШтрихкода». В типовом коде есть функциональность, позволяющая управлять видимостью этого штрихкода – если соответствующая опция не установлена, картинка должна быть удалена программно. Однако, после незначительных изменений в макете расширения (например, корректировка выравнивания ячеек) и даже при выполнении кода по удалению, штрихкод все равно выводится, а иногда даже появляется его дубликат с именем «D2».

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

Выясняем причину: механизмы объединения макетов в 1С

Для того чтобы понять, почему происходит дублирование, нам необходимо обратиться к механизмам работы 1С с расширениями и, в частности, к способам расширения макетов табличных документов. Платформа 1С предоставляет два основных режима для макетов в расширениях: «Объединять» и «Замещать».

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

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

Таким образом, когда мы получаем макет из расширения, 1С фактически *объединяет* его с оригинальным макетом, а не полностью заменяет. Если при этом она видит "свою" картинку в основном макете и "аналогичную, но потенциально измененную" картинку в макете расширения, она может решить, что это две разные картинки, и вывести обе.

Решаем проблему: проверенные методы

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

1. Исключение картинки из макета расширения (решение автора)

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

  1. Открываем макет в расширении: Переходим в конфигураторе в наше расширение, находим и открываем нужный макет печатной формы (например, макет накладной).
  2. Удаляем проблемную картинку: Находим на макете изображение штрихкода (или любой другой графический элемент, который дублируется) и удаляем его.
  3. Сохраняем расширение: Сохраняем изменения в расширении.

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

Этот подход особенно полезен, когда изображение само по себе не требует изменений в расширении, а необходимо лишь управлять его видимостью.

2. Использование режима "Замещать" для макета в расширении

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

  1. Открываем свойства макета в расширении: В дереве объектов расширения находим нужный макет печатной формы. Правой кнопкой мыши вызываем контекстное меню и выбираем пункт "Свойства" или открываем палитру свойств.
  2. Меняем режим объединения: В свойствах макета находим параметр, отвечающий за режим объединения (часто называется "Режим объединения" или "Поведение") и устанавливаем его в значение "Замещать".
  3. Сохраняем расширение: Сохраняем изменения.

Почему это работает: При режиме "Замещать" платформа полностью игнорирует оригинальный макет из основной конфигурации и использует исключительно версию макета из расширения. Это гарантирует, что на печать будет выведен только тот макет, который вы подготовили в расширении, со всеми его элементами, и без риска дублирования из-за объединения.

Данный метод подходит, когда изменения макета в расширении являются существенными, и вы хотите полностью контролировать его содержимое, не допуская влияния оригинального макета.

3. Управление видимостью с помощью различных областей макета

Вместо того чтобы программно удалять картинку или полагаться на сложные механизмы объединения, можно реализовать более надежный способ управления видимостью элементов – через использование различных областей макета.

  1. Определяем области в макете расширения: В макете печатной формы, находящемся в расширении, создаем две или более именованные области:
    • Одна область будет содержать штрихкод (например, "ОбластьСоШтрихкодом").
    • Другая область будет идентичной по структуре, но без штрихкода (например, "ОбластьБезШтрихкода").
    Важно, чтобы обе области были корректно оформлены и включали все необходимые данные, кроме самого штрихкода в соответствующей области.
  2. Выводим нужную область программно: В коде, который формирует печатную форму, мы используем условную логику для вывода нужной области в зависимости от того, требуется ли штрихкод.

Пример кода:


Функция ПечатьНакладной(...)

    // Получаем макет из расширения (или основной конфигурации, если макет не изменен)
    Макет = ПолучитьМакет("МакетНакладной"); 

    // ... Заполнение данных ...

    Если ПараметрыПечати.ВыводитьШтрихкод Тогда
        // Выводим область, которая содержит штрихкод
        ТабДок.Вывести(Макет.ПолучитьОбласть("ОбластьСоШтрихкодом"));
    Иначе
        // Выводим область, которая НЕ содержит штрихкод
        ТабДок.Вывести(Макет.ПолучитьОбласть("ОбластьБезШтрихкода"));
    КонецЕсли;

    // ... Продолжение формирования формы ...

    Возврат ТабДок;
КонецФункции;

Почему это работает: Этот подход полностью обходит проблемы, связанные с программным удалением графических элементов или непредсказуемым поведением при объединении. Мы заранее готовим все возможные варианты макета и просто выбираем нужный. Это делает код более предсказуемым и устойчивым к изменениям платформы.

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

Резюме и рекомендации

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

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

  1. Использование режима «Замещать» для макета в расширении, что обеспечивает полное переопределение типового макета.
  2. Применение различных областей макета для условного вывода содержимого, что является гибким и устойчивым методом управления видимостью элементов.

Всегда помните, что при работе с расширениями важно тщательно проверять, как платформа интерпретирует и применяет ваши изменения, чтобы избежать подобных неожиданных эффектов.

← На главную