Неубиваемая база 1С:Предприятие 7.7 (SQL) на распределенке (УРБД)

Данная статья актуальна для программистов и администраторов SQL-версии 1С:Предприятия 7.7 с УРБД. Если использовать 1С: Предприятие 7.7 (SQL) достаточно интенсивно, может происходить поломка (разъехались остатки, обрушились индекы, перестали проводиться документы из-за ошибок SQL и т.д.., в общем база «накрылась»). Можно проводить проверку, переиндексацию базы на SQL Server, мараковать с объектами 1С, копировать и удалять объекты, использовать всякие выгрузки-загрузки, но все это совсем не айс. Когда обмены в распределенной базе данных 1С Предприятия 7.7 выполняются достаточно интенсивно, решить проблему можно универсальным способом без плясок с бубном с помощью УРБД за 10-20-30 минут.

Когда не помогает DBCC DBREINDEX («RA4674»)…
Violation of primary key constraint ‘PK_RA4674’. Cannot insert duplicate key in object

Эта статья для администраторов и программистов 1С, если Вы не имеете достаточных знаний и полномочий, выполнять эти манипуляции на реальных данных нельзя (пока не научитесь).

Статья описывает порядок восстановления периферийных и центральных баз УРБД (в обмене участвуют все объекты, компонента "Расчет" не используется).

Если в периферийной базе некоторые объекты не мигрируют в ЦБ или наоборот в центральной базе есть объекты, которых не должно быть в перефирийке, использование этого способа восстановления не опробовано, при обмене необходимо учтитывать возможные несоответствия, которые можно выявить сравнением структуры объектов и модулей конфигураций центральной и периферийной базы и настройки правил обмена.

 Как восстановить работоспособность информационной базы 1С:Предприятие 7.7 (SQL) на распределенке (УРБД)? Используем следующей рецепт (Windows Server 2003 + MS SQL 7), в случае файловой базы можно опустить шаг 5:

1) Пользователям периферийной базы отправляем команду Пуск — Выполнить -> net send * за 10 минут до начала операций "через 10 минут всем выйти из 1С7.7!" Начинаем в конфигураторе выполнять обмен. Для тех, кто не в курсе как это делается — пример порядка ручного обмена в УРБД.

2) В конфигураторе центральной базы выполняем автообмен (выгрузку из центральной базы в периферийные базы). Для этого в
центральной базе устанавливаем флажки (выгрузка "префикс периферийной базы ПБ").

3) Повторное сообщение net send "Всем выйти из 1С7.7!" Если закрывашка встроенна в базу, воспользуемся ей.

4) Выгоняем всех пользователей из периферийной базы. Закрываем на сервере открытые файлы периферийной базы: Пуск — Мой компьютер — Управление — Общие папки — Открытые файлы — контекстное меню — все задачи — закрыть открытый файл. Желательно выгонять пользователей не в одиночку, ато если они успеют "пролезать" в базу sql тогда мароки по их выгону гораздо больше.

5) Удаляем сеансы периферийной базы на сервере SQL — в Query Analyzer хранимой процедурой sp_who смотрим кто в базе, в дальних колонках написано название базы, и на всех жертвах, кто остался в нашей периферийной базе выполняем команду "kill НомерПроцесса".

6) Иногда (после длительной яростной "зомби-фермы" с пользователями с многократным глубоким проникновением в 1С и выкидыванием) базу данных для обмена открыть невозможно. Файлы закрыты, процесса на SQL сервере нет, а в мониторе пользователь висит. В этом случае удаляем из временные файлы из профиля пользователя и вре менные файлы 1С из общего профиля. Неисключено, что прийдется перезагружать сервер 1С.

//Если бы мы просто выполняли обмен, а не восстановление периферийной базы, то порядок действий был бы следующий. В
//периферийной базе выполняем обмен — загрузку из центральной в периферийную и выгрузка из периферийной в центральную
//(для этого запускаем в конфигураторе периферийной базы автообмен и устанавливаем флажки загрузка ЦБ и выгрузка ЦБ, где
//ЦБ — префикс центральной базы). Пишем пользователям периферийной базы сообщение "можно работать в 1С". Вместо этого делаем следующее:
7) В поломанной периферийной базе выполняем обмен — выгрузка из периферийной в центральную (для этого запускаем в конфигураторе периферийной базы автообмен и устанавливаем флажок выгрузка в ЦБ).

