Восстановление удаленной информации в базе 1С 8.2 на SQL

26.10.12

Задачи пользователя - Корректировка данных

Случайно были удалены документы в рабочей бухгалтерской базе. Встал вопрос: «Что делать?». Имеем SQL-бэкапы за предыдущий день и текущий день с уже удаленными документами. Либо восстанавливать ночной бэкап за предыдущий день и повторять все операции за вчерашний день, либо восстанавливать бэкап за текущий день и...

 

Предыстория.

Организация ведет бухгалтерский учет в корпоративной базе по нескольким организациям в типовой 1С 8.2 БП КОРП на SQL 2008. По ночам делаются бэкапы на ленточку. Утром очередного дня обнаружилось, что по нескольким организациям «поехала» отчетность, «краснота», нет документов и пр. В ходе оперативного анализа журнала регистрации выяснилось, что в ночь было запущено удаление документов по нескольким организациям, в частности «авансовых отчетов» (причину выводим за скобки). Ночной бэкап был сделан, пока шел процесс удаления документов, т.е. утром не оказалось полноценной копии базы, чтобы сделать восстановление штатными средствами.
Примечание: удаление документов выполнялось командой Удалить() без контроля ссылочной целостности.

Данная новость настигла меня, когда я был вдали от офиса, компьютера и интернета. Чуть позже я понял, что в этом был небольшой плюс для меня, т.к. не ощущал того, что в этот момент происходит в бухгалтерии, в службе ИТ и других подразделениях. Голова была холодной, что позволяло мыслить свободнее.

 

Варианты решений.

1. Первое и самое простое решение с технической точки зрения – это восстановить базу от предыдущей ночи. В этом случае пользователям придется повторить операции вчерашнего дня. Не смертельно, можно, но…

2. Восстановить базу из бэкапа от прошедшей ночи. Затем экспортом-импортом перенести недостающие документы из копии базы от предыдущей ночи. Можно, но… в этом случае придется перепроводить эти документы + восстанавливать последовательность по всем организациям. У нас это займет около месяца, а вчерашняя отчетность нужна сегодня (!).

3. Это решение – не простое, а, как оказалось, золотое... Восстановить базу из бэкапа от прошедшей ночи. Затем, зная структуру таблиц базы данных, экспортировать соответствующие данные средствами СУБД из копии базы от предыдущей ночи. Я только слышал, что иногда делают что-то подобное с 1С-овскими базами. Конечно, этот вариант нелегитимный, но у меня не оставалось другого выбора. Скажу честно, все делал в первый раз.

 

Процедура восстановления.

