Как исправить задвоение элементов на форме в 1С после обновления, если форма доработана в конфигурации и расширении?

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

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

Понимание причин задвоения элементов формы

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

  1. Исходная форма из основной конфигурации поставщика.
  2. "Сохраненная" форма — это снимок формы в тот момент, когда она была заимствована в расширение.
  3. Форма из самого расширения, содержащая наши доработки.

В результате взаимодействия этих трех состояний формируется "результирующая" форма, которую мы видим в пользовательском режиме. Конфликты возникают по нескольким основным причинам:

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

Метод 1: Прямое редактирование XML-файлов конфигурации (Подтвержденное решение)

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

  1. Выгрузка конфигурации в XML-файлы

    Первым шагом нам необходимо выгрузить конфигурацию в набор XML-файлов. Для этого откроем конфигуратор и выполним следующие действия:

    • Перейдем в меню Конфигурация -> Выгрузить конфигурацию в файлы...
    • В открывшемся диалоговом окне выберем тип файлов XML-файлы.
    • Укажем пустую папку, в которую будет произведена выгрузка. Процесс может занять некоторое время в зависимости от размера конфигурации. Дождемся его полного завершения.

    Если в процессе выгрузки возникла ошибка, как это иногда бывает (сообщение 11), это может указывать на более глубокую проблему в структуре конфигурации. В таком случае, возможно, придется перейти к более кардинальным методам или попытаться исправить ошибки в самой конфигурации до выгрузки.

  2. Поиск и редактирование файла формы

    После успешной выгрузки конфигурации в файлы, нам нужно найти XML-файл, который описывает проблемную форму. Следуем по пути к нашему справочнику и его форме:

    • Откроем папку, куда мы выгрузили конфигурацию.
    • Перейдем в подпапку Catalogs (для справочников).
    • Найдем подпапку, соответствующую нашему справочнику (например, ДокументыПредприятия).
    • Внутри папки справочника перейдем в Forms.
    • Далее найдем подпапку с именем нашей формы (например, ФормаЭлемента).
    • И, наконец, внутри этой папки будет лежать файл ext/form.xml. Этот файл содержит описание нашей формы, включая ее элементы и их свойства.

    Откроем файл form.xml с помощью обычного текстового редактора (например, Блокнота, Notepad++ или VS Code). Внутри этого файла мы увидим XML-структуру, описывающую форму. Мы будем искать задвоенные элементы.

  3. Удаление задвоенных узлов в XML-файле

    Теперь нам предстоит найти и удалить задвоенный элемент. Как правило, элементы формы описываются в XML внутри тегов <Items>. Каждый элемент формы, такой как поле, кнопка или группа, представлен своим собственным узлом (тегом).

    • Используем функцию поиска в текстовом редакторе (обычно Ctrl+F) и введем наименование задвоившегося реквизита или элемента формы.
    • Мы обнаружим несколько совпадений. Нам нужно идентифицировать узлы, которые относятся к дублирующемуся элементу. Например, если у нас задвоилось поле ввода, мы можем увидеть два блока, похожих на следующий:
      
      <Item xsi:type="FormField" name="Наименование" id="1">
          <ExtendedTooltip xsi:type="HTMLTooltip" name="НаименованиеРасширеннаяПодсказка"/>
          <Type>
              <v8:Type>xs:string</v8:Type>
              <v8:StringQualifiers>
                  <v8:Length>100</v8:Length>
                  <v8:AllowedLength>Variable</v8:AllowedLength>
              </v8:StringQualifiers>
          </Type>
          <EditMode>EnterOnInput</EditMode>
          <ContextMenu name="НаименованиеКонтекстноеМеню"/>
          <ExtendedTooltip name="НаименованиеРасширеннаяПодсказка"/>
      </Item>
      
    • Обычно, когда элементы задваиваются, один из них является "правильным" (тот, что был изначально или тот, который мы хотим сохранить), а второй - "лишним" дубликатом. Их могут отличать id, порядок следования или наличие каких-либо специфических свойств.
    • Аккуратно удалим весь узел (включая открывающий и закрывающий теги) того элемента, который, по нашему мнению, является дубликатом. Убедимся, что мы удаляем только один из дубликатов и не затрагиваем другие элементы формы.
    • После удаления сохраним изменения в файле form.xml.
  4. Загрузка конфигурации из XML-файлов

    После внесения изменений в XML-файл нам необходимо загрузить модифицированную конфигурацию обратно в 1С. Для этого:

    • В конфигураторе перейдем в меню Конфигурация -> Загрузить конфигурацию из файлов...
    • Укажем ту же папку, куда мы ранее выгружали конфигурацию.
    • Дождемся завершения процесса загрузки.
    • После загрузки, обновим конфигурацию базы данных (F7).

    Если все шаги были выполнены корректно, задвоенный элемент должен исчезнуть, и форма будет работать без ошибок. Этот метод подтвердил свою эффективность (сообщение 18).

