Как восстановить таблицу журнала документов в 1С после случайного удаления в SQL

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

Ситуация, когда из-за неосторожных действий в SQL-консоли или сбоя индексов «улетает» таблица журнала документов, кажется катастрофической. Однако в архитектуре 1С:Предприятие 8.3 журналы документов являются избыточными структурами. Это означает, что сами данные (документы) хранятся в своих отдельных таблицах, а журнал лишь агрегирует информацию из них для быстрого отображения в списках. Разберем подробно, как вернуть данные в журнал, не прибегая к полному перепроведению документов и не рискуя целостностью базы.

Понимаем механику: что именно пропало

Прежде чем приступать к восстановлению, проанализируем ситуацию. Таблицы журналов в SQL обычно имеют префикс _DocumentJournalXXXX. Если вы случайно выполнили команду DELETE или DROP TABLE для такой таблицы, пользователи увидят пустой список в интерфейсе программы, хотя сами документы (например, «Реализация товаров и услуг» или «Кассовое поступление») будут доступны по прямым ссылкам или через свои отдельные списки. Наша задача — заставить систему заново заполнить эту агрегирующую таблицу на основе существующих данных документов.

Способ 1: Реструктуризация через «Тестирование и исправление»

Это самый надежный и официальный метод, рекомендованный платформой. Рассмотрим его по шагам:

  1. Создадим резервную копию базы данных (даже если ситуация уже критическая, копия обязательна перед любыми манипуляциями).
  2. Запустим «Конфигуратор» и перейдем в меню Администрирование — Тестирование и исправление...
  3. Выберем только пункт «Реструктуризация таблиц информационной базы».
  4. В поле «При наличии ссылок на несуществующие объекты» выберем «Не изменять».

Проанализируем, что произойдет: платформа сверит описание метаданных с физическими таблицами в SQL. Обнаружив отсутствие или пустоту таблицы журнала, 1С инициирует её пересоздание и автоматическое заполнение всеми документами, которые входят в состав этого журнала. Минус этого способа — длительное время выполнения на больших базах, так как реструктуризация затронет все таблицы.

Способ 2: Инициирование реструктуризации конкретного объекта

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

  1. В Конфигураторе найдем проблемный журнал документов.
  2. Внесем в него любое незначительное изменение (например, добавим пробел в поле Комментарий в свойствах объекта или слегка изменим Синоним).
  3. Нажмем F7 (Обновить конфигурацию базы данных).

Система увидит изменения в метаданных конкретного объекта и выполнит реструктуризацию только таблицы _DocumentJournalXXXX. Это гораздо быстрее и эффективнее в условиях ограниченного времени.

Способ 3: Программное восстановление через DataExchange.Load

Рассмотрим вариант, когда мы хотим восстановить записи программно, не меняя структуру метаданных. Мы можем использовать свойство ОбменДанными.Загрузка = Истина. Это критически важный момент: данный флаг позволяет записать документ без срабатывания бизнес-логики (подписок на события, проведения по регистрам), но при этом запись в таблицу журнала будет создана или обновлена автоматически.

Пример кода для восстановления записей в журнале:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать(ДатаНачала, ДатаКонца);
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    Объект.ОбменДанными.Загрузка = Истина;
    Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Проанализируем этот код: мы просто перебираем документы и переписываем их поверх самих себя. Благодаря режиму Загрузка = Истина, 1С не будет пытаться заново делать движения по регистрам, проверять остатки или менять состояние документа. Платформа просто «освежит» запись в базе данных, что автоматически добавит строку в таблицу журнала.

Способ 4: SQL-копирование из архивной базы

Если у вас есть копия базы (пусть и устаревшая на пару дней), можно попробовать восстановить часть данных напрямую через SQL Server Management Studio. Посмотрим на алгоритм:

  1. Загрузим архивную копию как отдельную базу в SQL.
  2. С помощью скрипта INSERT INTO ... SELECT ... перенесем данные из таблицы журнала архивной базы в основную.
  3. Для документов, созданных за последние два дня (которых нет в архиве), воспользуемся Способом 3 (программное обновление).

Важно: При ручных операциях с SQL-таблицами журналов нужно быть крайне осторожными с полями _DocumentTRef (идентификатор типа) и _IDRRef (ссылка на документ). Если вы не уверены в структуре этих полей, лучше использовать методы через Конфигуратор 1С.

Резюме и рекомендации

Выясним причину, почему реструктуризация является приоритетным методом. Она гарантирует, что внутренние идентификаторы (UUID) объектов не изменятся, а связи с правами доступа и другими объектами системы останутся корректными. Попытки удалить журнал из дерева конфигурации и создать его заново (как предлагалось в некоторых сообщениях форума) чреваты потерей ссылок в отчетах и ролях пользователей.

В будущем, чтобы избежать подобных инцидентов, рекомендуем:

← На главную