Через пару часов я добрался до компа и интернета. OpenVPN рулит. За это время сисадмин развернул копии баз от прошедшей и предыдущей ночи. Пришлось срочно искать внешнюю обработку, которая предоставляет информацию о структуре базы данных. Таковая была найдена на жестком диске (скачивал ранее с источника - //infostart.ru/public/16282/).

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

 

Метаданные Имя таблицы хранения Назначение
Имя таблицы
 Документ.АвансовыйОтчет  Document101  Основная
 Документ.АвансовыйОтчет
 Документ.АвансовыйОтчет  DocumentChngR1514  РегистрацияИзменений
 
Документ.АвансовыйОтчет.ТабличнаяЧасть.ВозвратнаяТара  Document101.VT1427  ТабличнаяЧасть
 Документ.АвансовыйОтчет.ВозвратнаяТара
Документ.АвансовыйОтчет.ТабличнаяЧасть.ВыданныеАвансы  Document101.VT1441  ТабличнаяЧасть
 Документ.АвансовыйОтчет.ВыданныеАвансы
 Документ.АвансовыйОтчет.ТабличнаяЧасть.ОплатаПоставщикам  Document101.VT1446  ТабличнаяЧасть
 Документ.АвансовыйОтчет.ОплатаПоставщикам
 Документ.АвансовыйОтчет.ТабличнаяЧасть.Прочее  Document101.VT1464  ТабличнаяЧасть
 Документ.АвансовыйОтчет.Прочее
 Документ.АвансовыйОтчет.ТабличнаяЧасть.Товары  Document101.VT1491  ТабличнаяЧасть
 Документ.АвансовыйОтчет.Товары

 

Запускаем SQL Management Studio. Команда INSERT в помощь. Т.к. на момент создания бэкапа данные были удалены частично, то пришлось предварительно удалить данные в таблицах-приемниках, чтобы при добавлении не было задвоений. Ура! Несколько тысяч документов с табличными частями «переехали» из базы-источника в базу приемник. «Простите, но где проводки?» - спросила бухгалтер. Мне казалось, что они останутся в базе после такого «жесткого» удаления документов. Возникшая ситуация напомнила мне вариант № 2.

Что там с проводками? Проводки хранятся в регистре бухгалтерии «Хозрасчетный». Структура оказалась следующая:

 

Метаданные Имя таблицы хранения Назначение
Имя таблицы
 РегистрБухгалтерии.Хозрасчетный  AccRg468  Основная
 РегистрБухгалтерии.Хозрасчетный
 РегистрБухгалтерии.Хозрасчетный  AccRgChngR505  РегистрацияИзменений
 
 РегистрБухгалтерии.Хозрасчетный  AccRgAT0481  ИтогиПоСчетам
 
 РегистрБухгалтерии.Хозрасчетный  AccRgAT1500  ИтогиПоСчетамССубконто1
 
 РегистрБухгалтерии.Хозрасчетный  AccRgAT2501  ИтогиПоСчетамССубконто2
 
 РегистрБухгалтерии.Хозрасчетный  AccRgAT3502  ИтогиПоСчетамССубконто3
 
 РегистрБухгалтерии.Хозрасчетный  AccRgCT503  ИтогиМеждуСчетами
 
 РегистрБухгалтерии.Хозрасчетный  AccRgED504  ЗначенияСубконто
 

 

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

Пришлось использовать все туже команду INSERT, но с условием, что из базы-источника копируются записи только для документов, которые находятся в таблице документа «авансовый отчет» базы-приемника. Отбор по уникальному номеру не составил труда. Сначала были перенесены данные «основной» таблицы, затем таблицы со «значениями субконто». Переносить «итоги» я посчитал нецелесообразным.
«Документы и проводки есть, но отчетность все равно кривая» - сказала бухгалтер.
Время шло, позади полдня, все на нервах, просят выполнить вариант № 1.

«Кривая отчетность из-за того, что кривые итоги» - подумал я. Попросил подождать еще полчаса, чтобы пересчитать итоги. И...о чудо! Результаты всех устраивают. Осталось сделать превращение (бэкап-ресторе или детач-аттач, кому и что больше нравится) полученной базы в рабочую.

 

В качестве заключения.

На все ушло часа три. Это притом, что все делалось впервые и на свой страх и риск.
Чуть позже обнаружилось, что отсутствуют «авансовые отчеты» в «журнале операций», но изложенным выше способом данные были скопированы в рабочую базу. Структура журнала документа «журнал операций» следующая:

 

Метаданные Имя таблицы хранения Назначение
Имя таблицы
 ЖурналДокументов.ЖурналОпераций  DocumentJournal6336  Основная
 ЖурналДокументов.ЖурналОпераций

 

Смею предположить, что аналогичное решение можно использовать и в других нештатных (!) ситуациях применительно к другим объектам. Надеюсь, у вас все будет хорошо и не придется заниматься подобным.

 

PS
Это моя первая публикация, поэтому не судите строго. Буду рад, если кому-нибудь пригодится изложенная идея. «Велосипед» - скажете? Ну, кому – как.
Если появятся вопросы по конкретике, то постараюсь дополнить в статье.

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2317    29    15    

33

Тестирование и исправление ключей аналитики ERP, УТ11, КА

Корректировка данных Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    106799    633    173    

676

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27372    79    146    

59

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22318    299    35    

71

SALE! 20%

Заполнение документа "Корректировка регистров" произвольными данными

Закрытие периода Корректировка данных Платформа 1С v8.3 Система компоновки данных 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 1920 руб.

13.07.2015    50164    171    29    

121
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. p1l1gr1m 27.10.12 02:29 Сейчас в теме
Замечательный вариант, сам, скорее всего выбрал бы второй способ. Респект за смелость.
Однако должен заметить, что если использовать программный перенос, то нет необходимости что-либо перепроводить. Можно абсолютно так же, как и документы, перенести и движения регистров и это будет довольно быстро.
2. comol 5051 29.10.12 09:01 Сейчас в теме
1) Структура таблиц может отличаться. Названия приводить в тексте не нужно - нужно их получать для каждой базы индивидуально (ПолучитьСтруктуруХранения())
2) За день нет нужды этим пользоваться. УниверсальнаяВыгрузкаЗагрузкаДанныхXML воплне справится...
3. kuzev 47 29.10.12 09:32 Сейчас в теме
Отвечаю по пунктам:
1) структуру таблиц я специально привел для описания конкретной ситуации, чтобы сделать понятней для читателя.
2) к сожалению, не имел опыта использования данной обработки для подобной задачи.
Собственно, твое видео годичной давности - http://infostart.ru/public/95672/, http://comol.livejournal.com/5062.html - направило меня на поиск пути решения =)
4. AlexO 135 29.10.12 09:45 Сейчас в теме
(3)
2) За день нет нужды этим пользоваться. УниверсальнаяВыгрузкаЗагрузкаДанныхXML воплне справится...

