{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.
(7) вырос объем базы, и были только несколько предположений, с помощь обработки все подтвердил. Есть один удаленный филиал, объем с которым осуществляется по электронной почте, в результате отсутствия связи файл обмена вырос и они хранились в самой БД.
(7) да заработало. Пытался ввести доменный логин и пароль, затем пароль пользователя базы 1С с полными правами. Выкидывало в ошибку. Затем поставил чекбокс в NT и все само заработало!
У нас как-то при очередном обновлении УПП база выросла на 20 Гб.
Как потом разобрались причиной послужило автоматическое включение типового механизма версионирования.
{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.
(10) dka80, тоже бьюсь над этой проблеммой .
такая ошибка вылетает иногда причем я заметил только на больших таблицах. И выпадает она именно из за того, что когда выполняется sp_spaceused иногда происходит конфликт блокировок в итоге селект не возвращает ничего и 1С вылетет .
Пытаюсь бороться с этим уже недели и в транзакции запускал и время соединения (таймаут) увеличивал, все равно иногда вылетает.:( :(
Очень обидно так как эту замечательную обработку настроил так чтобы она выгружала информацию о статистике в отдельно стоящую базу, в которой накапливаются данных о наших 15 информационных базах. В итоге наконец то получил общую статистику по размерам. Теперь бы сделать так чтобы сбор статистики работал стабильно, чтобы можно было ее запускать регулярно.
Вопрос к автору. Во первых огромное спасибо за обработку и во вторы можно ли с Вами как то связаться е-майл, телефон, скайп? Может постараемся как то совместно решить данную проблему? Я очень заинтересован в развитии данной обработке и думаю что сделаю следующие дополнительные опции:
1) Выгрузка данных в отдельно стоящее хранилище - простенькая БД с табличками Сервер, БазаДанных, Таблица1С_СКЭЛЬ, ЛогРазмеров на каждую дату.
2) Дополнительно хочу сделать выгрузку по каждой таблице размера индекса и статистике их использования, по аналогии с таблицами получать данные по DM_DB_INDEX_OPERATIONAL_STATS,DM_DB_INDEX_USAGE_STATS, sp_MSindexspace
3) накапливание статистики по рекомендуемым индексам в БД
(10) dka80, SQL Server Native Client 10.0 может и отсутствовать на клиенте, если только вы не ставили его специально, по умолчанию он отсутствует, как выход - переделать на встроенный SQL Server, разницы не будет ни какой.
{Форма.Форма.Форма(120)}: Ошибка при вызове метода контекста (NextRecordset)
RS = RS.NextRecordset();
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции.
Урааа!!!!!!! Две недели бился :)
кажется решил проблему с таймаутом и ошибкой Текущий поставщик не поддерживает возврат нескольких наборов записей в результате
попробуйте изменить следующее:
RS = Новый COMОбъект("ADODB.Recordset");
cmd = Новый COMОбъект("ADODB.Command");
cmd.ActiveConnection = Connect;
cmd.CommandText = СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL);
//Добавляем информацию о тамймауте.
cmd.CommandTimeout=360; Попытка
//при вызове рекодсета так - он не использует настройки таймаута.
//RS.Open(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL), Connect); //Вызываем рекордсет через RS=cmd.Execute(); RS=cmd.Execute();
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("------------------");
сообщить(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL));
КонецПопытки;
Для информации - мой вариант запроса по размерам таблицы.
1) Была проблема когда параллельно выгружаешь данные из нескольких баз а временная таблица одна. Для каждой базы нужно создавать таблицу со своим имененм. Переменная должна быть инициализирована выше.
2) Добавил перед началом удаление таблицы если она существует.
3) Если по каким то причинам запрос вылетает (у меня иногда бывает, когда запускаешь в консоли - конфликты блокировок, сделал так чтобы команда выполнялась 30 раз в цикле, если возникает какая то проблема.
ШаблонЗапросаУдаления="if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..[#t_"+ИмяБазыДанных+"]') ) drop table #t_"+ИмяБазыДанных+";";
ШаблонЗапроса = "
|SET NOCOUNT ON;
|declare @sucess int;
|declare @count int;
|set @sucess=0;
|set @count=0;
|WHILE @sucess = 0 and @count<30
|BEGIN
| BEGIN TRY
| BEGIN TRANSACTION;
| "+ШаблонЗапросаУдаления+"
| CREATE TABLE #t_"+ИмяБазыДанных+"([Name] varchar(255), [TableRows] varchar(255), [SizeReserved] varchar(255), [DataSize] varchar(255), [IndexSize] varchar(255), [Unused] varchar(255));
| INSERT INTO #t_"+ИмяБазыДанных+"
| exec sp_spaceused N'%ИмяТаблицы%','true';
| SELECT * FROM #t_"+ИмяБазыДанных+" ORDER BY CONVERT(bigint, REPLACE([SizeReserved], ' KB', '')) DESC;
| "+ШаблонЗапросаУдаления+"
| set @sucess=1;
| COMMIT TRANSACTION;
| END TRY
| BEGIN CATCH
| set @count=@count+1;
| WAITFOR DELAY '00:00:05';
| END CATCH
|END ";
Вы получаете только таблицы с ссылками на объекты. Сколько реально данных и их объем по объектам метаданных (хоть документ, хоть - регистр), вы и близко не получаете.
реальных таблиц в которых хранятся объекты.
В 1с практически нет связей "один объект - одна таблица" (только для самых примитивных "объектов" - которые представлены примитивными типами данных). Это не реляционная система хранения данных. Чтобы получить объем данных по объекту - нужно по ссылкам найти все завязанные на этот объект данные по всем смежным таблицам.
А вы просто получате данные по списку объектов, который, собственно, вы можете получить любым списком в 1С, а не по самим объектам. И умножить на вес полей в таблице хранения - и получите тот же самый объем таблицы хранения ссылок.
(16) AlexO, изучите обработку повнимательнее.
Для каждого объекта выводятся таблицы SQL в которых он хранится.
Регистр - Основная, Итоги.
Документ, Справочник - Основная, Табличные части.
Для каждой реальной таблицы определяется ее размер средством запроса к SQL серверу.
(17)
т.е. вы даже не занете, как ваша обработка работает?
и что даже на скриншоте у вас - одна таблица к каждому объекту и вес/количество записей в ней?
то, что у вас один объект - одна таблица, и подсчет только по этой таблице. А в 1С такого не бывает - чтобы объект занимал одну таблицу (документ там, или справочник; понятно, что можно получить "вес" всех записей регистра - но какое это имеет отношение к "весу", скажем, документов?).
В 1С данные по объектам "размазаны" по базе, а не в одной таблице находятся.
(19)
вы одного не поймете - что чтобы получить объем, например, определенного вида документов, нужно оценить все таблицы как самих документов, так и их взаимодействие: проводки по регистрам (что вы и оцениваете как "вес объекта"), использование данных (и создание под это новых структур хранения в базе - т.е. увеличение занимаемого базой места) из них в других объектах и т.д.
(28) AlexO,
Вы тестировали обработку ? Сравнивали полученный результат с размером файла базы данных?
Один в один они конечно не сойдутся, всегда будет отличие на объем служебных таблиц.
Интересная обработка
У меня при формировании выдала ошибку:
Не удалось соединиться с SQL - сервером
{Форма.Форма.Форма(93)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Ошибка входа пользователя "sa".
Работает. Может пригодиться.
Безвариантное представление информации - только дерево, ни фильтров, ни смены сортировки, но это легко решаемо.
Надобность вручную вписать строку подключения напрягла, но не сильно, минут на 5.
А вот что хотелось бы сразу видеть в статье - что запускать обработку надо в той же базе, для которой берешь статистику... А то я было разогнался в другую базу, мол, всё равно строку подключения целиком пишу ;-]
(33) Находил ещё больше 320Гб из которых 96% была таблица "Версии объектов".
Простым образом (записать пустой набор записей регистра) не получится.
Простой выход - просто чистить последовательным удалением отдельных записей. Долго, но надежно.
Вам на заметку!
Сейчас идет полное считывание данных, а мне нужно только по нескольким таблицам метаданных. Было бы удобно, если бы был фильтр на считывание только этих данных!
Никак не получается подключиться к базе, вываливается ошибка:
Указанный пользователь 1с не является администратором данной базы, чтение информации невозможно
Вычисленный размер базы выходит гораздо меньше реального физического объёма. Никак не могу определиться с чем это связано, поскольку в разных базах разные диспропорции...
(47) Добавляется место для временных файлов. Сразу добавляется определенным размером. Например после тестирования свободное место в базе примерно 1/3 от размера базы. Нужно сжимать базу.
Подскажите, что случилось у нас с БД?
За неделю одна таблица выросла в несколько раз, до 8Gb.
Речь о табличной части Товары документа "Счет на оплату покупателю".
Вот текущее состояние таблицы:
name rows resivedKB dataKB index_sizeKB unusedKB
_Document635_VT19248 1044567 9790240 8356536 1430768 2936
Что было? Ничего криминального не было. Добавлен реквизит (тип: перечисление) в сам документ.
Произошла исключительная ситуация (ADODB.Recordset): Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.
{ВнешняяОбработка.РазмерТаблицБазыДанных.Форма.Форма.Форма(114)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Время ожидания запроса истекло