Неубиваемая база 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 не будет опубликован. Обязательные поля помечены *