совершенно верно, и даже более - этим совершенно нет нужды пользоваться.
Не посыпалась сейчас - посыпится потом.
"Результат всех устраивает". А потом, когда будут массовые лакуны в документах и пустые значения в регистрах -что скажете, 1с все удалила, ничего не знаю??
Крайне опасная публикация, считаю, если оставлять - то только с заголовком красным цветом "не повторяйте, это опасно!"
alon; comol; +2 Ответить
5. comol 5051 29.10.12 10:28 Сейчас в теме
(4) AlexO, Согласен. Нужна если потёрли где-то в начале года и потом всё перепровели.. если физически выгрузкой загрузкой XML не получится из за объема данных...
6. wunderland 201 29.10.12 13:05 Сейчас в теме
Молодец. Смелый решительный человек, с головой и руками. Но к замечаниям в обсуждении отнесись внимательно и серьезно.
7. comol 5051 29.10.12 13:16 Сейчас в теме
Сорри, поставлю "-", а то народ щас "+" ов наставит и все так делать начнут.. а это всё-таки эксклюзив... в 99% случаев эта задача не так решается :(
8. kuzev 47 29.10.12 13:23 Сейчас в теме
(7) comol, ты противоречишь сам себе =) Ведь я воспользовался твоей идеей на практике применительно к своей ситуации.
9. comol 5051 29.10.12 13:34 Сейчас в теме
(8) Ну я показывал на примере типового РС... и как раз с целью оптимизации скорости. В твоём случае и восстановление более сложное и вопрос скорости так остро не стоит. Просто восстановил копию и штатной обработкой перегрузил что нужно...
10. kuzev 47 29.10.12 13:46 Сейчас в теме
(9) comol, я согласен дописать в конце статьи, что результат можно получить штатной обработкой. Только подтвердить это не могу.
Если обобщать, то тогда любой материал, размещенный здесь, "опасен", т.к. является плодом человеческих мыслей и труда. Человеческий фактор и все такое... Есть этот плод никто не заставляет. Каждый решает сам, пробовать его или нет.
Сейчас, спустя время, можно рассуждать о правильности того или иного варианта. В тот момент я выбрал путь и пошел по нему. Опять же, исходя из собственного опыта и имеющихся знаний.
11. comol 5051 29.10.12 14:05 Сейчас в теме
(10) Я вот реально задумался чтобы свою публикацию снять... Не предполагал что она так может быть использована...
14. kuzev 47 29.10.12 14:10 Сейчас в теме
(11) comol, это уже попахивает цензурой и запретом свободы мысли =)
12. comol 5051 29.10.12 14:07 Сейчас в теме
(10) "горе от ума" получилось. В вашем случае более простой способ был так же более правильным...
16. Новенький_2209 29.10.12 21:27 Сейчас в теме
(12) comol, Олег! Было время, я часто заходил к вам в блог и читал много интересной и полезной информации. Планируете ли Вы возобновить постинг? ;)
13. Visitizer 201 29.10.12 14:08 Сейчас в теме
Народ - вы усложняете себе жизнь
задача решается очень просто
1. поднимаем рядом бекап
2. переносим удаленный докмент в рабочую базу одним из известных вам способов:
1. обычным обменом данными - включая движения по регистру (самый простой)
2. ручками сериализуем все данные в одной базе и во второй поднимаем из хмл файла

в этом случае ничего перепроводить не надо, т.к. вы с документом поднимаете и движения по нему, и внутренний идентификатор документа остается такой-же как и был

