1с предопределенный элемент не уникален

Обновлено: 04.07.2024

Простая обработка для работы с предопределенными значениями.

Позволяет сопоставить элементы ИБ с предопределенными в конфигурации элементами.

Позволяет проверить вцелом по конфигурации наличие задублированных (нескольких элементов ИБ, привязанных к одному предопределенному элементу - ошибка "Предопределенный элемент не уникален" ) и пропущенных элементов (предопределенные элементы, которым не сопоставлены элементы ИБ - ошибка "Предопределенный элемент отсутствует в данных" ). Такие элементы могли возникнуть при обменах или сбоях и приводят ошибкам в работе конфигурации.

Можно просто просмотреть текущие значения, можно сделать любые необходимые изменения.

Порядок работы:

1. Запускаем обработку.

2. Выбираем тип (справочник, план счетов, ПВХ, ПВР).

3. Выбираем сам справочник выбранного типа.

4. В табличной части обработки появляются все предопределенные элементы, имеющиеся в ИБ, и описанные в конфигурации.

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

( В платформе 8.3.3 - 8.3.4 отображуются только элементы, которые есть в ИБ. В этом случае, если нужного предопределенного элемента в списке нет, значит, по каким-то причинам он не создался при изменении конфигурации либо его удалили пользователи. Нажимаем кнопочку добавить, указываем имя элемента и назначем ему элемент из ИБ).

5. Устанавливаем новые значения для нужных предопределенных элементов.

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

6. Выполняем переназначение нажатием кнопочки "Выполнить переназначения элементов".

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

Режимы массовой проверки корректности указания предопределенных элементов:

Проверка дублей (ошибка "Предопределенный элемент не уникален"):

При нажатии конопки "Проверить дубли" обработка проверит все справочники, планы счетов, ПВХ и ПВР и выведет список таблиц с задвоенными элементами с указанием количества задвоенных элементов.

После этого необходимо проверить отдельно объекты, для которых найдены ошибки.

Проверка пропущенных (ошибка "Предопределенный элемент отсутствует в данных"):

При нажатии кнопки "Проверить пропущенные" обработка проверит все справочники, планы счетов, ПВХ и ПВР и выведет перечень предопределённых элементов, которым не сопоставлены данные ИБ. (В платформе 8.3.3 - 8.3.4 для выполнения данной проверки необходимо предварительно в режиме конфигуратора выгрузить файлы конфигурации в каталог на сервере. С версии обработки 1.3.3 и платформы 8.3.5 предварительная выгрузка данных не нужна).

Для понимания принципов работы предопределенных данных и возможных причин ошибок рекоммендую статью Ошибки в предопределённых элементах Для анализа других ошибок в ведении учета рекоммендую отчет Комплексная проверка ведения учета. Он позволяет выявить основные проблемы в данных ИБ: расхождения данных в связанных регистрах, отрицательные остатки по номеклатуре, зависшие суммовые остатки с нулевым количеством и т.д.

upd. Версия 1.2 Добавлена возможность поиска задвоений в целом по конфигурации. Доступно с 8.3.5.

upd. Версия 1.3 Добавлена возможность поиска в целом по конфигурации отсутствующих элементов .

upd. Версия 1.3.2. Добавлена обработка предопределенности строк стандартных табличных частей для устранения в 8.3.5 без режима совместимости ошибок "Не предопределенные объекты не могут иметь предопределенные записи видов субконто" и "Не предопределенные объекты не могут иметь предопределенные записи ведущих видов расчетов" (подробнее в комментариях (9),(10),(11),(18),(19))

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

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

upd. Версия 1.3.5. Исправлена ошибка при работе в 8.3.10.

Типичные вопросы при работе с предопределенными данными

