Как восстановить движения документа из архивной копии в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Опасности восстановления движений «Расчета себестоимости»

Прежде чем приступать к переносу данных, выясним причину и особенности проблемы. Главная специфика 1С:УТ 11 заключается в том, что документ расчета себестоимости делает массивные движения сразу по десяткам регистров накопления: «Себестоимость товаров», «Партии товаров», «Выручка и себестоимость продаж» и многим другим.

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

Способ 1: Использование обработки «Выгрузка-загрузка данных XML»

Это самый популярный и относительно простой метод. Нам понадобится стандартная обработка ВыгрузкаЗагрузкаДанныхXML, которая работает на базе планов обмена или прямых запросов. Алгоритм действий следующий:

  1. Разворачиваем архивную копию базы (вчерашнюю), в которой движения документа еще корректны.
  2. Открываем обработку выгрузки в копии базы.
  3. В настройках обработки выбираем выгрузку движений конкретного документа (по ссылке или по периоду и типу).
  4. Выгружаем данные в файл XML.
  5. Открываем рабочую базу, запускаем ту же обработку в режиме загрузки и указываем полученный файл.

Важный технический нюанс: при загрузке данных критически важно, чтобы при записи наборов записей и самого документа устанавливался признак ОбменДанными.Загрузка в значение Истина. Это отключает стандартные проверки платформы и блокирует процедуры обработчиков проведения, позволяя записать движения «как есть».

Способ 2: Перенос данных через COM-соединение

Если нет желания возиться с XML-файлами, можно написать небольшую внешнюю обработку, которая будет подключаться к копии через OLE/COM. Посмотрим на этот подход: обработка напрямую читает объекты НаборЗаписейРегистра нужного документа в архивной базе и перезаписывает их в текущей рабочей базе. Это обеспечивает точечный перенос.

Пример логики для переноса набора записей (упрощенно):


НаборЗаписей = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Чтение данных из COM-объекта (копии базы) и заполнение текущего набора
// ... 
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();

Способ 3: Документ «Корректировка записей регистров»

Вместо того чтобы «подсовывать» движения непосредственно в исходный документ расчета, мы можем использовать ручные корректировки. Это безопаснее: если кто-то снова случайно перепроведет исходный документ, восстановленные движения опять удалятся.

Чтобы избежать этого, перенесем правильные движения из копии в документ «Корректировка записей регистров» (или документ «Операция»). Сам испорченный документ расчета можно сделать непроведенным. В этом случае правильные проводки будут зафиксированы корректировочным документом, который не перепроводится автоматически при закрытии месяца или групповом перепроведении.

Способ 4: Обратный перенос (Сценарий «Копия → Рабочая»)

Проанализируем ситуацию, когда база сильно повреждена перепроведением, а объем новой работы за день невелик. В таких случаях можно применить обратный метод. Мы берем за основу вчерашнюю (целую) копию базы и делаем её рабочей. А всю новую работу пользователей за сегодняшний день переносим из испорченной базы в эту копию с помощью правил конвертации данных (КД 2.0 или EnterpriseData).

Пошаговый процесс:

  1. Блокируем работу пользователей в текущей базе.
  2. Восстанавливаем архивную базу.
  3. С помощью обмена выгружаем только измененные и новые документы (и справочники) за текущий день из старой базы.
  4. Загружаем эти данные в восстановленную базу.
  5. Переключаем пользователей на работу в восстановленной базе.

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

Итоги

Мы рассмотрели несколько рабочих способов восстановления движений документа из бэкапа. Выбор конкретного метода зависит от квалификации программиста и объема измененных данных. Для точечного переноса лучше использовать универсальную загрузку-выгрузку XML с флагом ОбменДанными.Загрузка, а в случае масштабных нарушений логики — рассмотреть перенос новых документов во вчерашнюю рабочую копию.

← На главную