p.s. - не забывайте делать бекапы логов - можно откатить базу на любой момент времени с точностью до секунды
32ops; absolutblohin; ansonat; Новенький_2209; comol; +5 Ответить
15. kuzev 47 29.10.12 14:14 Сейчас в теме
(13) Visitizer, спасибо. Чуть позже попробую этот вариант на тех же данных.
27. CratosX 112 31.10.12 21:25 Сейчас в теме
(13) Visitizer, был случай в одной организации, где делали ночные копии баз и ежечасный инкремент. Для возможности хранения данных из-за нехватки места на HDD приходилось стандартно оставлять недельные на 2 месяца, месячные на полгода и т.п.
В итоге потребовалось поднять базу годичной давности (для исправления ошибок учёта путём сравнения прежних ключевых значений, которые тогда не казались ключевыми) - и наверное вы догадались, что годичные бэки потёрлись.

P.S. Можно всё, вопрос цены
17. makas 44 30.10.12 09:37 Сейчас в теме
А чем не подошел такой способ переноса данных http://infostart.ru/public/115115/
-----
Написанное в статье только для программистов со стажем, а подобные проблемы надо решать и главбухам. Поэтому я считаю такой способ = опасным. Для себя.
18. kuzev 47 30.10.12 09:43 Сейчас в теме
(17) makas, спасибо за ссылку.
19. makas 44 30.10.12 11:31 Сейчас в теме
20. insurgut 207 31.10.12 09:01 Сейчас в теме
Сума сойти - что за изобретение велосипеда?

Есть обработка ВыгрузкаЗагрузкаДанныхXML82.epf (поставляется с конвертацией данных или на диске ИТС) - неоднократно документооборот перетаскивал из "упавшей базы". Тысячи документов. И все красиво каждый раз.
21. ansonat 50 31.10.12 09:36 Сейчас в теме
А вот у меня не всегда срабатывает эта обработка. Особенно, когда прошло длительное время от бэкапа и нужно перетащить не все данные, а с отбором.
22. Valerich 1633 31.10.12 11:10 Сейчас в теме
(21) а там и отбор можно сделать
24. ansonat 50 31.10.12 11:47 Сейчас в теме
(22) Valerich, не спорю, можно, но не всегда так как нужно. В любом случае, альтернативные варианты имеют право быть. Хотя, да - вышеописанный достаточно опасен. В любом случае, восстановление упашей базы всегда подводными камнями чревато. Обработка с движениями тоже может напортить.
29. insurgut 207 07.11.12 20:45 Сейчас в теме
(21) ansonat, потому что конфигурация изменилась? Так загружаем текущую конфигурацию на старый бэкап, обновляем и спокойно переносим данные.
23. Valiko77 31.10.12 11:13 Сейчас в теме
Респект за решение, вполне пригодно. Главное пользоваться осторожно.
Только я вот не понял, как ты этот INSERT генерил в SQL ?
25. kuzev 47 31.10.12 11:49 Сейчас в теме
(23) Valiko77, как то так:

INSERT INTO [ACC_CORP_DESTINATION].[dbo].[_Document101]
([_IDRRef]
,[_Marked]
,[_Date_Time]
,[_NumberPrefix]
,[_Number]
,[_Posted]
,[_Fld1409RRef]
,[_Fld1410]
,[_Fld1411]
,[_Fld1412]
,[_Fld1413RRef]
,[_Fld1414RRef]
,[_Fld1415]
,[_Fld1416]
,[_Fld1417RRef]
,[_Fld1418]
,[_Fld1419RRef]
,[_Fld1420RRef]
,[_Fld1421]
,[_Fld1422]
,[_Fld1423]
,[_Fld1424]
,[_Fld1425]
,[_Fld1426RRef])
SELECT
[_IDRRef]
,[_Marked]
,[_Date_Time]
,[_NumberPrefix]
,[_Number]
,[_Posted]
,[_Fld1409RRef]
,[_Fld1410]
,[_Fld1411]
,[_Fld1412]
,[_Fld1413RRef]
,[_Fld1414RRef]
,[_Fld1415]
,[_Fld1416]
,[_Fld1417RRef]
,[_Fld1418]
,[_Fld1419RRef]
,[_Fld1420RRef]
,[_Fld1421]
,[_Fld1422]
,[_Fld1423]
,[_Fld1424]
,[_Fld1425]
,[_Fld1426RRef]
FROM [ACC_COPRP_SOURCE].[dbo].[_Document101]
26. jump0 7 31.10.12 15:15 Сейчас в теме
Выгрузкой в идентичную было бы правильнее.
28. ITEkb 01.11.12 09:07 Сейчас в теме
Смело! Сильно!
Что-то похожее тоже делал.
Но обычно разворачиваю копию в новой базе, а потом импортом для идентичных баз перекидываю необходимые документы и подчиненную информацию.
Оставьте свое сообщение