Восстановление удаленной информации в базе 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С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

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

60000 руб.

06.10.2023    4833    38    20    

46

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

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

14400 руб.

29.04.2020    34339    109    152    

75

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

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

3600 руб.

10.02.2017    111829    673    175    

712

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

Представьте, что есть система QR - кодирования, которая НЕ ТРЕБУЕТ изменения конфигурации, НЕ ТРЕБУЕТ изменения ни одной печатной формы для добавления QR-кода, включая внешние, НЕ ХРАНИТ данные штрихкодов и их связь, от чего база не "пухнет", ИМЕЕТ возможность закодировать в QR-коде произвольные данные параметров для последующей обработки полученных данных, УМЕЕТ прикреплять сканы, УМЕЕТ обработать считанный QR-код как ВЫ захотите. А также ХРАНИТ историю операций в обход базы для каждого пользователя в отдельности и УМЕЕТ работать с 2D - сканерами. А также автоматически распознавать отсканированные печатные формы (картинки или pdf-файлы) и выполнять заданные произвольные алгоритмы, в том числе прикрепление их к документам! Обновление 3.2 от 09.06.2024!

19200 руб.

26.08.2018    52774    16    61    

55

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

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

2400 руб.

13.07.2015    51510    175    29    

127

Корректировка данных Бухгалтер Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Налоговый учет Налог на прибыль Платные (руб)

Обработка служит для: выравнивания бухгалтерского и налогового учета на определенную дату по выбранным счетам; закрытия остатков по выбранным счетам; обнуления налогового учета (ПР, ВР также будут обнулены)

2880 руб.

05.05.2024    756    11    0    

7

Корректировка данных Программист Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет НДС Платные (руб)

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

6000 руб.

22.01.2025    449    1    0    

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

совершенно верно, и даже более - этим совершенно нет нужды пользоваться.
Не посыпалась сейчас - посыпится потом.
"Результат всех устраивает". А потом, когда будут массовые лакуны в документах и пустые значения в регистрах -что скажете, 1с все удалила, ничего не знаю??
Крайне опасная публикация, считаю, если оставлять - то только с заголовком красным цветом "не повторяйте, это опасно!"
alon; comol; +2 Ответить
5. comol 5115 29.10.12 10:28 Сейчас в теме
(4) AlexO, Согласен. Нужна если потёрли где-то в начале года и потом всё перепровели.. если физически выгрузкой загрузкой XML не получится из за объема данных...
6. wunderland 203 29.10.12 13:05 Сейчас в теме
Молодец. Смелый решительный человек, с головой и руками. Но к замечаниям в обсуждении отнесись внимательно и серьезно.
7. comol 5115 29.10.12 13:16 Сейчас в теме
Сорри, поставлю "-", а то народ щас "+" ов наставит и все так делать начнут.. а это всё-таки эксклюзив... в 99% случаев эта задача не так решается :(
8. kuzev 48 29.10.12 13:23 Сейчас в теме
(7) comol, ты противоречишь сам себе =) Ведь я воспользовался твоей идеей на практике применительно к своей ситуации.
9. comol 5115 29.10.12 13:34 Сейчас в теме
(8) Ну я показывал на примере типового РС... и как раз с целью оптимизации скорости. В твоём случае и восстановление более сложное и вопрос скорости так остро не стоит. Просто восстановил копию и штатной обработкой перегрузил что нужно...
10. kuzev 48 29.10.12 13:46 Сейчас в теме
(9) comol, я согласен дописать в конце статьи, что результат можно получить штатной обработкой. Только подтвердить это не могу.
Если обобщать, то тогда любой материал, размещенный здесь, "опасен", т.к. является плодом человеческих мыслей и труда. Человеческий фактор и все такое... Есть этот плод никто не заставляет. Каждый решает сам, пробовать его или нет.
Сейчас, спустя время, можно рассуждать о правильности того или иного варианта. В тот момент я выбрал путь и пошел по нему. Опять же, исходя из собственного опыта и имеющихся знаний.
11. comol 5115 29.10.12 14:05 Сейчас в теме
(10) Я вот реально задумался чтобы свою публикацию снять... Не предполагал что она так может быть использована...
14. kuzev 48 29.10.12 14:10 Сейчас в теме
(11) comol, это уже попахивает цензурой и запретом свободы мысли =)
12. comol 5115 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 48 29.10.12 14:14 Сейчас в теме
(13) Visitizer, спасибо. Чуть позже попробую этот вариант на тех же данных.
27. CratosX 115 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 48 30.10.12 09:43 Сейчас в теме
(17) makas, спасибо за ссылку.
19. makas 44 30.10.12 11:31 Сейчас в теме
20. insurgut 208 31.10.12 09:01 Сейчас в теме
Сума сойти - что за изобретение велосипеда?

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