Предопределенные элементы после обновления: создать, восстановить, убрать дубли

· 9 мин

Содержание

Предопределенные элементы в 1С 8.3 обновляются из конфигурации: новый элемент добавляют в списке Предопределенные объекта метаданных, выполняют Конфигурация → Обновить конфигурацию базы данных (F7), а платформа сама создаёт строку в таблице данных, если у объекта включён режим обновления «Авто» или «Обновлять автоматически». Если режим «Не обновлять автоматически» или база — подчинённый узел РИБ, элемент создают кодом: Справочники.ИмяСправочника.ИнициализироватьПредопределенныеДанные().

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

Как платформа связывает предопределенный элемент с записью в базе

У предопределенного элемента две половины:

  • 🧩 описание в конфигурации — имя, код, наименование, для плана счетов ещё вид счёта и субконто;
  • 🗄️ строка в таблице данных — обычный элемент справочника со ссылкой, реквизитами и движениями.

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

Отсюда три следствия:

  1. Код и наименование можно менять — связь от этого не рвётся.
  2. Если записи с нужным именем в таблице нет, обращение из кода падает с ошибкой.
  3. Если таких записей две, платформа не знает, какую вернуть, и тоже выдаёт ошибку.

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

Как проверить предопределенные элементы в режиме Предприятия

Быстрее всего — открыть список справочника и посмотреть на значок у строки: у предопределенных он отличается от обычных элементов. Если справочник не выведен ни в один раздел, откройте его через Главное меню → Все функции. Пункт «Все функции» появляется после включения флажка Сервис → Параметры → Отображать команду "Все функции".

Чтобы увидеть сами имена, добавьте в консоли запросов поле ИмяПредопределенныхДанных к выборке из нужной таблицы. Получится сверочный список: какие имена есть в данных, и с какими записями они связаны. Его удобно сравнить со списком в Конфигураторе до и после обновления.

До 8.3.3 связь держалась на внутреннем идентификаторе, и поменять её из встроенного языка было нельзя. Если база работает в режиме совместимости 8.2 или 8.3.1–8.3.2, приёмы из разделов про код не сработают.

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

У справочника, плана видов характеристик, плана счетов и плана видов расчёта в палитре свойств есть свойство Обновление предопределенных данных. Три значения:

РежимЧто делает платформаГде уместен
АвтоСоздаёт недостающие элементы автоматически, кроме подчинённых узлов РИБ и баз с разделением данныхЗначение по умолчанию, подходит большинству
Обновлять автоматическиСоздаёт всегда, даже в подчинённом узлеРедко; риск дублей в РИБ
Не обновлять автоматическиНичего не создаёт, только по команде из кодаТиповые на БСП, базы с обменами

Кроме свойства объекта, есть настройка на уровне всей базы. Её читают и меняют глобальными методами:

Режим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(
    ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);

Настройка базы применяется к объектам с режимом «Авто». Явно заданное у объекта «Обновлять» или «Не обновлять» имеет приоритет.

Типовые конфигурации на Библиотеке стандартных подсистем в подчинённых узлах и при разделении данных сами переводят базу в «Не обновлять автоматически». Это сделано против дублей: элемент приходит обменом из центра, а не создаётся в каждом узле отдельно.

Обновление предопределенных элементов через Конфигуратор

Штатный путь для добавления и изменения предопределенных элементов — Конфигуратор.

Добавить или изменить элемент

  1. Сделайте резервную копию: Администрирование → Выгрузить информационную базу в Конфигураторе.
  2. Откройте ветку объекта в дереве конфигурации, например Справочники → ВидыНоменклатуры.
  3. В окне редактирования объекта найдите кнопку Предопределенные (у справочника она на закладке «Прочее»).
  4. Добавьте строку, задайте имя латиницей или кириллицей без пробелов, код и наименование.
  5. Нажмите F7 — Обновить конфигурацию базы данных — и примите изменения.
  6. Запустите 1С:Предприятие и откройте список: новый элемент отмечен значком предопределенного.

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

Обновление типовой конфигурации

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

После F7 и первого запуска в режиме Предприятия типовая выполняет обработчики обновления. Именно они в конфигурациях с режимом «Не обновлять автоматически» создают новые предопределенные элементы. Поэтому не прерывайте окно «Обновление версии программы» — иначе часть записей так и не появится.

Особенности плана счетов

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

Удаление элемента из списка

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

Массовая правка реквизитов: групповое изменение

Обработка группового изменения из БСП не создаёт и не удаляет предопределенные элементы. Её задача — быстро заполнить реквизиты у многих записей сразу, в том числе у предопределенных. Типичный случай: после обновления у справочника появился новый реквизит, и его надо заполнить у десятка элементов.

В БП 3.0 обработка открывается по пути Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов. В ЗУП 3.1 и УТ 11 она находится в том же разделе Администрирование, в группе обслуживания.

