Предопределенные элементы после обновления: создать, восстановить, убрать дубли
Содержание
Предопределенные элементы в 1С 8.3 обновляются из конфигурации: новый элемент добавляют в списке Предопределенные объекта метаданных, выполняют Конфигурация → Обновить конфигурацию базы данных (F7), а платформа сама создаёт строку в таблице данных, если у объекта включён режим обновления «Авто» или «Обновлять автоматически». Если режим «Не обновлять автоматически» или база — подчинённый узел РИБ, элемент создают кодом: Справочники.ИмяСправочника.ИнициализироватьПредопределенныеДанные().
Чаще всего вопрос возникает после обновления типовой или доработки: в справочнике пропала нужная запись, программа ругается на отсутствующий предопределенный элемент или в списке появились два одинаковых. Ниже механизм, способы обновления предопределенных элементов в 1С: Предприятие и разбор каждого конфликта. Всё описанное относится к платформе 8.3 в режиме совместимости не ниже 8.3.3 — именно с этой версии работает нынешняя схема.
Как платформа связывает предопределенный элемент с записью в базе
У предопределенного элемента две половины:
- 🧩 описание в конфигурации — имя, код, наименование, для плана счетов ещё вид счёта и субконто;
- 🗄️ строка в таблице данных — обычный элемент справочника со ссылкой, реквизитами и движениями.
Связывает их стандартный реквизит ИмяПредопределенныхДанных. В нём хранится строка с именем из конфигурации, например Основной. Когда код обращается к Справочники.Валюты.Рубль, платформа ищет в таблице запись, у которой это поле равно Рубль.
Отсюда три следствия:
- Код и наименование можно менять — связь от этого не рвётся.
- Если записи с нужным именем в таблице нет, обращение из кода падает с ошибкой.
- Если таких записей две, платформа не знает, какую вернуть, и тоже выдаёт ошибку.
Признак Предопределенный у объекта — производный: он равен Истине, когда ИмяПредопределенныхДанных не пустое. Поэтому «превратить» обычный элемент в предопределенный и обратно можно, просто записав в это поле нужную строку или очистив его.
Как проверить предопределенные элементы в режиме Предприятия
Быстрее всего — открыть список справочника и посмотреть на значок у строки: у предопределенных он отличается от обычных элементов. Если справочник не выведен ни в один раздел, откройте его через Главное меню → Все функции. Пункт «Все функции» появляется после включения флажка Сервис → Параметры → Отображать команду "Все функции".
Чтобы увидеть сами имена, добавьте в консоли запросов поле ИмяПредопределенныхДанных к выборке из нужной таблицы. Получится сверочный список: какие имена есть в данных, и с какими записями они связаны. Его удобно сравнить со списком в Конфигураторе до и после обновления.
До 8.3.3 связь держалась на внутреннем идентификаторе, и поменять её из встроенного языка было нельзя. Если база работает в режиме совместимости 8.2 или 8.3.1–8.3.2, приёмы из разделов про код не сработают.
Режимы обновления предопределенных данных
У справочника, плана видов характеристик, плана счетов и плана видов расчёта в палитре свойств есть свойство Обновление предопределенных данных. Три значения:
| Режим | Что делает платформа | Где уместен |
|---|---|---|
| Авто | Создаёт недостающие элементы автоматически, кроме подчинённых узлов РИБ и баз с разделением данных | Значение по умолчанию, подходит большинству |
| Обновлять автоматически | Создаёт всегда, даже в подчинённом узле | Редко; риск дублей в РИБ |
| Не обновлять автоматически | Ничего не создаёт, только по команде из кода | Типовые на БСП, базы с обменами |
Кроме свойства объекта, есть настройка на уровне всей базы. Её читают и меняют глобальными методами:
Режим = ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы();
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(
ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);
Настройка базы применяется к объектам с режимом «Авто». Явно заданное у объекта «Обновлять» или «Не обновлять» имеет приоритет.
Типовые конфигурации на Библиотеке стандартных подсистем в подчинённых узлах и при разделении данных сами переводят базу в «Не обновлять автоматически». Это сделано против дублей: элемент приходит обменом из центра, а не создаётся в каждом узле отдельно.
Обновление предопределенных элементов через Конфигуратор
Штатный путь для добавления и изменения предопределенных элементов — Конфигуратор.
Добавить или изменить элемент
- Сделайте резервную копию:
Администрирование → Выгрузить информационную базув Конфигураторе. - Откройте ветку объекта в дереве конфигурации, например
Справочники → ВидыНоменклатуры. - В окне редактирования объекта найдите кнопку
Предопределенные(у справочника она на закладке «Прочее»). - Добавьте строку, задайте имя латиницей или кириллицей без пробелов, код и наименование.
- Нажмите F7 —
Обновить конфигурацию базы данных— и примите изменения. - Запустите 1С:Предприятие и откройте список: новый элемент отмечен значком предопределенного.
Для этих действий нужно снять конфигурацию с поддержки или включить возможность изменений: Конфигурация → Поддержка → Настройка поддержки. В типовой это усложнит будущие обновления, поэтому ограничьтесь доработанными объектами.
Обновление типовой конфигурации
При обновлении типовой через Конфигурация → Поддержка → Обновить конфигурацию список предопределенных переходит вместе со свойствами объекта. Если вы его не трогали, новые элементы поставщика встанут без вопросов.
После F7 и первого запуска в режиме Предприятия типовая выполняет обработчики обновления. Именно они в конфигурациях с режимом «Не обновлять автоматически» создают новые предопределенные элементы. Поэтому не прерывайте окно «Обновление версии программы» — иначе часть записей так и не появится.
Особенности плана счетов
У предопределенного счёта, кроме кода и наименования, в конфигурации заданы вид счёта, признаки учёта и виды субконто. Пользователь в режиме Предприятия может добавить к нему свои субконто, если в конфигурации для этого оставлено место, но не может убрать предопределенные. При обновлении типовой новые субконто поставщика попадают в счёт через обработчики обновления, поэтому после обновления проверьте карточки ключевых счетов.
Удаление элемента из списка
Если убрать элемент из списка Предопределенные, запись в данных не исчезнет. Ссылки на неё в документах сохранятся, но поле ИмяПредопределенныхДанных будет содержать имя, которого в конфигурации больше нет. Такую запись лучше «отвязать» кодом — очистить поле — и дальше работать с ней как с обычным элементом.
Массовая правка реквизитов: групповое изменение
Обработка группового изменения из БСП не создаёт и не удаляет предопределенные элементы. Её задача — быстро заполнить реквизиты у многих записей сразу, в том числе у предопределенных. Типичный случай: после обновления у справочника появился новый реквизит, и его надо заполнить у десятка элементов.
В БП 3.0 обработка открывается по пути Администрирование → Обслуживание → Корректировка данных → Групповое изменение реквизитов. В ЗУП 3.1 и УТ 11 она находится в том же разделе Администрирование, в группе обслуживания.
Порядок:
- Выберите вид объектов — нужный справочник.
- Отберите элементы: условие «Предопределенный = Да» или список вручную.
- Отметьте реквизиты и задайте новые значения.
- Нажмите «Изменить реквизиты» и проверьте протокол: элементы, которые не удалось записать, обработка покажет отдельно.
Обработка не меняет ИмяПредопределенныхДанных — его в списке реквизитов нет. Для восстановления связи нужен код.
Как обновить предопределенные элементы программно
Код запускают внешней обработкой под пользователем с полными правами. Все процедуры ниже — серверные.
Создать недостающие элементы
Метод менеджера ИнициализироватьПредопределенныеДанные() создаёт в таблице записи для тех предопределенных, которых там нет. Существующие записи с совпадающими именами он не пересоздаёт.
&НаСервереБезКонтекста
Процедура СоздатьНедостающиеНаСервере()
УстановитьПривилегированныйРежим(Истина);
Справочники.ВидыКонтактнойИнформации.ИнициализироватьПредопределенныеДанные();
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ИнициализироватьПредопределенныеДанные();
КонецПроцедуры
Подставьте свои объекты. Метод есть у менеджеров справочников, планов видов характеристик, планов счетов и планов видов расчёта.
Привязать существующую запись к имени
Нужен, когда элемент «потерялся»: запись в базе есть, но связь с конфигурацией пустая, а создавать вторую копию нельзя — на старую уже ссылаются документы.
&НаСервереБезКонтекста
Процедура ПривязатьНаСервере(Ссылка, ИмяВКонфигурации)
Объект = Ссылка.ПолучитьОбъект();
Объект.ИмяПредопределенныхДанных = ИмяВКонфигурации;
Объект.Записать();
КонецПроцедуры
Перед вызовом проверьте, что другой записи с тем же именем в таблице нет. Иначе получите дубль.
Найти дубли запросом
ВЫБРАТЬ
Т.ИмяПредопределенныхДанных КАК Имя,
КОЛИЧЕСТВО(Т.Ссылка) КАК Записей
ИЗ
Справочник.ВидыКонтактнойИнформации КАК Т
ГДЕ
Т.Предопределенный
СГРУППИРОВАТЬ ПО
Т.ИмяПредопределенныхДанных
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Т.Ссылка) > 1
Запрос удобно выполнять в консоли запросов. Пустой результат значит, что дублей в справочнике нет.
Конфликты: дубли и потерянные предопределенные
Конфликты сводятся к двум ситуациям: записи нет совсем или их больше одной.
Как устранить дубль без потери ссылок
- Запросом из предыдущего раздела найдите имя с двумя записями.
- Определите «главную» — обычно ту, что старше и на которую ссылаются документы. Количество ссылок покажет команда поиска ссылок на объект.
- У второй записи кодом очистите
ИмяПредопределенныхДанныхи запишите её. - Замените ссылки со второй записи на главную. В типовых на БСП для этого есть обработка поиска и удаления дублей в
Администрирование → Обслуживание → Корректировка данных. - Пометьте вторую запись на удаление и удалите помеченные.
Замена ссылок перезаписывает документы и может задеть закрытые периоды. Делайте её после копии базы и вне рабочего дня, когда пользователи не проводят документы.
Профилактика в РИБ
Включите в подчинённых узлах режим «Не обновлять автоматически» на уровне базы. Новые предопределенные элементы тогда создаются только в центральном узле и приходят обменом. Если узел уже успел создать свои, разберите дубли по шагам выше до следующего сеанса обмена — иначе они разойдутся по остальным узлам.
Файловая и клиент-серверная база: в чём разница
Сам механизм предопределенных одинаков. Отличаются условия, в которых применяют изменения.
| Что | Файловая | Клиент-серверная |
|---|---|---|
| Копия перед изменениями | Копия папки с 1Cv8.1CD или выгрузка .dt | Выгрузка .dt или резервная копия средствами СУБД |
| Обновление структуры (F7) | Нужен монопольный доступ: все пользователи выходят | Монопольный доступ или динамическое обновление, если структура таблиц не меняется |
| Когда появляются новые элементы | При следующем обращении после обновления | То же; сеансы, открытые до динамического обновления, видят старую конфигурацию до перезапуска |
| Пакетный запуск | 1cv8 DESIGNER /F"путь" /UpdateDBCfg | 1cv8 DESIGNER /S"сервер\база" /UpdateDBCfg |
Добавление строки в список предопределенных не меняет структуру таблиц. Поэтому в клиент-серверной базе такое изменение часто проходит динамически. Но пользователи увидят новый элемент только после перезапуска своих сеансов — предупредите их заранее.
Не правьте поле имени предопределенных данных напрямую в таблицах СУБД. Платформа кеширует связь, а ручная правка в SQL обходит её проверки и может оставить базу в несогласованном состоянии. Только встроенный язык или Конфигуратор.
В файловой базе код из раздела про программное обновление можно запускать при работающих пользователях — монопольный доступ ему не нужен. Но если параллельно кто-то правит тот же справочник, запись упадёт на блокировке. Удобнее выбрать тихое время.