Разработка и Конфигурация · 13 мин
Как снять признак предопределенного элемента в 1С
Как снять признак предопределенного элемента в 1С: через конфигуратор, обработку и код. Причины ошибок, риски, проверка результата и ответы на вопросы.
Предопределенный элемент в 1С — это элемент справочника, плана счетов, плана видов характеристик или плана видов расчета, который создан в конфигураторе и жестко привязан к коду конфигурации. Снять с него признак предопределенности не так просто, как отредактировать обычный элемент: в режиме предприятия такой элемент защищен от изменения имени и удаления, а попытка переписать его программно часто вызывает ошибку. Задача возникает, когда элемент больше не нужен, создан ошибочно, мешает обмену данными или конфликтует после обновления конфигурации.
Есть три рабочих способа снять признак: удалить предопределенный элемент в конфигураторе (тогда платформа при обновлении предложит обработать связанные данные), воспользоваться специальной обработкой, изменяющей служебные поля таблицы, или снять признак программно через свойство ИмяПредопределенныхДанных. Выбор зависит от того, нужно ли сохранить сам элемент данных, есть ли доступ к конфигуратору и насколько база нагружена пользователями.
Важно понимать: предопределенность — это не отдельный реквизит элемента, а связь между записью в базе данных и описанием элемента в конфигураторе. Поэтому «снять галочку» в форме элемента нельзя в принципе — такой галочки там нет. Ниже разобраны все способы с условиями применения, рисками и проверкой результата.
Когда признак нужно снимать, а когда лучше не трогать
Типовая ситуация: в конфигурации появился предопределенный элемент, который мешает работе — например, дублирует пользовательский элемент, ломает синхронизацию с другой базой или попал в конфигурацию ошибочно при доработке. Другой частый случай — после обновления конфигурации в базе появились задвоенные элементы: один предопределенный, другой обычный с тем же наименованием, и документы ссылаются на разные записи.
Не стоит снимать признак с типовых предопределенных элементов без крайней необходимости. Код конфигурации обращается к ним по имени, и после снятия признака обращение Справочники.Номенклатура.ИмяЭлемента вернет пустую ссылку или вызовет исключение. Это приведет к ошибкам в проведении документов, формировании отчетов и обменах, которые проявятся не сразу, а в самый неподходящий момент.
Безопасные кандидаты на снятие признака: элементы, добавленные в ходе собственной доработки и больше не используемые; элементы типовой конфигурации, которые вендор сам удалил в новом релизе (тогда обновление само предложит их обработать); дубли, появившиеся после некорректного обмена.
Способ 1. Удаление элемента в конфигураторе с обновлением базы
Самый корректный метод — убрать предопределенный элемент из конфигурации. Откройте конфигуратор, найдите нужный справочник или план, перейдите на вкладку с предопределенными элементами (кнопка «Предопределенные» или аналогичная в палитре свойств объекта) и удалите нужную строку. Затем обновите конфигурацию базы данных (F7 или через меню Конфигурация → Обновить конфигурацию базы данных).
При обновлении платформа обнаружит, что в базе есть данные, связанные с удаляемым предопределенным элементом, и покажет диалог реструктуризации. В нем будет предложено либо удалить элемент данных вместе с описанием, либо оставить его как обычный (непредопределенный). Выбор «оставить» — это и есть снятие признака: элемент останется в списке, но станет обычным, его можно будет переименовать и удалить в режиме предприятия.
Ограничение способа: он требует монопольного доступа к базе для обновления конфигурации, а в типовых конфигурациях на поддержке изменение приведет к снятию объекта с полной поддержки. Если конфигурация обновляется автоматически, при следующем обновлении элемент может вернуться — учитывайте это при планировании.
- 1Сделайте выгрузку базы (Администрирование → Выгрузить информационную базу)
- 2Откройте конфигуратор, найдите объект и удалите предопределенный элемент
- 3Обновите конфигурацию базы данных (F7)
- 4В диалоге реструктуризации выберите: оставить элемент как обычный или удалить
- 5Запустите режим предприятия и проверьте элемент в списке справочника
Способ 2. Снятие признака программно через ИмяПредопределенныхДанных
У каждого объекта, который может быть предопределенным, есть свойство ИмяПредопределенныхДанных. Если присвоить ему пустую строку и записать объект, связь с описанием в конфигураторе разрывается — элемент становится обычным, но в конфигураторе его описание остается. Это удобно, когда доступ к конфигуратору ограничен или менять конфигурацию нельзя.
Пример кода для выполнения через консоль кода или внешнюю обработку:
Элемент = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуга");
Если Не Элемент.Пустая() Тогда
Объект = Элемент.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "";
Объект.Записать();
КонецЕсли;
Обратная операция — присвоение имени предопределенного элемента — позволяет, наоборот, привязать существующую запись к описанию в конфигураторе. Это полезно при устранении дублей: вместо создания нового предопределенного элемента при обновлении можно привязать уже существующий, на который ссылаются документы.
Учтите нюанс: если в конфигураторе элемент с таким именем остался, при следующем обновлении конфигурации базы данных платформа может снова создать предопределенный элемент — и в списке появится дубль. Поэтому программный способ хорош как временная мера или в связке с последующим удалением элемента из конфигурации.
Объект = СсылкаНаЭлемент.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = "";
Объект.Записать();Способ 3. Готовые обработки и работа в толстом клиенте
Существуют универсальные обработки (например, консоль кода, редакторы объектов), которые позволяют редактировать служебные свойства элемента без написания собственного кода. В такой обработке достаточно выбрать ссылку на элемент, найти свойство ИмяПредопределенныхДанных и очистить его значение, затем записать объект.
В старых конфигурациях на обычных формах, работающих в толстом клиенте, встречается еще один путь: некоторые обработки напрямую меняют значение в таблице базы. Это потенциально опасный метод — прямое изменение таблиц в обход платформы нарушает логику кэширования и может привести к рассогласованию данных. Используйте его только в файловой копии базы и только если другие способы недоступны.
Для управляемых приложений и клиент-серверных баз предпочтителен именно объектный способ через ПолучитьОбъект() и Записать(): он проходит через механизмы платформы, срабатывают подписки на события и контроль прав.
Сравнение способов
Самый чистый вариант: связь убирается и из метаданных, и из данных. Требует монопольного доступа и права изменять конфигурацию.
Быстро, без монопольного режима, но описание в конфигураторе остается — при обновлении элемент может вернуться.
Удобно для разовой операции без написания кода; результат тот же, что у программного способа, с теми же ограничениями.
Типичные проблемы и их решение
Частая ошибка — «Ошибка при вызове метода контекста (Записать): предопределенный элемент не уникален» или невозможность записать объект из-за того, что имя предопределенных данных уже занято. Это значит, что в базе уже есть другой элемент, привязанный к тому же имени в конфигураторе. Решение: найдите оба элемента (поиском по наименованию или запросом), определите, на какой ссылаются документы, и у лишнего очистите ИмяПредопределенныхДанных, а затем переназначьте ссылки через обработку поиска и замены значений.
Вторая проблема — после обновления конфигурации предопределенный элемент появляется снова. Причина в том, что его описание осталось в конфигураторе. Признак снимается только с данных, а не из метаданных, поэтому для окончательного решения элемент нужно удалить и в конфигураторе.
Третья ситуация — в списке элемент помечен как предопределенный, но в конфигураторе его нет. Такое бывает после отката конфигурации или некорректного обмена. Лечится программной очисткой ИмяПредопределенныхДанных — «осиротевшая» привязка удаляется без последствий, поскольку обращений к ней из кода уже не существует.
Проверка результата после снятия признака
После выполнения операции откройте список справочника в режиме предприятия. У обычного элемента доступны кнопки переименования и пометки удаления — попробуйте изменить наименование. Если платформа не выдает сообщение «Нельзя изменять предопределенный элемент», признак снят успешно.
Дополнительно проверьте программно: получите объект и посмотрите значение ИмяПредопределенныхДанных — для обычного элемента оно должно быть пустой строкой. Также выполните обращение по имени из конфигуратора (Справочники.Имя.ИмяЭлемента) — если элемент удален из метаданных, такого обращения в коде быть не должно; если описание осталось, убедитесь, что оно ссылается на нужную запись.
Финальный контроль — прогон ключевых операций: проведение документов, использующих справочник, формирование связанных отчетов, обмен данными, если он настроен. Ошибки, связанные с предопределенными элементами, чаще всего всплывают именно при обменах и обновлениях.
Как проверить результат
Наименование меняется, пометка удаления доступна
Платформа выдает сообщение о запрете изменения предопределенного элемента
Пустая строка
Содержит имя элемента из конфигуратора
Дубли не создаются, ошибок реструктуризации нет
Появляется новый предопределенный элемент с тем же именем
Ограничения и меры предосторожности
Любые манипуляции с предопределенными элементами выполняйте на копии базы или после выгрузки в dt. В клиент-серверном варианте выгрузку делайте средствами конфигуратора или СУБД — оба способа корректны, но восстановление из dt проще для отката точечных изменений.
Учитывайте права: изменение ИмяПредопределенныхДанных требует права на запись объекта, а работа в конфигураторе — права администратора конфигурации. В базах с разделением данных (сервис-модель) часть операций может быть заблокирована на уровне платформы.
Если конфигурация типовая и находится на поддержке, предпочтительнее дождаться исправления от разработчика или использовать расширение конфигурации вместо прямого изменения. Снятие объектов с поддержки усложняет все последующие обновления и увеличивает стоимость сопровождения.
Как выбрать действие
Частые вопросы
Что важно запомнить
Признак предопределенности снимается удалением элемента в конфигураторе либо очисткой свойства ИмяПредопределенныхДанных. Перед изменением делайте копию базы и ищите ссылки на элемент, после — проверяйте отсутствие дублей и работу ключевых операций.
Можно ли снять признак предопределенного элемента в режиме предприятия без программирования?
Штатной кнопки для этого в интерфейсе нет. Без кода задача решается только через конфигуратор (удаление элемента и обновление базы) или через готовую универсальную обработку, где свойство очищается в форме. В обоих случаях нужны соответствующие права.
Что произойдет с документами, которые ссылаются на этот элемент?
Снятие признака само по себе ссылки не разрывает: документы продолжат указывать на ту же запись, она просто станет обычным элементом. Проблемы начнутся, если после снятия признака удалить сам элемент — тогда в ссылках появятся битые значения вида «Объект не найден».
Почему после очистки свойства элемент снова стал предопределенным?
Потому что его описание осталось в конфигураторе. При обновлении конфигурации базы данных платформа синхронизирует предопределенные данные с метаданными и создает привязку заново. Чтобы изменение сохранилось, элемент нужно удалить и из конфигурации.
Как найти все предопределенные элементы в базе?
Список элементов, описанных в конфигурации, виден в конфигураторе на закладке предопределенных данных каждого объекта. Фактические привязки в базе можно проверить запросом или обработкой, читающей свойство ИмяПредопределенныхДанных у всех элементов справочника.
Опасно ли снимать признак в рабочей базе с пользователями?
Программная очистка свойства выполняется быстро и монопольного режима не требует, но в момент записи возможны блокировки при параллельной работе с тем же элементом. Обновление конфигурации базы данных, наоборот, требует завершения всех сеансов. Оптимально проводить операции в нерабочее время.
Чем снятие признака отличается от удаления элемента?
Снятие признака превращает предопределенный элемент в обычный — данные сохраняются, ссылки остаются рабочими. Удаление убирает саму запись из базы, что безопасно только при отсутствии ссылок на нее. Обычно правильная последовательность такова: снять признак, проверить ссылки, переназначить их при необходимости и только потом удалять элемент стандартной пометкой на удаление.