8) Для всех периферийных баз, где не нужно восстанавливать бекап, выполняем загрузку из центральной и выгрузку в центральную.

9) В центральной выполняем обмен — загрузку из периферийной базы в центральную (загрузка ПБ) для всех периферийных баз.

10) Средствами SQL Server делаем бекап центральной базы и загружаем его в ту периферийную, которая не работает. В центральной базе предварительно стоит обрезать журнал регистрации SQL (сделать shrink) потому что он тоже размножится по периферийным базам когда мы загрузим в них Бекап. Шринк делается как написано в отдельной статье //infostart.ru/public/168314/

11) Удаляем в новой периферийной базе таблицы 1SDWNLDS, 1SUPDTS, CJ7287, CJ7289. Таблицы CJ7287, CJ7289 относятся к компоненте "Расчет" и способ их преобразования при замене периферийной базы централкой мне не известен, но заменить их из бекапа не удается, в центральной базе они бывает портятся (нарушена структура индексов CJ7287, CJ7289 и центральная база без монопольного режима не стартует) .

12) В таблице _1SDBSET есть поле DBSTATUS, оно может принимать следующие значения: P — Центральная M — Текущая N — Периферийная (непроинициирована) C — Периферийная. Редактируем таблицу в новой периферийной базе 1SDBSET, удаляем в ней все строчки кроме строчки данной периферийной ПБ и центральной ЦБ базы. В оставшихся двух строчках меняем статусы, в колонке DBSTATUS переназываем, меняем местами значения полей M и P.

13) В новой периферийной базе в таблице _1ssystem меняем префикс центральной ЦБ на префикс периферийной ПБ.

14) В новой периферийной базе в конфигураторе прописываем соединение с SQL базой.

15) Актуализируем оперативные итоги в периферийной базе (Управление оперативными итогами — делаем расчет оперативных итогов) и последние документы из последовательностей проводим текущей датой.

16) В режиме 1С: Предприятия устанавливаем константу "Префикс информационной базы Для УРИБ "ПБ"

17) Все, пишем пользователям периферийной базы сообщение "можно работать в 1С". После того, как научились выполнять такое восстановление периферийной базы, особенно если периферийных баз несколько, можно больше не делать ежедневные бекапы.

Техническое описание механизмов УРБД изложено в статьях
http://kb.mista.ru/article.php?id=20
http://kb.mista.ru/article.php?id=45&
http://argat.h11.ru/URBDStructure.html
http://1c.proclub.ru/modules/newbb/viewtopic.php?topic_id=258258&forum=2&viewmode=flat&order=ASC&start=all

Альтернативный метод "обрезки" ("свертки") базы 1С.77 на конкретную дату через УРБД
//infostart.ru/public/17072/

Плагин для лечения выгрузки и загрузки больших баз в 1С 7.7
//infostart.ru/public/15364/

Быстрый метод создания периферийной базы УРБД (скрипт SQL)
//infostart.ru/public/92564/ 