Порядок:

  1. Выберите вид объектов — нужный справочник.
  2. Отберите элементы: условие «Предопределенный = Да» или список вручную.
  3. Отметьте реквизиты и задайте новые значения.
  4. Нажмите «Изменить реквизиты» и проверьте протокол: элементы, которые не удалось записать, обработка покажет отдельно.

Обработка не меняет ИмяПредопределенныхДанных — его в списке реквизитов нет. Для восстановления связи нужен код.

Как обновить предопределенные элементы программно

Код запускают внешней обработкой под пользователем с полными правами. Все процедуры ниже — серверные.

Создать недостающие элементы

Метод менеджера ИнициализироватьПредопределенныеДанные() создаёт в таблице записи для тех предопределенных, которых там нет. Существующие записи с совпадающими именами он не пересоздаёт.

&НаСервереБезКонтекста
Процедура СоздатьНедостающиеНаСервере()
    УстановитьПривилегированныйРежим(Истина);
    Справочники.ВидыКонтактнойИнформации.ИнициализироватьПредопределенныеДанные();
    ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ИнициализироватьПредопределенныеДанные();
КонецПроцедуры

Подставьте свои объекты. Метод есть у менеджеров справочников, планов видов характеристик, планов счетов и планов видов расчёта.

Привязать существующую запись к имени

Нужен, когда элемент «потерялся»: запись в базе есть, но связь с конфигурацией пустая, а создавать вторую копию нельзя — на старую уже ссылаются документы.

&НаСервереБезКонтекста
Процедура ПривязатьНаСервере(Ссылка, ИмяВКонфигурации)
    Объект = Ссылка.ПолучитьОбъект();
    Объект.ИмяПредопределенныхДанных = ИмяВКонфигурации;
    Объект.Записать();
КонецПроцедуры

Перед вызовом проверьте, что другой записи с тем же именем в таблице нет. Иначе получите дубль.

Найти дубли запросом

ВЫБРАТЬ
    Т.ИмяПредопределенныхДанных КАК Имя,
    КОЛИЧЕСТВО(Т.Ссылка) КАК Записей
ИЗ
    Справочник.ВидыКонтактнойИнформации КАК Т
ГДЕ
    Т.Предопределенный
СГРУППИРОВАТЬ ПО
    Т.ИмяПредопределенныхДанных
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Т.Ссылка) > 1

Запрос удобно выполнять в консоли запросов. Пустой результат значит, что дублей в справочнике нет.

Конфликты: дубли и потерянные предопределенные

Конфликты сводятся к двум ситуациям: записи нет совсем или их больше одной.

Диагностика: выберите симптом

Как устранить дубль без потери ссылок

  1. Запросом из предыдущего раздела найдите имя с двумя записями.
  2. Определите «главную» — обычно ту, что старше и на которую ссылаются документы. Количество ссылок покажет команда поиска ссылок на объект.
  3. У второй записи кодом очистите ИмяПредопределенныхДанных и запишите её.
  4. Замените ссылки со второй записи на главную. В типовых на БСП для этого есть обработка поиска и удаления дублей в Администрирование → Обслуживание → Корректировка данных.
  5. Пометьте вторую запись на удаление и удалите помеченные.

Замена ссылок перезаписывает документы и может задеть закрытые периоды. Делайте её после копии базы и вне рабочего дня, когда пользователи не проводят документы.

Профилактика в РИБ

Включите в подчинённых узлах режим «Не обновлять автоматически» на уровне базы. Новые предопределенные элементы тогда создаются только в центральном узле и приходят обменом. Если узел уже успел создать свои, разберите дубли по шагам выше до следующего сеанса обмена — иначе они разойдутся по остальным узлам.

Файловая и клиент-серверная база: в чём разница

Сам механизм предопределенных одинаков. Отличаются условия, в которых применяют изменения.

ЧтоФайловаяКлиент-серверная
Копия перед изменениямиКопия папки с 1Cv8.1CD или выгрузка .dtВыгрузка .dt или резервная копия средствами СУБД
Обновление структуры (F7)Нужен монопольный доступ: все пользователи выходятМонопольный доступ или динамическое обновление, если структура таблиц не меняется
Когда появляются новые элементыПри следующем обращении после обновленияТо же; сеансы, открытые до динамического обновления, видят старую конфигурацию до перезапуска
Пакетный запуск1cv8 DESIGNER /F"путь" /UpdateDBCfg1cv8 DESIGNER /S"сервер\база" /UpdateDBCfg

Добавление строки в список предопределенных не меняет структуру таблиц. Поэтому в клиент-серверной базе такое изменение часто проходит динамически. Но пользователи увидят новый элемент только после перезапуска своих сеансов — предупредите их заранее.

Не правьте поле имени предопределенных данных напрямую в таблицах СУБД. Платформа кеширует связь, а ручная правка в SQL обходит её проверки и может оставить базу в несогласованном состоянии. Только встроенный язык или Конфигуратор.

В файловой базе код из раздела про программное обновление можно запускать при работающих пользователях — монопольный доступ ему не нужен. Но если параллельно кто-то правит тот же справочник, запись упадёт на блокировке. Удобнее выбрать тихое время.

Частые вопросы

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