Метод 2: Кардинальное пересоздание формы

Если редактирование XML-файлов по каким-то причинам невозможно (например, выгрузка прерывается с ошибкой) или кажется слишком сложным, можно прибегнуть к более кардинальному методу – удалению и повторному созданию формы. Этот подход требует больше времени на перенос доработок, но гарантированно решает проблему, "сбрасывая" состояние формы.

Для формы, доработанной в расширении:

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

  2. Удалите форму из расширения: В конфигураторе, в дереве расширения, найдем проблемную форму и удалим ее. Это уберет нашу доработанную версию формы из расширения.

  3. Захватите форму заново: Теперь захватим (заимствуем) форму из основной конфигурации в расширение снова. При этом будет взята чистая версия формы из текущей конфигурации.

  4. Перенесите доработки: Откроем копию нашей информационной базы (или архив с исходным расширением до удаления формы). Внимательно перенесем все доработки, которые были сделаны в этой форме, в новую заимствованную форму расширения. Это включает в себя добавление реквизитов, элементов формы, обработчиков событий и кода.

  5. Обновите расширение формы: В редакторе формы расширения есть команда Расширения – Обновить расширение формы. Она позволяет актуализировать расширяющую форму, подтянув изменения из основной конфигурации, а затем повторно применить свои доработки. Этот шаг может помочь разрешить потенциальные конфликты и убедиться, что все изменения применены корректно.

Для формы, доработанной в основной конфигурации:

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

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

  2. Удалите форму: Удалим проблемную форму из структуры основной конфигурации.

  3. Заберите типовую форму: Откроем рядом типовую конфигурацию поставщика (например, из дистрибутива обновления). Из структуры типовой конфигурации перетянем (или скопируем через сравнение/объединение) нужную форму обратно в нашу конфигурацию. Это вернет нам чистую, типовую версию формы.

  4. Верните поддержку: После того как типовая форма будет на месте, вернем ее в режим поддержки (например, "Объект редактируется с сохранением поддержки" или "Объект поставщика не редактируется").

  5. Перенесите доработки: Теперь нам необходимо заново перенести все доработки, которые мы делали в этой форме. Это трудоемкий процесс, требующий внимательности, но он гарантирует чистоту формы.

Вариант, предложенный в сообщении 22, также является модификацией этого подхода и может быть реализован следующим образом:

  1. Сохраняем расширение в файл.
  2. Включаем возможность изменения у формы в настройке поддержки (если форма в основной конфигурации).
  3. Удаляем форму.
  4. Сравнением объединением с конфигурацией поставщика забираем форму обратно.
  5. Возвращаем поддержку.
  6. Загружаем расширение из файла.

Этот способ позволяет максимально автоматизировать процесс возврата типовой формы и последующего применения изменений из расширения.

Метод 3: Превентивное переименование элемента до обновления

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

Например, как было предложено в сообщении 2, можно временно переименовать проблемный элемент в расширении или основной конфигурации на что-то вроде Удалить_НаименованиеПоле или Архив_НаименованиеПоле. После обновления, если дублирование все равно произошло или если новый типовой элемент появился с тем же именем, мы можем уже работать с одним из них, удалив или переименовав другой. Однако, попытка переименовать элемент *после* обновления, когда ошибка уже проявилась, может привести к той же ошибке о неуникальности имени (сообщение 6), что делает этот подход менее надежным для исправления существующей проблемы.

Дополнительные рекомендации и превентивные меры

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

  1. Использование команды "Обновить расширение формы"

    Если форма была заимствована в расширение, а затем обновлена в основной конфигурации, в редакторе формы расширения доступна команда Расширения – Обновить расширение формы. Мы можем попробовать использовать ее, чтобы актуализировать расширяющую форму, подтянув изменения из основной конфигурации, а затем повторно применить свои доработки. Это часто помогает разрешить мелкие конфликты и убрать задвоения, не прибегая к редактированию XML.

  2. Применение префиксов

    При добавлении новых реквизитов, элементов формы или обработчиков событий в расширении крайне рекомендуется использовать префикс, заданный для расширения (например, _МОИ_). Это гарантирует уникальность имен новых объектов и значительно снижает вероятность возникновения конфликтов при обновлениях, а также при использовании нескольких расширений в одной базе. Например, вместо ПолеДопИнфо создавайте _МОИ_ПолеДопИнфо.

  3. Минимизация заимствования форм

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

  4. Аккуратная работа с несколькими расширениями

    Если несколько расширений затрагивают один и тот же объект конфигурации (например, одну и ту же форму), это значительно увеличивает риск конфликтов. Желательно по возможности объединять доработки, касающиеся одного объекта, в одном расширении или тщательно управлять порядком применения расширений, чтобы избежать пересечений и неожиданного поведения.

  5. Проверка режима совместимости

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

  6. Резервное копирование

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

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

← На главную