Рассмотрим распространенную ситуацию, с которой сталкиваются программисты и администраторы 1С: пользователь случайно перепровел сложный регламентный документ (например, «Расчет себестоимости» в 1С:Управление торговлей 11), из-за чего данные в регистрах «съехали». При этом откатить всю базу из ночного бэкапа нельзя, так как другие пользователи весь день активно работали и создавали новые документы. Проанализируем, какие существуют способы решения этой задачи и как правильно восстановить движения документа, не нарушив целостность текущих данных.
Прежде чем приступать к переносу данных, выясним причину и особенности проблемы. Главная специфика 1С:УТ 11 заключается в том, что документ расчета себестоимости делает массивные движения сразу по десяткам регистров накопления: «Себестоимость товаров», «Партии товаров», «Выручка и себестоимость продаж» и многим другим.
Если за текущий день пользователи уже внесли изменения в первичные документы (поступления, реализации) задним числом, то «слепой» перенос движений из бэкапа приведет к серьезным логическим разрывам. В складских регистрах будут новые данные, а в регистрах себестоимости — старые. Это вызовет зависание сумм, отрицательные остатки и ошибки при следующем закрытии месяца. Поэтому часто правильнее найти причину, по которой данные «слетели» при перепроведении, исправить первичную документацию и заново рассчитать себестоимость в рабочей базе. Если же решение о переносе принято, разберем по шагам доступные инструменты.
Это самый популярный и относительно простой метод. Нам понадобится стандартная обработка ВыгрузкаЗагрузкаДанныхXML, которая работает на базе планов обмена или прямых запросов. Алгоритм действий следующий:
Важный технический нюанс: при загрузке данных критически важно, чтобы при записи наборов записей и самого документа устанавливался признак ОбменДанными.Загрузка в значение Истина. Это отключает стандартные проверки платформы и блокирует процедуры обработчиков проведения, позволяя записать движения «как есть».
Если нет желания возиться с XML-файлами, можно написать небольшую внешнюю обработку, которая будет подключаться к копии через OLE/COM. Посмотрим на этот подход: обработка напрямую читает объекты НаборЗаписейРегистра нужного документа в архивной базе и перезаписывает их в текущей рабочей базе. Это обеспечивает точечный перенос.
Пример логики для переноса набора записей (упрощенно):
НаборЗаписей = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Чтение данных из COM-объекта (копии базы) и заполнение текущего набора
// ...
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Вместо того чтобы «подсовывать» движения непосредственно в исходный документ расчета, мы можем использовать ручные корректировки. Это безопаснее: если кто-то снова случайно перепроведет исходный документ, восстановленные движения опять удалятся.
Чтобы избежать этого, перенесем правильные движения из копии в документ «Корректировка записей регистров» (или документ «Операция»). Сам испорченный документ расчета можно сделать непроведенным. В этом случае правильные проводки будут зафиксированы корректировочным документом, который не перепроводится автоматически при закрытии месяца или групповом перепроведении.
Проанализируем ситуацию, когда база сильно повреждена перепроведением, а объем новой работы за день невелик. В таких случаях можно применить обратный метод. Мы берем за основу вчерашнюю (целую) копию базы и делаем её рабочей. А всю новую работу пользователей за сегодняшний день переносим из испорченной базы в эту копию с помощью правил конвертации данных (КД 2.0 или EnterpriseData).
Пошаговый процесс:
Иногда перенести десяток свежих реализаций и поступлений гораздо надежнее, чем пытаться «приживить» чужие движения по сложным регистрам себестоимости в живую систему.
Мы рассмотрели несколько рабочих способов восстановления движений документа из бэкапа. Выбор конкретного метода зависит от квалификации программиста и объема измененных данных. Для точечного переноса лучше использовать универсальную загрузку-выгрузку XML с флагом ОбменДанными.Загрузка, а в случае масштабных нарушений логики — рассмотреть перенос новых документов во вчерашнюю рабочую копию.