Каждый разработчик или администратор систем на платформе 1С сталкивался с ситуацией, когда в конфигураторе предопределенные элементы справочника или плана видов характеристик присутствуют, а в режиме «1С:Предприятие» (пользовательском режиме) их просто нет. Ярким примером является типовая конфигурация «Бухгалтерия предприятия 3.0» и справочник СтатьиДвиженияДенежныхСредств (Статьи ДДС). Пользователи жалуются на отсутствие важных статей, а при попытке программного обращения к ним система выдает фатальную ошибку.
В этой статье мы подробно разберем, почему возникает эта проблема (даже на абсолютно чистых демобазах 1С), как устроен современный механизм связи данных платформы 1С 8.3, и рассмотрим пошаговые безопасные методы восстановления утерянных элементов без нарушения ссылочной целостности базы данных.
Начиная с версии платформы 1С:Предприятие 8.3 (при отключенном режиме совместимости с версией 8.2), логика работы с предопределенными данными претерпела фундаментальные изменения. Понимание этого устройства — ключ к решению нашей проблемы.
Рассмотрим основные особенности этой архитектуры:
_REFSINF). Она сопоставляет уникальный идентификатор записи в справочнике и имя предопределенного элемента из конфигуратора.ИмяПредопределенныхДанных: У каждого элемента справочника в режиме «1С:Предприятие» появился стандартный реквизит ИмяПредопределенныхДанных. Он имеет строковый тип. Если этот реквизит заполнен и соответствует имени элемента в конфигураторе, платформа считает данный элемент предопределенным.Именно из-за гибкости этой схемы и возможности управлять процессом программно в базах данных периодически возникают сбои, приводящие к «исчезновению» элементов из пользовательского интерфейса.
Проанализируем основные причины, из-за которых статьи движения денежных средств или другие предопределенные элементы могут отсутствовать в режиме предприятия:
ИспользоватьСтатьиДвиженияДенежныхСредств. Чтобы не замусоривать базу данных лишними элементами, разработчики БСП отключают автоматическое создание статей. Инициализация происходит программно только в момент включения соответствующей функциональной опции. Если в процессе записи константы или выполнения обработчика обновления произошел сбой (нехватка прав, блокировки СУБД, аварийное завершение работы), элементы созданы не будут.Прежде чем приступать к исправлению, необходимо точно понять масштаб бедствия. Выясним, какие элементы отсутствуют полностью, а какие просто переименованы пользователями. Для этого воспользуемся консолью запросов.
Рассмотрим структуру запроса к справочнику СтатьиДвиженияДенежныхСредств. Нам нужно сопоставить поля Предопределенный, ИмяПредопределенныхДанных, а также стандартные реквизиты Ссылка, Код и Наименование.
Выполним следующий запрос в консоли:
ВЫБРАТЬ
СтатьиДДС.Ссылка КАК Ссылка,
СтатьиДДС.Код КАК Код,
СтатьиДДС.Наименование КАК Наименование,
СтатьиДДС.Предопределенный КАК Предопределенный,
СтатьиДДС.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
СтатьиДДС.ПометкаУдаления КАК ПометкаУдаления
ИЗ
Справочник.СтатьиДвиженияДенежныхСредств КАК СтатьиДДС
ГДЕ
СтатьиДДС.ИмяПредопределенныхДанных <> ""
ИЛИ СтатьиДДС.Предопределенный = ИСТИНА
Проанализируем результаты выполнения запроса:
ИмяПредопределенныхДанных заполнено (например, значением ОплатаТоваровРаботУслуг), но само наименование элемента изменено пользователем (например, написано «Оплата поставщикам за сырье»), то предопределенный элемент на месте, просто он был переименован. Это штатное поведение системы, никаких действий предпринимать не нужно.ПоступлениеОтПродажиЭкспорт, а в результате запроса записи с таким значением в колонке ИмяПредопределенныхДанных нет вообще — этот элемент физически отсутствует в таблице базы данных. Его необходимо восстанавливать.Рассмотрим несколько способов восстановления. Некоторые из них просты, но несут в себе скрытые угрозы, другие — максимально безопасны и рекомендуются к использованию.
Если ваша конфигурация построена на БСП (а «Бухгалтерия предприятия 3.0» относится именно к таким), в ней уже заложены готовые инструменты для автоматического восстановления связей и элементов. Нам достаточно запустить их выполнение программно.
Для этого откройте внешнюю обработку «Групповая обработка справочников» или воспользуйтесь любой консолью кода со следующими строками:
// Шаг 1. Принудительно установим режим обновления для нашего справочника
Справочники.СтатьиДвиженияДенежныхСредств.УстановитьОбновлениеПредопределенныхДанных(
ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически
);
// Шаг 2. Вызываем стандартный метод восстановления БСП
СтандартныеПодсистемыСервер.ВосстановитьПредопределенныеЭлементы();
ЗаписатьИСТОРИЮ = Новый СистемнаяИнформация;
Сообщить("Процедура восстановления предопределенных элементов успешно запущена!");
После выполнения этого кода платформа самостоятельно просканирует метаданные конфигурации, найдет расхождения с физической таблицей СУБД и создаст недостающие предопределенные элементы. При этом они будут созданы с правильными, оригинальными системными идентификаторами (UUID), которые были заложены разработчиками решения.
После этого настоятельно рекомендуется выполнить процедуру «Тестирование и исправление» информационной базы из конфигуратора, выбрав пункт «Реструктуризация таблиц информационной базы».
Если по какой-то причине стандартные методы БСП недоступны (например, сильно измененная или старая конфигурация), можно сопоставить элементы вручную. Автор темы на форуме пошел по этому пути: создал новые элементы в пользовательском режиме и прописал им соответствующие имена предопределенных данных. Для интерактивного изменения реквизитов без написания программного кода подойдёт универсальный редактор реквизитов и ссылочных объектов.
Давайте разберем, как сделать это программно и максимально аккуратно. Нам потребуется установить доступность записи для реквизита ИмяПредопределенныхДанных:
// Пример программного сопоставления существующего или нового элемента
Процедура СопоставитьЭлементДДС(ИмяПредопределенного, ТекущееНаименование)
// Пытаемся найти элемент, который мог быть переименован или создан вручную
НайденнаяСсылка = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию(ТекущееНаименование);
Если НайденнаяСсылка.Пустая() Тогда
// Создаем новый элемент, если его нет
НовыйОбъект = Справочники.СтатьиДвиженияДенежныхСредств.СоздатьЭлемент();
НовыйОбъект.Наименование = ТекущееНаименование;
Иначе
НовыйОбъект = НайденнаяСсылка.ПолучитьОбъект();
КонецЕсли;
// Устанавливаем системное имя предопределенного элемента
НовыйОбъект.ИмяПредопределенныхДанных = ИмяПредопределенного;
Попытка
НовыйОбъект.Записать();
Сообщить("Успешно сопоставлен элемент: " + ТекущееНаименование);
Исключение
Сообщить("Ошибка при записи элемента " + ТекущееНаименование + ": " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важное предупреждение! Ручное создание элементов через метод СоздатьЭлемент() генерирует случайный новый уникальный идентификатор (UUID). Если в программном коде вашей конфигурации, сторонних внешних отчетах или правилах обмена с другими базами (например, с «Управлением торговлей») жестко зашиты конкретные UUID предопределенных статей, то ручное сопоставление может нарушить синхронизацию данных в будущем. Появится дублирование информации. Используйте этот способ осторожно и только тогда, когда способ А не принес результатов. При возникновении дублей для переноса ссылок на нужные элементы можно использовать обработку поиска и замены значений.
Если у вас есть чистая демонстрационная база того же самого релиза конфигурации, в которой все предопределенные статьи ДДС на месте и имеют правильные UUID, вы можете перенести их в вашу «сломанную» базу.
Разберем этот процесс по шагам:
СтатьиДвиженияДенежныхСредств. Настройте отбор только по предопределенным элементам. Выгрузите данные в файл формата XML.Мы выяснили, почему в платформе 1С 8.3 предопределенные данные могут пропадать из пользовательского режима. Чтобы минимизировать вероятность повторения этой ситуации в будущем, придерживайтесь следующих правил:
ИмяПредопределенныхДанных перед вызовом логики, завязанной на предопределенные статьи.