При работе с системой 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда после очередного обновления конфигурации, в которую вносились доработки как непосредственно в основной конфигурации, так и с помощью расширений, на формах элементов справочников или других объектов появляются задвоенные элементы. Эта проблема особенно неприятна, когда попытка удалить такой дубликат приводит к аварийному закрытию конфигуратора или ошибке о неуникальности имени. Давайте вместе разберем причины возникновения этой проблемы и рассмотрим наиболее эффективные способы ее решения, от самых безболезненных до кардинальных.
Прежде чем перейти к методам исправления, важно понять, почему возникает это задвоение. Платформа 1С при работе с расширениями использует сложный механизм взаимодействия форм, который включает в себя несколько версий:
В результате взаимодействия этих трех состояний формируется "результирующая" форма, которую мы видим в пользовательском режиме. Конфликты возникают по нескольким основным причинам:
Взаимодействие версий форм: При обновлении основной конфигурации исходная форма может измениться (например, поставщик добавил новый элемент с тем же именем, которое мы использовали в расширении, или изменил структуру формы). Система может некорректно объединить эти изменения с доработками в расширении, что и приводит к дублированию элементов.
Фиксация визуальной части: Визуальная часть формы в расширении "фиксируется" на момент ее заимствования. Если после этого поставщик конфигурации вносит изменения в ту же форму, а мы затем обновляем конфигурацию, без должной синхронизации может произойти дублирование. Платформа может добавить элементы из новой типовой формы, не распознав, что аналогичные элементы уже есть благодаря расширению или предыдущим доработкам.
Неуникальность имен: Все элементы на форме, включая реквизиты, поля ввода, кнопки и группы, должны иметь уникальные имена. Обновление может привести к ситуации, когда элемент с одним и тем же именем оказывается на форме дважды из-за конфликтующих изменений в основной конфигурации и расширении. Именно эта причина часто приводит к ошибке "имя не уникально", когда мы пытаемся внести изменения в форму после обновления.
Особенности версий платформы: Некоторые версии платформы 1С могут иметь свои особенности или даже содержать ошибки в механизмах сравнения и объединения, что иногда способствует возникновению таких проблем. Поэтому всегда полезно проверять актуальность используемой версии платформы и по возможности обновлять ее до стабильных релизов.
Теперь, когда мы понимаем корни проблемы, давайте перейдем к конкретным шагам по ее устранению.
Этот метод оказался наиболее эффективным и безболезненным для решения проблемы задвоения элементов формы. Он предполагает непосредственное вмешательство в структуру конфигурации на уровне XML-файлов. Мы настоятельно рекомендуем выполнять все действия в копии информационной базы, чтобы избежать потери данных в случае непредвиденных ошибок.
Первым шагом нам необходимо выгрузить конфигурацию в набор XML-файлов. Для этого откроем конфигуратор и выполним следующие действия:
Если в процессе выгрузки возникла ошибка, как это иногда бывает (сообщение 11), это может указывать на более глубокую проблему в структуре конфигурации. В таком случае, возможно, придется перейти к более кардинальным методам или попытаться исправить ошибки в самой конфигурации до выгрузки.
После успешной выгрузки конфигурации в файлы, нам нужно найти XML-файл, который описывает проблемную форму. Следуем по пути к нашему справочнику и его форме:
Catalogs (для справочников).ДокументыПредприятия).Forms.ФормаЭлемента).ext/form.xml. Этот файл содержит описание нашей формы, включая ее элементы и их свойства.Откроем файл form.xml с помощью обычного текстового редактора (например, Блокнота, Notepad++ или VS Code). Внутри этого файла мы увидим XML-структуру, описывающую форму. Мы будем искать задвоенные элементы.
Теперь нам предстоит найти и удалить задвоенный элемент. Как правило, элементы формы описываются в XML внутри тегов <Items>. Каждый элемент формы, такой как поле, кнопка или группа, представлен своим собственным узлом (тегом).
<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.После внесения изменений в XML-файл нам необходимо загрузить модифицированную конфигурацию обратно в 1С. Для этого:
Если все шаги были выполнены корректно, задвоенный элемент должен исчезнуть, и форма будет работать без ошибок. Этот метод подтвердил свою эффективность (сообщение 18).
Если редактирование XML-файлов по каким-то причинам невозможно (например, выгрузка прерывается с ошибкой) или кажется слишком сложным, можно прибегнуть к более кардинальному методу – удалению и повторному созданию формы. Этот подход требует больше времени на перенос доработок, но гарантированно решает проблему, "сбрасывая" состояние формы.
Сохраните расширение: Первым делом, сохраним расширение в файл. Это позволит нам не потерять все остальные доработки, не связанные с проблемной формой. Перейдем в Расширения конфигурации -> Выгрузить расширение в файл...
Удалите форму из расширения: В конфигураторе, в дереве расширения, найдем проблемную форму и удалим ее. Это уберет нашу доработанную версию формы из расширения.
Захватите форму заново: Теперь захватим (заимствуем) форму из основной конфигурации в расширение снова. При этом будет взята чистая версия формы из текущей конфигурации.
Перенесите доработки: Откроем копию нашей информационной базы (или архив с исходным расширением до удаления формы). Внимательно перенесем все доработки, которые были сделаны в этой форме, в новую заимствованную форму расширения. Это включает в себя добавление реквизитов, элементов формы, обработчиков событий и кода.
Обновите расширение формы: В редакторе формы расширения есть команда Расширения – Обновить расширение формы. Она позволяет актуализировать расширяющую форму, подтянув изменения из основной конфигурации, а затем повторно применить свои доработки. Этот шаг может помочь разрешить потенциальные конфликты и убедиться, что все изменения применены корректно.
Если задвоение произошло в форме, которая была изменена непосредственно в основной конфигурации (т.е. она находится на поддержке с возможностью изменений), процесс будет немного сложнее:
Отключите поддержку формы: В конфигураторе, для проблемной формы, временно отключим возможность изменения, либо установим режим поддержки "Объект редактируется с сохранением поддержки", чтобы иметь возможность удалить форму.
Удалите форму: Удалим проблемную форму из структуры основной конфигурации.
Заберите типовую форму: Откроем рядом типовую конфигурацию поставщика (например, из дистрибутива обновления). Из структуры типовой конфигурации перетянем (или скопируем через сравнение/объединение) нужную форму обратно в нашу конфигурацию. Это вернет нам чистую, типовую версию формы.
Верните поддержку: После того как типовая форма будет на месте, вернем ее в режим поддержки (например, "Объект редактируется с сохранением поддержки" или "Объект поставщика не редактируется").
Перенесите доработки: Теперь нам необходимо заново перенести все доработки, которые мы делали в этой форме. Это трудоемкий процесс, требующий внимательности, но он гарантирует чистоту формы.
Вариант, предложенный в сообщении 22, также является модификацией этого подхода и может быть реализован следующим образом:
Этот способ позволяет максимально автоматизировать процесс возврата типовой формы и последующего применения изменений из расширения.
Это не решение проблемы "по факту", а скорее превентивная мера, которая может помочь избежать задвоения в будущем. Если мы заранее знаем, что элемент на форме может конфликтовать с изменениями в новой версии конфигурации поставщика, можно попробовать переименовать его *до* выполнения обновления.
Например, как было предложено в сообщении 2, можно временно переименовать проблемный элемент в расширении или основной конфигурации на что-то вроде Удалить_НаименованиеПоле или Архив_НаименованиеПоле. После обновления, если дублирование все равно произошло или если новый типовой элемент появился с тем же именем, мы можем уже работать с одним из них, удалив или переименовав другой. Однако, попытка переименовать элемент *после* обновления, когда ошибка уже проявилась, может привести к той же ошибке о неуникальности имени (сообщение 6), что делает этот подход менее надежным для исправления существующей проблемы.
Для минимизации рисков возникновения подобных проблем в будущем, а также для более эффективного их устранения, рассмотрим дополнительные полезные рекомендации:
Если форма была заимствована в расширение, а затем обновлена в основной конфигурации, в редакторе формы расширения доступна команда Расширения – Обновить расширение формы. Мы можем попробовать использовать ее, чтобы актуализировать расширяющую форму, подтянув изменения из основной конфигурации, а затем повторно применить свои доработки. Это часто помогает разрешить мелкие конфликты и убрать задвоения, не прибегая к редактированию XML.
При добавлении новых реквизитов, элементов формы или обработчиков событий в расширении крайне рекомендуется использовать префикс, заданный для расширения (например, _МОИ_). Это гарантирует уникальность имен новых объектов и значительно снижает вероятность возникновения конфликтов при обновлениях, а также при использовании нескольких расширений в одной базе. Например, вместо ПолеДопИнфо создавайте _МОИ_ПолеДопИнфо.
По возможности старайтесь избегать полного заимствования формы в расширение, если вам нужны лишь небольшие изменения. Рассмотрите вариант программного добавления реквизитов или элементов формы через код расширения при открытии формы. Это может значительно снизить количество потенциальных конфликтов при обновлениях, так как расширение будет динамически добавлять элементы, а не статически изменять структуру формы.
Если несколько расширений затрагивают один и тот же объект конфигурации (например, одну и ту же форму), это значительно увеличивает риск конфликтов. Желательно по возможности объединять доработки, касающиеся одного объекта, в одном расширении или тщательно управлять порядком применения расширений, чтобы избежать пересечений и неожиданного поведения.
После обновления конфигурации обязательно проверьте, не изменился ли режим совместимости для всей конфигурации и для расширения. Если расширение начинает выдавать ошибку, связанную с РежимСовместимости, необходимо актуализировать его в расширении или снять контроль за этим свойством, чтобы оно соответствовало текущему режиму совместимости основной конфигурации.
И последнее, но не менее важное: перед выполнением любых операций по обновлению конфигурации, изменению форм или работе с расширениями всегда делайте полную резервную копию информационной базы. Это позволит нам восстановить систему в случае непредвиденных ошибок и избежать потери данных. Резервное копирование — это золотое правило работы с 1С. Для автоматизации регулярного создания бэкапов, тестирования и установки обновлений в автоматическом режиме применяется программа для резервного копирования и обновления баз 1С.
Мы рассмотрели различные подходы к решению проблемы задвоения элементов на форме после обновления в 1С. Наиболее эффективным и проверенным методом является прямое редактирование XML-файлов конфигурации. Однако, в зависимости от ситуации, могут потребоваться и более кардинальные меры, такие как полное пересоздание формы. Помните о превентивных мерах и всегда работайте в копии базы, чтобы сохранить работоспособность вашей системы.