При работе с предопределенными данными могут встречаться следующие ошибки:

  • Попытка обратиться к предопределенному элементу приводит к ошибке "Предопределенный элемент отсутствует в данных". Возможные причины появления такой ошибки:
    • Это периферийный узел и предопределенные данные из центрального узла еще не загружены.
    • Область информационной базы инициализирована, когда обновление предопределенных данных отключено на уровне информационной базы или на уровне проблемного объекта метаданных.
    • Предопределенные данные удалены.
    • У предопределенных данных очистили значение реквизита "ИмяПредопределенныхДанных".
    • Предопределенные элементы созданы в режиме "ОбменДанными.Загрузка = Истина". Например, при обмене данными в РИБ.

    Анализ причин ошибок при работе с предопределенными данными и способы их устранения.

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

    Отсутствие предопределенных элементов в данных

    Необходимо в журнале регистрации выполнить отбор по проблемному объекту метаданных и следующим событиям:

    • Данные:
      • Изменение предопределенных данных,
      • Удаление предопределенных данных,
      • Установка инициализации предопределенных данных,
      • Обновление предопределенных данных,
      • Установка обновления предопределенных данных.

      По событиям в списке можно понять, почему предопределенный элемент не обнаружен.
      Если в журнале имеется события " Данные. Изменение предопределенных данных ", у которых новое имя предопределенных данных – пустая строка. Это значит, что пользователь или код на встроенном языке очистил имя предопределенных данных, сделав элемент не предопределенным. Для восстановления элемента достаточно вернуть свойству ИмяПредопределенныхДанных старое значение. Желательно доработать конфигурацию таким образом, чтобы не допустить повторение такой ситуации: изменить права, модифицировать код на встроенном языке.
      Если в конфигурации есть событие " Данные. Удаление предопределенных данных ", то это означает, что предопределенные данные удалены пользователем или из встроенного языка. Для исправления необходимо создать недостающий предопределенный элемент. Изменить конфигурацию таким образом, чтобы не допускать удаления используемых предопределенных данных.
      Если в журнале имеется событие " Данные. Установка инициализации предопределенных данных ", в которых установлен признак инициализации предопределенных данных, то это означает, что из встроенного языка был установлен признак инициализации предопределенных данных, а предопределенные элементы не созданы (все или частично). Для исправления необходимо модифицировать конфигурацию, чтобы создавались все предопределенные данные, либо не было обращений к отсутствующим данным.
      Если в журнале имеется событие " ИнформационнаяБаза. Обновление предопределенных данных ", в котором есть комментарий "Обновление предопределенных данных отключено". Это означает, что в базе данных на уровне ИБ, узла или объекта метаданных отключено автоматическое обновление предопределенных данных. В таком случае платформа не выполняет реструктуризацию предопределенных данных. Для выяснения источника проблемы необходимо:

      Дублирование предопределенных данных.

      Дубли могут возникать только в режиме загрузки данных (ОбменДанными.Загрузка = Истина). В этом случае контроль уникальности предопределенных будет отключен.
      Если в журнале регистрации есть записи " Данные. Добавление предопределенных данных ", значение ИмяПредопределенныхДанных у которых приводит к дублю. Это означает, что дубли предопределенных данных созданы из встроенного языка, например, были загружены при обмене данными.
      Если в журнале регистрации есть записи " Данные. Изменение предопределенных данных ", значение НовоеИмяПредопределенныхДанных у которых приводит к дублю. Это означает, что дубли предопределенных данных созданы пользователем или из встроенного языка, например, были загружены при обмене данными или в форме элемента некорректно установлен режим загрузки и пользователь указал дублирующее имя.
      В этих случаях для исправления ошибки необходимо определить, какой элемент является корректным (например, определив ссылки на него) и ненужный элемент сделать обычным (не предопределенным, очистив поле ИмяПредопределенныхДанных ). Обязательно перед удалением элемента проверьте необходимость заменить ссылки с удаляемого предопределенного элемента на корректную ссылку.

      Рекомендации по работе с предопределенными данными

      Если вы не планируете самостоятельно управлять предопределенными данными и ожидаете, что они всегда есть в базе данных, то вам следует:

      • Ограничить права доступа на предопределенные данные таким образом, чтобы было невозможно их удалять или очищать свойство ИмяПредопределенныхДанных .
      • Избегать модификации предопределенных данных в привилегированном режиме.
      • Избегать модификации в режиме загрузки данных, когда свойство " ОбменДанными.Загрузка " установлено в " Истина ".
      • Не отключать автоматическое обновление предопределенных данных.

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

      Особенности предопределенных элементов объектов метаданных при работе с отключенным режимом совместимости

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

      Общие сведения

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

      Данное свойство может принимать следующие значения:

      Если объекту данных установить пустое значение свойства, то он станет обычным, не предопределенным, объектом.

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

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

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

      Предопределенные элементы можно редактировать, удалять, помечать на удаление. Имеются специальные права для управления ограничениями на удаление предопределенных.

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

      В результате при обращении к предопределенному элементу А будет возвращен существовавший ранее объект данных А.

      Свойство ИмяПредопределенныхДанных доступно в запросах (поле выбора и в условиях), в формах, таблицах и др. Данное свойство обладает особенностями сортировки: сортировка выполняется по внутреннему ключу, а не по строке.

      Работа с разделителями

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

      Рассмотрим работы с предопределенными элементами с различными режимами разделения на примере справочника.

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

      • Предопределенные элементы уже были созданы (проинициализированы) ранее.
      • Отключено автоматическое обновление предопределенных данных.

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

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

      • Предопределенные элементы уже были созданы (проинициализированы) ранее.
      • Отключено автоматическое обновление предопределенных данных.

      Внутренний идентификатор

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

      Связь предопределенного элемента с метаданными осуществляется через свойство ИмяПредопределенныхДанных .

      Обновление конфигурации базы данных

      При отключении режима совместимости 8.3.2 или ниже:

      • Изменяется структура таблиц. Добавляются новые служебные таблицы. Это требует монопольного доступа к информационной базе
      • Существующие предопределенные элементы модифицируются, внутренние идентификаторы не изменяются. Такие элементы могут безболезненно возвращены к режиму совместимости 8.3.2 или ниже.
      • Включаются новые возможности по работе с предопределенными элементами.

      При любом обновлении конфигурации с отключенным режимом совместимости (данные действия выполняются только если режим обновления предопределенных элементов требует обновления предопределенных данных):

      • Создаются новые предопределенные элементы, которые были добавлены по отношению к конфигурации базы данных. Например: Если в конфигурации базы данных есть предопределенный элемент с именем А и добавили предопределенный элемент с именем Б в конфигурации будет создан предопределенный элемент с именем Б. Предопределенный элемент с именем А не будет создан, даже если он был удален пользователем из данных. Предопределенные элементы создаются только в тех областях, которые были проинициализированы: либо пользователь уже обращался к предопределенным данным из этой области, либо с помощью специального метода языка ИнициализироватьПредопределенныеДанные().
      • Удаленные по отношению к конфигурации базы данных предопределенные элементы помечаются на удаление и у них сбрасывается признак предопределенного. Например: в конфигурации базы данных имеются элементы А и Б и в конфигурации удален элемент Б. в данных при реструктуризации объекты данных, связанные с элементом Б (если они есть) будут помечены на удаление и у него будет сброшен признак предопределенного. Свойство ИмяПредопределенныхДанных будет пустым.
      • Модифицированные в конфигурации предопределенные элементы, модифицируются в данных, если они не редактировались пользователем.

      При включении режима совместимости:

      • Изменяется структура таблиц. Удаляются служебные таблицы. Это требует монопольного доступа к ИБ
      • Существующие предопределенные элементы проверяются на возможность возврата к режиму совместимости 8.3.2 или ниже. Если возврат невозможен – в конфигураторе выводится соответствующее предупреждение. Несовместимые предопределенные элементы будут помечены на удаление и будет сброшен признак предопределенного элемента. Недостающие предопределенные элементы будут созданы.
      • Выключаются новые возможности по работе с предопределенными элементами.

      Поведение идентификаторов предопределенных элементов при копировании и объединении конфигураций

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

      Теперь рассмотрим, как описанные принципы влияют на поведение предопределенных элементов в различных механизмах платформы "1С:Предприятие 8".

      Объединение конфигураций

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

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

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

      Если ссылок много, а дальнейшие объединения с другой конфигурацией не предполагаются (в описываемом сценарии это не так, но, может, вы просто хотите однократно добавить в конфигурацию некоторые объекты из другой), можно поступить иначе. При объединении для предопределенных данных установить правило Объединять с приоритетом. (приоритет будет влиять на порядок и место в иерархии предопределенных элементов с одинаковым идентификатором). После выполнения объединения в конфигурации будут присутствовать оба элемента, и старый и новый. Новый можно удалить (до выполнения обновления конфигурации базы данных). Главное, только их не перепутать. Для этого перед сравнением / объединением можно в основной конфигурации временно переименовать элемент, а потом вернуть обратно. При таком алгоритме, предопределенные элементы конфигурации из файла, которые не имеют аналогов, будут добавлены, а "конфликтные" нет.

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

      Однако различия в предопределенных данных не всегда приводят к подобным проблемам. Рассмотрим другой возможный сценарий. Вы выгружаете конфигурацию в файл, затем редактируете ее где-то в стороне, например, дома. В процессе редактирования добавляются новые предопределенные элементы и, возможно, удаляются или редактируются существующие. Затем выполняется объединение новой версии с оригинальной конфигурацией. В этом случае можно оставить правило объединения Взять из файла . Как уже отмечалось, в процессе перемещения между различными конфигурациями идентификаторы элементов не изменяются, и все старые элементы вернуться со своими оригинальными идентификаторами.

      Режимы обновления предопределенных данных

      С целью более удобной организации обмена предопределенными данными реализован механизм управления режимами обновления предопределенных данных. Режим обновления предопределенных задается отдельно для каждого объекта метаданных.

      Режим обновления можно задать:

      • В метаданных, с помощью свойства ОбновлениеПредопределенныхДанных .
      • В данных, с помощью метода УстановитьОбновлениеПредопределенныхДанных .

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

      • Сначала значения Авто в метаданных и в данных подменяются ОбновлятьАвтоматически в центральном узле и в НеОбновлятьАвтоматически в периферийных узлах.
      • Затем по условию <Значение в данных> И <Значение в метаданных> определяется необходимость обновлять предопределенные.

      Конфигурация центрального узла:

      Значение в метаданных – ОбновлятьАвтоматически .

      Значение в данных – Авто .

      Значение в данных подменяется на ОбновлятьАвтоматически .

      ОбновлятьАвтоматически И ОбновлятьАвтоматически = ОбновлятьАвтоматически .

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

      Конфигурация периферийного узла:

      Значение в метаданных – Авто .

      Значение в данных – ОбновлятьАвтоматически .

      Значение в метаданных подменяется на НеОбновлятьАвтоматически .

      НеОбновлятьАвтоматически И ОбновлятьАвтоматически = НеОбновлятьАвтоматически.

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

      Данные режимы позволяют установить дополнительные правила для удобного обмена предопределенными данными.

      Если итоговый режим равен ОбновлятьАвтоматически :

      • Предопределенные элементы обрабатываются при реструктуризации.
      • Предопределенные элементы создаются при первом обращении к таблице, если они не создавались до этого.
      • Предопределенные элементы создаются при вызове метода ИнициализироватьПредопределенныеДанные() , если они не создавались до этого.

      Если итоговый режим равен НеОбновлятьАвтоматически :

      • Предопределенные элементы не обрабатываются при реструктуризации
      • Предопределенные элементы не создаются при первом обращении к таблице.
      • Предопределенные элементы не создаются при вызове метода ИнициализироватьПредопределенныеДанные .

      Обмен данными

      Предопределенные объекты данных передаются по аналогии с другими объектами данных.

      Рассмотрим следующий сценарий. В обмене участвуют две информационные базы, имеющие независимые (разные) конфигурации. В этих конфигурациях есть справочники, между которыми установлена связь. В обеих конфигурациях мы добавили предопределенный элемент, имеющий идентичное имя. В конфигурации 1 обновление предопределенных для этих справочников выполняется автоматически, а в конфигурации 2 автоматическое обновление предопределенных не выполняется. При обновлении конфигурации (при первом обращении или при инициализации информационной базы) предопределенные элементы будут созданы в конфигурации 1 и не будут созданы в конфигурации 2. После формирования обменного пакета из конфигурации 1 в конфигурацию 2 предопределенные элементы передаются вместе с другими объектами данных и автоматически связываются по имени предопределенного.

      1. Предопределенные данные - это данные, созданные в Конфигураторе. Такие данные нужны, когда на них завязана логика программы, т.е. когда они прописаны (или предполагается, что будут прописаны) в программном коде. Предопределенные данные в чем-то похожи на перечисления.

      2. Предопределенные данные бывают у справочников (элементы и группы), планов счетов (счета), планов видов расчета (виды расчета), планов видов характеристик (свойства, виды субконто, права, настройки - в зависимости от смысла ПВХ). Для упрощения изложения предопределенные данные ниже будут называться предопределенными элементами.

      3. Обращение в программном коде к предопределенным элементам нужно осуществлять только по его имени, которое задается при создании элемента в Конфигураторе (не путать с кодом и наименованием).

      4. Код и наименование, родителя предопределенного элемента пользователь может изменить. Удалить и пометить на удаление предопределенный элемент нельзя (в том числе программно).

      5. Имя элемента в режиме «Предприятие» прочитать невозможно (пока способ не найден).

      6. В подчиненных справочниках нельзя ввести предопределенные элементы.

      7. Можно ввести предопределенные элементы и группы, если объект иерархический с иерархией групп и элементов.

      8. В конфигураторе для предопределенных элементов можно заполнить только имя, код, наименование и указать родителя (для иерархических объектов). Если у предопределенного элемента нужно заполнить другие реквизиты, то это нужно сделать в программном модуле, например, ПриНачалеРаботыСистемы или в Стартовом помощнике и запретить их изменять (событие ПередЗаписью, ПриОткрытии).

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

      10. У предопределенных данных есть обычная Ссылка с нормальным уникальным идентификатором.

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

      Читайте также: