При обновлении типовых конфигураций (например, «Бухгалтерия предприятия 3.0») разработчики и администраторы баз данных часто сталкиваются со странным поведением платформы «1С:Предприятие 8.3». В конфигураторе для справочника задано несколько десятков предопределенных элементов, однако при запуске программы в режиме «Предприятие» или при выполнении запроса к базе данных отображается лишь малая их часть. Параллельно с этим система может выдавать предупреждения о том, что код справочника стал неуникальным.
В этой статье мы подробно разберем, почему возникает такое расхождение, как устроен механизм предопределенных данных в современных версиях платформы 1С, и что делать для устранения ошибок неуникальности кодов.
Чтобы понять, куда «исчезают» элементы, проанализируем разницу в архитектуре платформ 1С 8.2 и 1С 8.3. В старых версиях платформы (8.2 и ранее) связь между конфигурацией и базой данных была жесткой. Если элемент создавался в конфигураторе как предопределенный, платформа при первом же запуске принудительно создавала его в таблице базы данных. Удалить или отредактировать ключевые свойства такого элемента в пользовательском режиме было невозможно.
Начиная с версии 1С 8.3, разработчики кардинально изменили эту логику для поддержки облачных технологий (включая работу в сервисе «1С:Фреш») и повышения гибкости систем. Теперь предопределенные элементы существуют в двух разных плоскостях:
Связующим звеном между ними выступает специальное системное поле ИмяПредопределенныхДанных. Платформа больше не создает все элементы «автоматом» при каждом обновлении базы данных. Вместо этого применяется концепция «ленивой» или отложенной инициализации.
Рассмотрим основные факторы, из-за которых в режиме «Предприятие» отображается лишь часть предопределенных элементов:
ОбновлениеПредопределенныхДанных. Оно может принимать три значения:
Автоматически — элементы создаются сразу при обновлении конфигурации базы данных.Не обновлять автоматически — элементы базы данных не создаются и не обновляются автоматически. Это стандартное поведение для подчиненных узлов РИБ (распределенных информационных баз), чтобы избежать конфликтов идентификаторов (UUID).Управлять — логика создания элементов перекладывается на плечи разработчика конфигурации.ПрочиеДоходыИРасходы) установлено управление обновлением. Платформа и программные механизмы БСП (Библиотеки стандартных подсистем) создают элементы только тогда, когда в программе включаются соответствующие функциональные опции или когда пользователь обращается к конкретной хозяйственной операции. Если в вашей организации не ведутся определенные виды учета (например, экспортные операции или специфическая аренда), соответствующие статьи прочих доходов и расходов просто не будут созданы в базе данных, чтобы не перегружать интерфейс пользователя.ИмяПредопределенныхДанных у элемента в режиме «Предприятие». После этого элемент теряет статус предопределенного, превращается в обычный элемент справочника и может быть безвозвратно удален пользователем. При этом в конфигураторе он по-прежнему будет отображаться.Эта коллизия напрямую связана с появлением новых предопределенных элементов при обновлении релиза конфигурации. Рассмотрим стандартный сценарий:
Разработчики фирмы «1С» в очередном обновлении добавляют новый предопределенный элемент справочника ПрочиеДоходыИРасходы с кодом 00028. В вашей базе данных этого элемента еще физически не существовало. Однако за время работы пользователи вручную создавали новые статьи доходов и расходов, и система автоматически присваивала им свободные коды. В какой-то момент ручному элементу был присвоен код 00028.
При обновлении конфигурации базы данных платформа пытается инициализировать новый предопределенный элемент. Она видит, что в базе уже существует запись с кодом 00028. Поскольку для справочника включен контроль уникальности кодов, платформа выдает предупреждение: «Код справочника стал неуникальным: ПрочиеДоходыИРасходы». Обновление при этом успешно завершается, но в базе появляются две записи с одинаковым кодом (одна предопределенная, другая пользовательская), либо новый элемент создается с нарушением уникальности.
Если вам по какой-то причине (например, для написания собственных алгоритмов или построения отчетов) требуется, чтобы все объявленные в конфигураторе предопределенные элементы физически появились в базе данных, воспользуемся одним из следующих методов.
Мы можем заставить платформу выполнить полное обновление предопределенных данных принудительно. Для этого запустим базу данных в режиме «1С:Предприятие» с использованием специального ключа командной строки. В поле «Параметры запуска» в окне выбора информационных баз укажем:
/SetPredefinedDataUpdate -UpdateAutomatically
После запуска и авторизации платформа просканирует метаданные и досоздаст все отсутствующие элементы во всех справочниках. После этого параметр запуска можно удалить.
Если нам не нужно обновлять абсолютно все справочники, мы можем инициализировать процесс точечно с помощью внешней обработки или консоли кода. Напишем и выполним следующий фрагмент кода:
Справочники.ПрочиеДоходыИРасходы.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Этот метод принудительно переведет настройки обновления справочника в автоматический режим, и при ближайшем обновлении или перезапуске все недостающие элементы будут созданы платформой.
В типовых конфигурациях на БСП предусмотрен специальный инструмент для администраторов. Мы можем воспользоваться обработкой «Установка предопределенных элементов» (ее можно найти на портале ИТС или профильных ресурсах). Данная обработка позволяет наглядно сопоставить элементы метаданных с элементами в базе данных, связать ошибочно созданные дубли или инициализировать создание недостающих элементов вручную.
Предупреждение о неуникальности кодов не блокирует работу пользователей, но является технической ошибкой, которую необходимо устранить. Давайте сделаем это по шагам:
Прочие доходы и расходы в режиме «1С:Предприятие».00028).00028 на 00028-руч или 00099).Важное примечание: Смена кода у пользовательского элемента абсолютно безопасна. Платформа 1С связывает документы и проводки с элементами справочников по внутреннему уникальному идентификатору (GUID), а не по текстовому коду. Изменение кода никак не повлияет на закрытые периоды, отчеты и существующие проводки.