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

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

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

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

1. Как устроен механизм предопределенных элементов в 1С 8.3

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

Рассмотрим основные особенности этой архитектуры:

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

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

2. Выясняем причины: почему пропадают предопределенные элементы?

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

3. Пошаговая диагностика с помощью Консоли запросов

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

Рассмотрим структуру запроса к справочнику СтатьиДвиженияДенежныхСредств. Нам нужно сопоставить поля Предопределенный, ИмяПредопределенныхДанных, а также стандартные реквизиты Ссылка, Код и Наименование.

Выполним следующий запрос в консоли:


ВЫБРАТЬ
    СтатьиДДС.Ссылка КАК Ссылка,
    СтатьиДДС.Код КАК Код,
    СтатьиДДС.Наименование КАК Наименование,
    СтатьиДДС.Предопределенный КАК Предопределенный,
    СтатьиДДС.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
    СтатьиДДС.ПометкаУдаления КАК ПометкаУдаления
ИЗ
    Справочник.СтатьиДвиженияДенежныхСредств КАК СтатьиДДС
ГДЕ
    СтатьиДДС.ИмяПредопределенныхДанных <> ""
    ИЛИ СтатьиДДС.Предопределенный = ИСТИНА

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

  1. Если поле ИмяПредопределенныхДанных заполнено (например, значением ОплатаТоваровРаботУслуг), но само наименование элемента изменено пользователем (например, написано «Оплата поставщикам за сырье»), то предопределенный элемент на месте, просто он был переименован. Это штатное поведение системы, никаких действий предпринимать не нужно.
  2. Если в конфигураторе вы видите элемент с именем ПоступлениеОтПродажиЭкспорт, а в результате запроса записи с таким значением в колонке ИмяПредопределенныхДанных нет вообще — этот элемент физически отсутствует в таблице базы данных. Его необходимо восстанавливать.

4. Как правильно и безопасно восстановить элементы

Рассмотрим несколько способов восстановления. Некоторые из них просты, но несут в себе скрытые угрозы, другие — максимально безопасны и рекомендуются к использованию.

Способ А. Восстановление средствами Библиотеки стандартных подсистем (Рекомендуемый)

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

Для этого откройте внешнюю обработку «Групповая обработка справочников» или воспользуйтесь любой консолью кода со следующими строками:


// Шаг 1. Принудительно установим режим обновления для нашего справочника
Справочники.СтатьиДвиженияДенежныхСредств.УстановитьОбновлениеПредопределенныхДанных(
    ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически
);

// Шаг 2. Вызываем стандартный метод восстановления БСП
СтандартныеПодсистемыСервер.ВосстановитьПредопределенныеЭлементы();

ЗаписатьИСТОРИЮ = Новый СистемнаяИнформация;
Сообщить("Процедура восстановления предопределенных элементов успешно запущена!");

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

После этого настоятельно рекомендуется выполнить процедуру «Тестирование и исправление» информационной базы из конфигуратора, выбрав пункт «Реструктуризация таблиц информационной базы».

Способ Б. Ручное восстановление связей (Альтернативный метод)

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

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


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

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

Способ В. Перенос элементов из эталонной базы через XML

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

Разберем этот процесс по шагам:

  1. Откройте чистую демобазу. Используйте стандартную обработку «Выгрузка и загрузка данных XML» (ее можно найти на диске ИТС или в составе инструментов разработчика).
  2. В списке объектов выберите справочник СтатьиДвиженияДенежныхСредств. Настройте отбор только по предопределенным элементам. Выгрузите данные в файл формата XML.
  3. В вашей рабочей (проблемной) базе предварительно пометьте на удаление те статьи, которые вы, возможно, уже успели создать вручную для замены отсутствующих (чтобы избежать коллизий).
  4. Откройте ту же обработку «Выгрузка и загрузка данных XML» в рабочей базе и загрузите полученный XML-файл. Этот метод гарантирует перенос элементов с сохранением оригинальных UUID, что полностью исключит проблемы при последующих обменах данными.

5. Выводы и профилактика проблемы

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

← На главную