miron16
19.06.13
✎
08:21
Ошибки после динамического обновления. Перечитал много форумов. На инфостарте нашел статью в которой рекомендуется удалить строку в таблице SQL и перезапустить конфигуратор. так и сделал. Теперь Конфигуратор каждый раз предлагает динамически обновить конфигурацию базы при запуске, пишет что все ок и требуется перезагрузить конфигуратор….при запуске вываливается с ошибкой, записью дампа и все по новому…
Как запустить конфигуратор?
ICWiner
19.06.13
✎
08:24
ICWiner
19.06.13
✎
08:25
Ну и почисти таблицу dbo.ConfigSave, там лежит типа измененная конфигурация
ICWiner
19.06.13
✎
08:26
Хотя не совсем такая… Но попробовать стоит. И, конечно же, ты перед тем как что-то пробовать сделал выгрузку средствами скуля?..
miron16
19.06.13
✎
08:27
dbo.ConfigSave — пустая
miron16
19.06.13
✎
08:28
скулевый бекап конечно же сделал
Vovan_Magadan
19.06.13
✎
08:28
(0) что именно вызвало ошибку?
То-есть типа все время ДО было норм, сегодня фаза луны криво встала и ДО убило базу?
ICWiner
19.06.13
✎
08:29
Берешь еще рабочий бекап с такой же конфигурацией и копируешь dbo.Config из нее в свою. По ссылке в (1) все расписано
ICWiner
19.06.13
✎
08:29
Попробуй так
Vovan_Magadan
19.06.13
✎
08:30
(7) да… особенно это забавно делать в Файловом режиме, через HEX редактор
ICWiner
19.06.13
✎
08:30
Я пока боролся с результатом ДО чуть не поседел… Теперь только обычные обновления ночью. В крайнем случае в обед всех пользователей выгоняю
ICWiner
19.06.13
✎
08:31
(9) в (0) «На инфостарте нашел статью в которой рекомендуется удалить строку в таблице SQL и перезапустить конфигуратор. так и сделал.» Что как бэ намекает на клиент-сервер…
miron16
19.06.13
✎
08:31
нет последнего рабочего бекапа с текущей конфой
ICWiner
19.06.13
✎
08:32
Ну то что ты динамически менял — ты не структуру данных менял, так что и оно пойдет. Ночной конфигг есть?
miron16
19.06.13
✎
08:32
конфиг есть 2х дневный
ICWiner
19.06.13
✎
08:33
После этого реквизиты/документы добавлял?
miron16
19.06.13
✎
08:34
не уверен….
miron16
19.06.13
✎
08:34
но если и добавлял — то если они пропадут — ничего страшного
ICWiner
19.06.13
✎
08:35
Ну на копии грех не попробовать
shuhard
19.06.13
✎
08:47
(14) ну и что мешает взять Cf двухдневной давности и выгрузитьбзвгрузитьчерезxml ?
miron16
19.06.13
✎
09:10
shuhard — так и делаю =)
shuhard
19.06.13
✎
09:12
(19) хотя я в таких случаях переношу dbo.ConfigSave из базки в базку, но выгрузка полезна, битые ссылки почистяться =)
ICWiner
19.06.13
✎
09:14
(21) Дык если ConfigSave пустая… И смысл ее переносить, там же не примененные изменения
shuhard
19.06.13
✎
09:15
(22) в бэкапе двухдневной давности пустая — оооооооооооооооооооооооооооо
ICWiner
19.06.13
✎
09:19
А почему она должна быть заполненной? Возможно, таки, я не правильно понимаю… Там же хранятся изменения, которые еще не применены в конфигурацию? Или глупость говорю?
ICWiner
19.06.13
✎
09:20
Ну в смысле сохранены, но действие «Обновить конфигурацию бд» еще не выполнялось
Serg_1960
19.06.13
✎
09:52
(0) Прежде чем ломать и удалять, я бы попробывал первым делом откатиться к конфигурации базы данных через /RollbackCfg…
В SQL попробуй найти и удалить записи в таблице Config, содержащие «commit» в FileName. Если у тебя рухнуло именно в фазе демонического обновления — то «dynamicCommit».
Имхо, всего может быть четыре таких записи — начало и конец «статистического» и «демонического» обновлений.
PS: разумеется — все эксперименты на копии.
miron16
19.06.13
✎
10:23
dynamicCommit — вот что мешало!!!! СПАСИБО!!!
Обнаружена незавершенная операция сохранения конфигурации
Ошибка возникает после динамического обновления.
При запуске 1с сначала выходит диалог с ошибкой «При обновлении данных после последней реструктуризации произошла критическая ошибка. Повторить обновление».
Если попытаться обновить, бывает два варианта сценария
- все применяется корректно, но потребуется завершить работу пользователей для обновления
- обновление не проходит: выходит сообщение («Обнаружена незавершенная операция сохранения конфигурации«)
Причины и обстоятельства
Такие ошибки возникают обычно на старых версиях платформы. В настоящее они время проявляются очень редко (на 8.3 не встречалось ни разу).
Также замечу: в последней платформе 8.3.8 появилось долгожданное динамическое обновление в клиент-серверном режиме без перезапуска конфигуратора (ранее такое было только на файловых базах).
Можно долго говорить о том, что не надо пользоваться динамическим обновление, необходимо организовывать работу так, чтобы это происходило реже, но это документированный функционал платформы, соответственно он должен работать корректно.
Что же делать при такой ошибке?
- запомнить/записать точное время возникновения ошибки.
- сообщить всем о том, что ошибка известна, вы работаете над ее решением и база некоторое время работать не будет (далее игнорируете всех, кто не может вам помочь иначе вас затерроризируют вопросами)
- сделать полную копию базы данных
- развернуть(открыть) копию базы, где конфигурация соответствует составу реквизитов (они должны совпадать), код модулей и форм может отличаться (быть не актуальным)
- если есть отличия в реквизитах постараться «свести» конфигурации
Если копий нет, то в случае если конфигурация типовая и правки не затрагивают структуру данных, то разворачивайте типовую конфигурацию.
Далее, производите замещение конфигурации из «копии» в «исправляемую» базу
Для этого Запускаете SQL Management Studio и выполняете такой запрос:
delete from [ИмяИсправляемойБазы].[dbo].[Config] GO insert into [ИмяИсправляемойБазы].[dbo].[Config] SELECT [FileName] ,[Creation] ,[Modified] ,[Attributes] ,[DataSize] ,[BinaryData] FROM [КопияБазы].[dbo].[Config] GO
В 99% случаев он вам поможет (мне помогало 3 раза). Исправление занимало от 5 до 20 минут.
Далее восполняете пробелы в коде. Если конфигурация подключена к хранилищу, необходимо синхронизировать захваченные объекты (отпустить и захватить заново), внести правки.
Если версия файловая произведите тестирование утилитой «C:\Program Files (x86)\1cv8\8.*.*.*\bin\chdbfl.exe».
При отсутствии конфигурации/копии:
- смотрите записи таблицы dbo.ConfigSave, при наличии — очищайте (пробуйте запустится)
- смотрите записи таблицы Config, на поле «FileName», если есть со значением «commit»,»dbStruFinal» или «dynamicCommit» — удаляйте
- либо в этой же таблице смотрите записи с именами подобными %_dynupdate_ % (здесь потребуется «по манипулировать» с датами и именами, но у меня не получалось)
Не помогло?
В остальных случаях придется поднимать и откатывать копии базы данных или транзакции (при полной модели восстановлении).
При небольшом документообороте может оказаться проще откатить базу на несколько минут назад — быстрее восстановить работоспособность (внести данные заново), чем поднимать другие копии.
Рекомендации
- Используйте полную модель восстановления
- Чаще делайте копии и базы, и конфигурации (в идеале: перед каждым обновлением)
- Используйте хранилище для разработки
- Держите рядом копию базы (это сэкономит время для восстановления)
- При подозрительных ошибках в момент обмена с хранилищем не обновляйте базу при работающих пользователях
В моем случае возникла ошибка snegopat-а при обмене с хранилищем, а затем такая же в момент обновления — с вытекающими проблемами.
Делать деньги без рекламы может только монетный двор.
Вдаваться в подробности, что такое динамическое обновления, как оно полезно и как оно вредно я не буду, так как статей на эту тему уже много, так же как и способов ее решения. Просто расскажу о своем опыте и о требовании для разработчиков 1С, которое было введено в компании на основе этого опыта.
Динамическое обновление — это, конечно, нехорошо, но порой других возможностей просто нет. К примеру, компания, работающая 24/7 с количеством людей, работающих в базе, от 100 человек. Когда всех выгнать из базы и провести обновление очень затратно и необходимо заранее это согласовывать, тогда приходится использовать динамическое обновление. Сама ошибка заключется в том, что в момент записи в таблицу «Config» что-то произошло, что помешало корректно закончить данную процедуру. И существует два основных способа лечения этой проблемы:
— Первый — это удалить записи о том, что конфигурация обновлялась (не рекомендую, так как у меня не всегда корректно работало).
— Второй способ — перезаписать все данные в таблицы «Config» из резервной копии вашей рабочей базы.
Второй способ более надежный, но была проблема в том, что необходимо было поднимать и разворачивать SQL-ный бэкап, что занимало много времени.
И поэтому придумали простой и надежный механизм. Перед каждым динамическим обновлением просто сохранять таблицы «Config» и «ConfigSave» (Сохранять ConfigSave» не обязательно, мы делали, чтобы сохранить сделанные наработки в конфигурации).
Создал внешнюю обработку с двумя кнопками «Сохраниться перед динамическим обновлением» и «Восстановить данные после ошибки динамического обновления».
Копка «Сохраниться перед динамическим обновлением» вызывает процедуру:
Процедура Сохраниться() //Подключение к SQL Connection=Новый COMОбъект("ADODB.Connection"); Connection.ConnectionTimeOut =600; Connection.Open("Provider=SQLOLEDB.1;Password=Пароль;Persist Security Info=True;User ID=Пользовать;Initial Catalog=SQL_ИмяБазы;Data Source=SQL_Сервер"); RecordSet=Новый COMОбъект("ADODB.Recordset"); RecordSet.CursorLocation=3; RecordSet.LockType=2; Запрос="[master].[dbo].[sp_backup_config_tables]"; RecordSet.Open(Запрос, Connection); //Сохраняем информацию о последнем обновлении СтруктураДанных=Новый Структура(); СтруктураДанных.Вставить("Пользователь",ПараметрыСеанса.ТекущийПользователь); СтруктураДанных.Вставить("ДатаСохранения",ТекущаяДата()); СтруктураДанных.Вставить("ИмяСервера",ИмяКомпьютера()); ЗначениеВФайл (ПолноеИмяФайла,СтруктураДанных); ТекстИзменений=""; Запрос="SELECT [FileName] FROM [SQL_ИмяБазы].[dbo].[ConfigSave]";; RecordSet.Open(Запрос, Connection); Если RecordSet.RecordCount>0 Тогда RecordSet.MoveFirst(); Пока НЕ RecordSet.EOF() Цикл; ТекстИзменений=ТекстИзменений+Символы.ПС+строка(RecordSet.Fields(0).Value); RecordSet.MoveNext(); КонецЦикла; КонецЕсли; RecordSet.Close(); Сообщить("Данные сохранены. Будут изменены таблици:"+ТекстИзменений); КонецПроцедуры
Копка «Восстановить данные после ошибки динамического обновления» вызывает процедуру:
Процедура Восстановить () //Подключение к SQL Connection=Новый COMОбъект("ADODB.Connection"); Connection.ConnectionTimeOut =6000; Connection.Open("Provider=SQLOLEDB.1;Password=Пароль;Persist Security Info=True;User ID=Пользовать;Initial Catalog=SQL_ИмяБазы;Data Source=SQL_Сервер"); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText ="[master]. [dbo].[sp_restore_config_tables]"; Command.CommandType = 1; RecordSet = Новый ComОбъект("ADODB.RecordSet"); RecordSet.CursorType = 3; RecordSet.LockType = 2; RecordSet = Command.Execute(); КонецПроцедуры
[master].[dbo].[sp_backup_config_tables] и [master]. [dbo].[sp_restore_config_tables]
Это процедуры в SQl.
[master].[dbo].[sp_backup_config_tables]
SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO /* ** The system profile of the same type of agent will be used as a template for ** the parameters in this new user profile. */ ALTER procedure [dbo].[sp_backup_config_tables] AS SET NOCOUNT ON truncate table [dbo].[Config_Backup]; truncate table [dbo].[ConfigSave_Backup]; insert into [dbo].[Config_Backup] select * from SQL_ИмяБазы.[dbo].[Config]; insert into [dbo].[ConfigSave_Backup] select * from SQL_ИмяБазы.[dbo].[ConfigSave];
[master]. [dbo].[sp_restore_config_tables]
USE [master] GO /****** Object: StoredProcedure [dbo].[sp_restore_config_tables] Script Date: 01/22/2023 11:48:09 ******/ SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO /* ** The system profile of the same type of agent will be used as a template for ** the parameters in this new user profile. */ ALTER procedure [dbo].[sp_restore_config_tables] AS SET NOCOUNT ON truncate table SQL_ИмяБазы.[dbo].[Config]; truncate table SQL_ИмяБазы.[dbo].[ConfigSave]; insert into SQL_ИмяБазы.[dbo].[Config] select * from [dbo].[Config_Backup]; insert into SQL_ИмяБазы.[dbo].[ConfigSave] select * from [dbo].[ConfigSave_Backup];
При нажатии кнопки «Восстановить данные после ошибки динамического обновления» блокировать работу пользователей не надо. Те, которые уже работают, ничего не заметят, а новые зайти не смогут.
Если раньше такая ошибка считалась критичной и время восстановления занимало до 1 часа, то теперь оно сократилось до 5 минут.
Update :
Статья о триггере , для сохранения таблицы Config перед обновлением //infostart.ru/public/327674/
Файл не обнаружен ‘v8srvr://
Ошибка вида:
лечится следующим скриптом в SQL (guid надо подставить из сообщения об ошибке):
INSERT INTO [dbo].[Config]
([FileName]
,[Creation]
,[Modified]
,[Attributes]
,[DataSize]
,[BinaryData]
,[PartNo])
VALUES
('e0666db2-45d6-49b4-a200-061c6ba7d569.12b2c980-fd4a-4771-a29e-6be72b316bb7'
,CURRENT_TIMESTAMP
,CURRENT_TIMESTAMP
,0
,0
,''
,0)
GO09
Недавно, при динамическом обновлении конфигурации sql -базы на платформе 8.2 возник сбой, после которого, перестал запускаться конфигуратор, выдавая сообщение «Внимание!!! При обновлении данных, после последней реструктуризации, произошла ошибка. Повторить обновление?», если ответить Да, то появлялось второе сообщение «Обнаружена незавершенная операция сохранения конфигурации. Для продолжения работы необходимо завершить операцию.»
Данная проблема я не встречал ни разу на платформе 8.3
До обновления конфигурации я не делал архивную копию и потому восстановить базу из резервной копии предыдущего дня невозможно без потери информации.
Поиск решения вопроса в интернете дал мне надежду. Очень помогла статья на сайте 42clouds Незавершенная операция обновления конфигурации БД
Как известно, вся информационная база представляется в базе данных в виде набора таблиц. Среди них есть несколько таблиц, которые обязательно присутствуют в представлении любой информационной базы ( подробнее можно посмотреть на диске ИТС Размещение данных 1С:Предприятия . Из всех этих таблиц для нас имеет значения только 2 таблицы из них:
- dbo.Config – основная конфигурация информационной базы. Эта конфигурация соответствует реальной структуре данных и используется 1С:Предприятием 8.0 в режиме Предприятия данные переносятся в эту таблицу после обновления
- dbo.ConfigSave – конфигурация, редактируемая Конфигуратором. Конфигурация из ConfigSave переписывается в Config при выполнении “Обновления конфигурации базы данных” в Конфигураторе, а наоборот – при выполнении в Конфигураторе операции “Конфигурация – Конфигурация базы данных – Вернуться к конфигурации БД”
Согласно информации в интернете проблема связана с испорченной таблицей dbo.Config и предлагается 2 варианта решения:
Вариант 1: Воспользоваться возможностью скопировать таблицу dbo.Config из идентичной базы в неработающую
Вариант 2 Удалить все найденные изменения. Для этого вам необходимо выполнить 3 запроса:
- delete from config where FileName = ‘commit’
- delete from config where FileName = ‘dbStruFinal’
- delete from config where FileName = ‘dynamicCommit’
Я выполнил все 3 запроса, но говоря, что иногда достаточно выполнить только первый запрос.
В других статьях в интернете предлагают другой вариант по шагам:
- Делать бэкап рухнувшей базы средствами SQL.
- Очистить таблицу dbo.config рухнувшей базы SQL- Profiler запустить команду:
Use BaseName go Delete From [DBO].[Config] go
где BaseName – это имя рухнувшей базы.