При обновлении типовых конфигураций (например, «Бухгалтерия государственного учреждения 2.0» или «Бухгалтерия предприятия 3.0») разработчики и администраторы баз данных часто сталкиваются со следующей проблемой: обновление блокируется из-за установленного расширения. В попытке быстро решить проблему расширение удаляют из списка, успешно завершают обновление, а затем устанавливают расширение заново. Однако после этого обнаруживается критическая неприятность — все созданные пользователями документы и справочники, которые физически хранились внутри этого расширения, бесследно исчезли.
В этой статье мы подробно разберем, почему так происходит на уровне платформы 1С и СУБД, как восстановить утерянные данные из резервной копии, и как правильно выполнять подобные обновления в будущем, чтобы избежать катастрофической потери информации.
Для того чтобы понять причину проблемы, заглянем «под капот» платформы 1С:Предприятие. Когда мы добавляем собственный объект (например, документ КассовыйПланУтвержденный) в расширение конфигурации, платформа создает для него полноценные физические таблицы в базе данных СУБД (MS SQL, PostgreSQL или внутреннем файле .1CD). Эти таблицы имеют специальные системные префиксы, привязанные к уникальному идентификатору вашего расширения.
В процессе работы пользователи заполняют эти таблицы реальными данными. Проблемы начинаются, когда администратор решает избавиться от мешающего обновлению расширения:
DROP TABLE для всех таблиц, ассоциированных с удаляемым расширением. Все данные физически стираются с диска..cfe в базу данных, платформа видит новые объекты и заново создает под них таблицы СУБД. Эти таблицы абсолютно пустые — связь со старыми удаленными данными потеряна навсегда, так как физических записей больше нет.Именно поэтому простое переподключение расширения возвращает структуру метаданных (мы снова видим типы документов в интерфейсе), но не возвращает сами документы.
Выясним причину, почему обновление изначально не шло и выдавало ошибку. При обновлении основной конфигурации часто изменяется ее свойство РежимСовместимости (например, повышается до версии 8.3.14 или выше). Если у расширения в свойствах остался старый режим совместимости, платформа блокирует процесс обновления из-за несоответствия контролируемых свойств.
Вместо полного удаления расширения необходимо использовать механизм деактивации:
Если вы уже совершили ошибку, удалили расширение и потеряли данные, единственным надежным способом спасения ситуации является использование резервной копии (архива), сделанной строго перед началом обновления. Проанализируем схему восстановления данных шаг за шагом.
Разверните архивную копию базы данных, созданную до обновления. Сделать это можно на локальном компьютере в файловом варианте или на тестовом сервере СУБД. В этой копии расширение еще не удалено, а документы КассовыйПланУтвержденный содержат всю необходимую информацию.
Для переноса данных нам понадобится универсальная обработка ВыгрузкаЗагрузкаДанныхXML.epf (ее можно найти на диске ИТС или в каталоге шаблонов установленной платформы). Рассмотрим порядок действий в архивной базе:
Документ.КассовыйПланУтвержденный).Теперь перейдем в обновленную рабочую базу, куда вы уже успели заново установить расширение (структура документов создана, но они пустые):
ВыгрузкаЗагрузкаДанныхXML.epf.При стандартном XML-переносе документы переносятся в базу данных в том статусе, в котором они были записаны, однако их движения по регистрам сведений и накопления (бухгалтерские проводки) могут не восстановиться автоматически. Чтобы вернуть актуальные движения, перенесенные документы необходимо перепровести. Для сопоставления результатов переноса можно задействовать автоматическое сравнение бухгалтерских и налоговых проводок между базами 1С.
Если документов много, ручное перепроведение займет слишком много времени. Напишем и запустим в обработке группового проведения следующий несложный код:
Выборка = Документы.КассовыйПланУтвержденный.Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.ПолучитьОбъект();
Если ДокОбъект.Проведен Тогда
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Сообщить("Успешно проведен документ: " + Строка(ДокОбъект));
Исключение
Сообщить("Ошибка проведения документа " + Строка(ДокОбъект) + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Чтобы в будущем не прибегать к экстренному восстановлению из бэкапов, разберем регламент безопасного обновления конфигурации, содержащей расширения с собственными данными:
РежимСовместимости.РежимСовместимости и установите его в точное соответствие с режимом совместимости основной конфигурации.Обсуждаемая проблема поднимает важный методологический вопрос разработки на платформе 1С:Предприятие. Хотя платформа позволяет создавать новые справочники, документы и регистры непосредственно внутри расширений, опытные разработчики рекомендуют придерживаться жесткого правила:
Никогда не храните критически важные бизнес-данные в объектах, созданных исключительно внутри расширений конфигурации.
Почему этого следует избегать?
Как делать правильно:
Если вам требуется добавить новый документ (например, КассовыйПланУтвержденный) или справочник в типовую конфигурацию, которая находится на поддержке:
_ит_КассовыйПланУтвержденный), чтобы объект не мешал последующим автоматическим обновлениям.При таком подходе данные ваших пользователей будут находиться под надежной защитой СУБД в составе основной конфигурации. Даже если расширение будет полностью удалено, повреждено или отключено из-за конфликта версий при обновлении, сами документы останутся в базе данных. Вы сможете спокойно обновиться, исправить код в расширении, подключить его заново — и все данные мгновенно отобразятся в интерфейсе без необходимости восстановления из резервных копий.