Почему предопределенные элементы справочника в 1С 8.3 не видны в режиме «Предприятие»?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При обновлении типовых конфигураций (например, «Бухгалтерия предприятия 3.0») разработчики и администраторы баз данных часто сталкиваются со странным поведением платформы «1С:Предприятие 8.3». В конфигураторе для справочника задано несколько десятков предопределенных элементов, однако при запуске программы в режиме «Предприятие» или при выполнении запроса к базе данных отображается лишь малая их часть. Параллельно с этим система может выдавать предупреждения о том, что код справочника стал неуникальным.

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

Разберем причину: эволюция предопределенных элементов в 1С 8.3

Чтобы понять, куда «исчезают» элементы, проанализируем разницу в архитектуре платформ 1С 8.2 и 1С 8.3. В старых версиях платформы (8.2 и ранее) связь между конфигурацией и базой данных была жесткой. Если элемент создавался в конфигураторе как предопределенный, платформа при первом же запуске принудительно создавала его в таблице базы данных. Удалить или отредактировать ключевые свойства такого элемента в пользовательском режиме было невозможно.

Начиная с версии 1С 8.3, разработчики кардинально изменили эту логику для поддержки облачных технологий (включая работу в сервисе «1С:Фреш») и повышения гибкости систем. Теперь предопределенные элементы существуют в двух разных плоскостях:

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

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

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

Рассмотрим основные факторы, из-за которых в режиме «Предприятие» отображается лишь часть предопределенных элементов:

  1. Свойство «Обновление предопределенных данных». У каждого справочника в конфигураторе есть свойство ОбновлениеПредопределенныхДанных. Оно может принимать три значения:
    • Автоматически — элементы создаются сразу при обновлении конфигурации базы данных.
    • Не обновлять автоматически — элементы базы данных не создаются и не обновляются автоматически. Это стандартное поведение для подчиненных узлов РИБ (распределенных информационных баз), чтобы избежать конфликтов идентификаторов (UUID).
    • Управлять — логика создания элементов перекладывается на плечи разработчика конфигурации.
  2. Программная инициализация по требованию. В типовой конфигурации «Бухгалтерия предприятия 3.0» для многих справочников (включая ПрочиеДоходыИРасходы) установлено управление обновлением. Платформа и программные механизмы БСП (Библиотеки стандартных подсистем) создают элементы только тогда, когда в программе включаются соответствующие функциональные опции или когда пользователь обращается к конкретной хозяйственной операции. Если в вашей организации не ведутся определенные виды учета (например, экспортные операции или специфическая аренда), соответствующие статьи прочих доходов и расходов просто не будут созданы в базе данных, чтобы не перегружать интерфейс пользователя.
  3. Ручное или программное удаление связи. В 1С 8.3 администратор или внешняя обработка могут очистить значение свойства ИмяПредопределенныхДанных у элемента в режиме «Предприятие». После этого элемент теряет статус предопределенного, превращается в обычный элемент справочника и может быть безвозвратно удален пользователем. При этом в конфигураторе он по-прежнему будет отображаться.

Выясним причину ошибки «Код справочника стал неуникальным»

Эта коллизия напрямую связана с появлением новых предопределенных элементов при обновлении релиза конфигурации. Рассмотрим стандартный сценарий:

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

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

Решение проблемы 1: Как принудительно вернуть недостающие элементы

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

Метод А. Использование одноразового параметра запуска

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

/SetPredefinedDataUpdate -UpdateAutomatically

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

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

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


Справочники.ПрочиеДоходыИРасходы.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);

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

Метод В. Использование стандартных обработок БСП

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

Решение проблемы 2: Как исправить неуникальность кодов

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

  1. Откроем справочник Прочие доходы и расходы в режиме «1С:Предприятие».
  2. Настроим список так, чтобы была видна колонка «Код» и выполним сортировку по этой колонке, либо воспользуемся поиском по конфликтующему коду (например, 00028).
  3. Мы увидим два элемента с одинаковым кодом. Один из них будет помечен специальной пиктограммой предопределенного элемента (круглый значок желтого цвета), а второй окажется обычной пользовательской записью.
  4. Откроем карточку пользовательской (не предопределенной!) записи.
  5. Отредактируем ее код вручную, изменив его на любой свободный или добавив буквенный индекс (например, заменив 00028 на 00028-руч или 00099).
  6. Запишем элемент.

Важное примечание: Смена кода у пользовательского элемента абсолютно безопасна. Платформа 1С связывает документы и проводки с элементами справочников по внутреннему уникальному идентификатору (GUID), а не по текстовому коду. Изменение кода никак не повлияет на закрытые периоды, отчеты и существующие проводки.

← На главную