В современных версиях платформы «1С:Предприятие 8.3» логика работы с предопределенными элементами справочников, планов счетов и других объектов метаданных претерпела существенные изменения по сравнению со старыми версиями (например, 1С 8.2). Теперь связь между конфигурацией и базой данных стала более гибкой. С одной стороны, это дает разработчикам больше свободы, но с другой — открывает возможность для администраторов или пользователей случайно пометить на удаление и физически стереть предопределенные счета из информационной базы.
Удаление предопределенного счета — это серьезная проблема, которая нарушает ссылочную целостность базы данных. Все документы, проводки и регистры, в которых фигурировал данный счет, начинают отображать битые ссылки вида <Объект не найден>. В этой статье мы подробно и пошагово рассмотрим, как восстановить удаленный предопределенный счет, сохранив его уникальный идентификатор (GUID) и восстановив полную работоспособность системы.
Выясним причину, почему вообще становится возможным удаление предопределенного счета. В платформе 1С 8.3 за связь элемента в пользовательском режиме с объектом метаданных в конфигураторе отвечает специальный реквизит ИмяПредопределенныхДанных. Если этот реквизит по какой-то причине очищается или если права доступа пользователя позволяют осуществлять непосредственное удаление, то предопределенный элемент может быть удален стандартной обработкой «Удаление помеченных объектов». При этом в конфигурации описание счета остается, а в физической таблице базы данных запись исчезает.
Давайте разберем пять наиболее эффективных способов решения этой проблемы — от простых интерактивных методов до программного восстановления силами встроенного языка и Библиотеки стандартных подсистем (БСП).
Рассмотрим самый простой способ, который не требует наличия архивных копий, если удаленный счет не успел поучаствовать в реальных хозяйственных операциях и на него нет ссылок в документах. Нам потребуется воссоздать элемент вручную и связать его с конфигуратором.
Выполним следующие шаги:
ИмяПредопределенныхДанных.ТоварыНаСкладах или ПолученныеКредиты).После выполнения этой операции платформа автоматически свяжет созданный вами элемент с метаданными конфигурации, и счет снова приобретет статус предопределенного (в интерфейсе у него появится характерная иконка с желтым шариком).
Если удаленный счет уже использовался в проводках, то простое создание нового элемента по Способу 1 приведет к тому, что в старых документах ссылки останутся битыми. Это происходит из-за несовпадения уникальных идентификаторов (GUID). Чтобы исправить это, нам понадобится архивная копия базы данных, в которой этот счет еще существовал.
Проанализируем ситуацию и выполним перенос элемента с сохранением его GUID:
Поскольку загрузка XML-данных перезаписывает объекты с сохранением их уникальных идентификаторов, предопределенный счет появится в рабочей базе с тем же GUID. Все битые ссылки в документах автоматически восстановятся и начнут отображать правильный счет.
Иногда использование обработки выгрузки/загрузки XML неудобно или невозможно (например, из-за разных версий конфигураций в архиве и рабочей базе). В этом случае мы можем написать короткий и эффективный программный код, который создаст счет с нужным GUID напрямую.
Для начала нам нужно узнать GUID удаленного счета из архивной базы. Это можно сделать программно в архиве, выполнив запрос или обратившись к ссылке. Получив строковое представление уникального идентификатора (например, "d3b07384-d113-11e3-80c8-00155d013a03"), мы можем запустить в рабочей базе внешнюю обработку со следующим кодом:
// Определяем уникальный идентификатор, полученный из архивной копии
УникальныйИД = Новый УникальныйИдентификатор("d3b07384-d113-11e3-80c8-00155d013a03");
// Формируем ссылку на основе GUID для нужного плана счетов
СсылкаНаСчет = ПланыСчетов.Хозрасчетный.ПолучитьСсылка(УникальныйИД);
// Проверяем, действительно ли элемент отсутствует в базе
Если СсылкаНаСчет.ПолучитьОбъект() = Неопределено Тогда
// Создаем новый объект счета
НовыйСчет = ПланыСчетов.Хозрасчетный.СоздатьСчет();
// Устанавливаем ранее полученную ссылку для нового объекта
НовыйСчет.УстановитьСсылкуНового(СсылкаНаСчет);
// Заполняем обязательные свойства
НовыйСчет.Код = "41.01";
НовыйСчет.Наименование = "Товары на складах";
НовыйСчет.ИмяПредопределенныхДанных = "ТоварыНаСкладах";
// Записываем объект в базу данных
НовыйСчет.Записать();
Сообщить("Предопределенный счет успешно воссоздан с оригинальным GUID!");
Иначе
Сообщить("Счет с данным GUID уже существует в информационной базе.");
КонецЕсли;
Этот способ является наиболее чистым и безопасным для ссылочной целостности базы данных, так как он мгновенно «склеивает» все старые проводки с вновь созданным элементом без появления дублей.
Если ваша конфигурация разработана на базе БСП (а это практически все современные типовые конфигурации от 1С), то в ней уже содержатся встроенные инструменты для поиска и автоматического исправления проблем с предопределенными элементами.
Посмотрим на пример работы с программными методами БСП. Мы можем открыть консоль кода или запустить внешнюю обработку и выполнить вызов специального метода общего модуля:
// Автоматическое восстановление всех утерянных предопределенных элементов во всех объектах метаданных
СтандартныеПодсистемыСервер.ВосстановитьПредопределенныеЭлементы();
Этот метод самостоятельно проанализирует структуру метаданных конфигурации, сопоставит ее с записями в таблицах СУБД и при обнаружении расхождений создаст недостающие элементы. Однако стоит учитывать, что в этом случае новые элементы получат новые GUID. Если вам нужно точечно обновить только конкретный план счетов, используйте другой метод:
// Обновление предопределенных элементов конкретного объекта метаданных
ОбъектМетаданных = Метаданные.ПланыСчетов.Хозрасчетный;
ОбновлениеИнформационнойБазы.ОбновитьПредопределенныеЭлементы(ОбъектМетаданных);
Платформа 1С:Предприятие поддерживает управление обновлением предопределенных данных на уровне всей информационной базы. Если данные были удалены, мы можем принудительно активировать системный механизм инициализации при запуске.
Для этого можно воспользоваться запуском конфигуратора с ключом командной строки. Закройте все сеансы работы с базой данных и выполните запуск из командной строки Windows:
1cv8.exe DESIGNER /F "ПутьКВашейБазе" /N "Администратор" /P "Пароль" /SetPredefinedDataUpdate -UpdateAutomatically
После запуска конфигуратора выполните обновление конфигурации базы данных (клавиша F7) или запустите процедуру реструктуризации таблиц. Платформа обнаружит отсутствие предопределенных записей в СУБД и автоматически воссоздаст их.
Также этот параметр можно установить непосредственно из программного кода встроенного языка, выполнив следующую команду под правами администратора:
// Установка режима автоматического обновления предопределенных данных
УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
После установки этого режима требуется запустить обновление конфигурации базы данных или выполнить реиндексацию/реструктуризацию через тестирование и исправление информационной базы.
Мы детально разобрали несколько различных способов восстановления удаленных предопределенных счетов. Подведем итог: какой метод выбрать в зависимости от ситуации?
Перед выполнением любых из описанных действий обязательно сделайте резервную копию (архив) вашей информационной базы!