23 Comments

  1. ksnik
    Reply
  2. Yuris

    Я давно использую метод описанный в статье для восстановления периферийных баз. Я имею ввиду подмену испорченной периферийной SQL базы базой централки с последующим редактированием таблиц. Также удаляю таблицы если мне нужно оставить скажем одни справочники. Но обычно придерживаюсь принципа если база «шевелится» — выгрузка и загрузка. И все становится на место. Иногда приходилось делать из периферийки централку удалением таблицы 1SSYSTEM. Так что если у Вас УРБД можно спать спокойно. Одновременно сразу все не накроется. Есть еще более жесткие методы к урбд. Это редактирование DAT файла в архиве при обменах. Тот кто делал это тот меня поймет.

    Reply
  3. ksnik
    Reply
  4. Ёпрст

    Ай маладец, а что будешь делать с объектами, которые не мигрируют в ЦБ ?

    Т.е те, для которых миграция — «место создания» ?

    Всё, алес — всё твоё «восстановление» коту под хвост

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

    Reply
  5. ksnik

    (4) Ёпрст, Поправляю, статья писалась для случая периферийных и центральных баз идентичной структуры.

    Reply
  6. Dolly_EV

    (3) вообще-то и здесь оно есть http://infostart.ru/public/17072/

    зачем на proclub ссылку?

    (5) Структура как раз идентична, миграция разная)))

    Вобщем автор, много слов, и как-то сумбурно все. Плюс зачем упоминание про CJ7287, CJ7289 ?? (компонента «Расчет»)

    Reply
  7. ksnik

    (6) Dolly_EV, Инструкция практическая (что делать), а по поводу расчета спасибо исправляю — у нас расчет не используется.

    Reply
  8. maxis33

    Чтобы не менять ручками таблицы, есть скрипт

    http://infostart.ru/public/92564/

    Reply
  9. ksnik

    (8) maxis33, спасибо,

    Быстрый метод создания периферийной базы УРБД (скрипт SQL)

    http://infostart.ru/public/92564/

    должно пригодиться!

    Reply
  10. ander_

    +(6) сдается мне что CJ7287, CJ7289 не во всех базах есть и не во всех означают одно и то же 🙂

    Reply
  11. gashek

    Очень порадовало — «не делать бекапы».

    >17) Все, пишем пользователям периферийной базы сообщение «можно работать в 1С». После того, как научились выполнять такое восстановление периферийной базы, особенно если периферийных баз несколько, можно больше не делать ежедневные бекапы.

    Reply
  12. ksnik

    (10) ander_, я отдельно упомянул, что хоть таблицы CJ7287 и CJ7289 не используются, с ними периодически возникают проблемы в 1С с использованием распределенки, много о проблемах с этими таблицами можно найти в гугли, только рецепты их исправления сложнее, чем здесь мной описанный.

    Reply
  13. kaliningrad06

    Ну не знаю 7.7 практически умерла.

    Но взял пару интересных задумок попробую на 8.2

    Спасибо за статью.

    Reply
  14. Mikeware

    Какой-то изысканный бред.

    При нормально настроенной системе бэкапов все это не нужно.

    вместо описываемого геморроя проще сделать пару скрипотов или отработок.

    Reply
  15. ksnik

    Актуальность поднимать распределенку только лишь ради бекапа я в данной публикации не обосновывал, хотя действительно получилось похоже, согласен. То, что обмен между идентичными базами повышает надежность опровергнуть нельзя. Кроме того, базы 1С могут работать с разной производительностью, например если в них разное количество пользователей или если есть внешние источники данных (например ком-соединение).

    Reply
  16. Lionee

    классно , пригодится

    Reply
  17. ksnik

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

    В общем есть еще одна интересная статья на эту тему http://www.klerk.ru/print/1996

    суть в том, что таблицы 1С (напрммер таблицу регистра или таблицу журнала) можно соединять с таблицей регистрации плана обмена (_1supdts) для поиска проблемного объекта на котором прерывается обмен. Сначала смотрим журнал регистрации:



    https://fotki.yandex.ru/next/users/snkosmachev/album/224064/fullscreen/995110

    затем в поле DOCNO ищем тот документ, на котором прекратилась загрузка (последний загружннный по журналу регистрации оказался сбойным):



    https://fotki.yandex.ru/next/users/snkosmachev/album/224064/fullscreen/995111

    распроводим сбойный документ или удаляем из таблицы (_1supdts) сбойную запись и весь пакет загружается.

    Reply
  18. ksnik

    текст запроса восстановить загрузку данных обмена в 1с 7.7

    найти и исправить ошибку отказ от обмена следующий по таблице _1supdts документ, на котором прекратилась загрузка (следующий по таблице _1supdts документ за загружнным по журналу регистрации оказался сбойным)

    sel ect _1SJOURN.*, _1supdts.* from _1SJOURN

    inner join _1supdts

    on _1SJOURN.IDDOC = _1supdts.OBJID

    select * fr om _1supdts

    Reply
  19. ksnik
    Reply
  20. ksnik

    Пришлось бороться с сообщением «Изменения конфигурации не загружались в ИБ из которой пришел файл переноса»

    1) Делаем выгрузку из ПБ;

    2) Изменяем конфу в ЦБ и пытаемся загрузить выгрузку -> получаем: “Изменения конфигурации не загружались в ИБ из которой пришел файл переноса”;

    3) Делаем выгрузку из ЦБ. Обязательно загружаем этот архив на ПБ, иначе часть документов из ЦБ не выгрузится в ПБ;

    4) Просмотрщиком открываем файл 1Cv77Dld.id (выгрузки ЦБ) и наблюдаем строчку похожую на:

    {“Download ID”,B32CA7C5-4FC6-431D-ABF8-2A5E6F7658F9,“KL”,3BB40AD2-5DDA-4E39-83BB-ADB5C65A081F,“ЦБ”,8BAA3284-2B8C-450E-868F-781896A54BC4,“9|KL”}

    (ага! запоминаем цифру 9);

    5) Распаковываем файл 1Cv77Chs.dat, прибывший из ПБ;

    6) Ищем строчку похожую на {“8|ЦБ”}} (за ключевым словом Acknowledgements, у меня 4-я сверху);

    7) Меняем 8 на 9 и запаковываем обратно;

    8) Теперь в ЦБ все замечательно загружается!

    Подводя итоги:

    1) Номер выгрузки из ЦБ в файле 1Cv77Dld.id всегда должен соответствовать номеру выгрузки из ПБ в файле 1Cv77Chs.dat.

    2) ВНИМАНИЕ!!! Такой фокус не рекомендуется проделывать при структурных изменениях конфигурации!

    Ссылка на источник:http://pro1c.org.ua/index.php?showtopic=2789

    Reply
  21. acanta

    20) можно открыть в SQL таблицу _1сupdates и удалить строку с ид базы приемника и всеми нулями.

    Reply
  22. ksnik

    Решение задачи восстановления документа ранее введенного и отсутствующего в базе.

    В Центральной базе **** в адрес контрагента **** была создана накладная № РнСцНС000357 от 19.07.2018 и счет-фактура № СфСцНС000815 от 19.07.2018 в сумме 32 300,00 руб. В настоящее время этих документов в базе нет. Необходимо выяснить причину, почему эти документы исчезли из базы, выявить еще пропавшие по этой же причине документы, а также восстановить все исчезнувшие документы в базе строго с номерами, с которыми они были созданы, и предоставить их список.

    Поиск отсутствующих документов выполняем следующей обработкой:

    //*******************************************
    Процедура Сформировать()
    Префикс = «РнСцНС000»;
    ЧастьНомера = 0;
    СчетчикЦикла = 0;
    Док = СоздатьОбъект(«Документ»);
    Для СчетчикЦикла = 1 По 999 Цикл
    НомерСтр = СокрЛП(СчетчикЦикла);
    Если СтрДлина(НомерСтр)=1 Тогда
    НомерСтр=»00″+НомерСтр;
    ИначеЕсли СтрДлина(НомерСтр)=2 Тогда
    НомерСтр=»0″+НомерСтр;
    КонецЕсли;
    НомерДок = Префикс+НомерСтр;
    РезПоиска = Док.НайтиПоНомеру(НомерДок,ТекущаяДата(),»Реализация»);
    Если РезПоиска>0 Тогда
    Сообщить(Док);
    Иначе
    Сообщить(«Не найден «+НомерДок);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    

    Показать

    Оказывается, пропал документ всего один.



    Странно, что при поиске в журнале регистрации по представлению найден другой документ «РнСкНС060885» введенный исторически ранее чем проблемный, привязанный в журнале регистрацию по uid к этому представлению «РнСцНС000357».

    В базе данных 1C 7.7, в журнале _1sjourn найден по номеру документ который не отображается в общем журнале документов 1С 7.7



    требуется восстановить документ «РнСцНС000357».

    Reply
  23. ksnik

    (21)

    20) можно открыть в SQL таблицу _1сupdates и удалить строку с ид базы приемника и всеми нулями.

    Проверено, действительно работает, данные загружаются.

    SEL ECT [DBSIGN]
    ,[TYPEID]
    ,[OBJID]
    ,[DELETED]
    ,[DWNLDID]
    FR OM [sc2017].[dbo].[_1SUPDTS] where _1SUPDTS.DBSIGN = ‘Сб ‘ and _1SUPDTS.typeid = 0
    GO
    delete fr om _1SUPDTS wh ere _1SUPDTS.DBSIGN = ‘Сб ‘ and _1SUPDTS.typeid = 0
    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *