Хотел начать описание с рассказа о регистрах итогах и их пересчетах, но наткнулся на отличную статью //infostart.ru/public/177171/ (жаль, что нашел её только сейчас).
Начав исследовать наши регистры нашли в первую очередь:
- Не закрытые периоды
- Огромное количество периодов в некоторых регистрах, как в далеком прошлом, так и будущем. Это говорило о том, что пользователи ошибались с вводом даты и отправляли документы в 0014 год или 2114. Как следствие, например платежный календарь, строился катастрофически долго.
Во вторую очередь начали анализировать количество строк в регистрах, размер данных и индексов, средний вес записи. Соглашусь что данные достаточно специфичные, поэтому выводятся на форму взведением соответствующих флажков. Это позволило нам найти решистр в котором данные хранились не оптимально.
В результате появилась эта обработка. При выводе минимального набора информации на форму обработки имеет вид:
После взведения флажков «Выводить данные SQL» и «Спец. Инф.»:
Предварительно, на закладке «Настройки», требуется заполнить сервер SQL, а также имя БД, логин и пароль.
Для удобства есть настройки позволяющие выводить информацию только по регистрам остатков или только по оборотным или не выводить пустые.
Обработка по нажатию кнопки «Заполнить таблицу регистров», заполняет соответствующую таблицу (левая). Таблица заполнится на основании данных 1С:
СпРегистров = Метаданные.РегистрыНакопления; Для Каждого Регистр ИЗ СпРегистров Цикл ДанныеРегистра = Новый Структура(КлючиСтроки); ДанныеРегистра.Имя = Регистр.Имя; ДанныеРегистра.Вид = Строка(Регистр.ВидРегистра); ... и т.д.
И на основании данных MS SQL:
Запрос = "exec sp_spaceused '" + ИмяТаблицы + "', false"; РезультатЗапроса = ВыполнитьЗапросSQL(Соединение, Запрос); Если РезультатЗапроса <> "Ошибка при выполнении T-SQL запроса!" Тогда РазмерыТаблицы = Новый Структура; РазмерыТаблицы.Вставить("РазмерДанных", ПересчитатьВ_МБ(РезультатЗапроса[0].data)); РазмерыТаблицы.Вставить("РазмерИндекса", ПересчитатьВ_МБ(РезультатЗапроса[0].index_size)); РазмерыТаблицы.Вставить("КоличествоСтрок", Число(СокрЛП(РезультатЗапроса[0].rows))); РазмерыТаблицы.Вставить("РазмерДанных_В_КБ", ПересчитатьСреднийВесВ_КБ(РезультатЗапроса[0].data, Число(СокрЛП(РезультатЗапроса[0].rows)))); КонецЕсли;
По двойному нажатию мышки в таблице регистров обработка получает информацию «количество строк по периодам» и заполняет соответствующую таблицу (справа). Данные «кэшируются» и для повторного их просмотра достаточно перейти на нужный регистр с помощью клавиатуры или одинарным щелчком мыши. При двойном нажатии данные обновятся.
SELECT Period, sum(countI), sum(countD) From (SELECT _Period AS Period, count(*) AS countI, 0 AS countD FROM " + ИмяТаблицыИтоги + " GROUP BY _Period UNION ALL SELECT Period as Period, 0 as countI, count(*) as countD FROM ( SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0, _Period),0) as Period FROM " + ИмяТаблицыОсновная + " ) as v GROUP BY Period ) as al GROUP by Period ORDER by Period desc
Динамика считается отдельно, средствами 1С:
Таблицу строк по периодам читаем снизу вверх. Считаются количество записей в основной таблице и таблице итогов за указанный период, для удобства отражена динамика прироста относительно прошлого периода. Это не количество документов, а количество записей, т.е. может быть 1 документ с 9 строками табличной части.
При двойном нажатии на период можно получить список документов, которые включены в данный период.
В дополнение была сделана кнопка, позволяющая сгенерировать SQL запрос на обновление статистики по выделенным через ctrl регистрам.
P.S. Текущие итоги 1С хранит в дате 01.11.5999
Upd. v.2 10.04.2015
1. Добавлена вторая форма, теперь обработка открывается как в управляемом приложении так и в обычном. В итоге обработка стала универсальной. Тестировал на УТ 11.1, БП 2.0, УПП, 1C:Деньги 8.3
2. Переделал логику получения информации о регистрах. Раньше всё проходило одним в цикле в процедуре на сервере, из-за чего нельзя было получать нормально обратную связь о происходящем на сервере. Теперь цикл выполняется на клиенте и после каждого обращения на сервер отображает "состояние" с % выполнения в прогресс-баре.
3. Теперь если не выбирать флаги "Получить данные из 1С" и "Получить данные из SQL" получите просто список регистров с указанием вида.
4. Есть небольшие отличия в работе УФ и ОФ.
4.1 УФ. Фильтровать по виду регистра можно после заполнения таблицы регистров, есть возможность отфильтровать не пустые регистры. Данные по количеству и составу периодов в регистрах кэшируются. При двойном нажатии на период открывайется форма со писком регистраторв. Состояние получения ифнормации в отдельном окне с прогресс-баром.
4.2 ОФ. Фильтровать по виду регистра нужно выбирать ДО заполнения таблицы регистров. НЕТ возможность отфильтровать не пустые регистры. Данные по количеству и составу периодов в регистрах НЕ кэшируются. При двойном нажатии на период НЕ открывайется форма со писком регистраторв. Строка состояния внизу окна. прогресс-бар над таблицей регистров.
Добавил 2 скрин-шота, как стало выглядеть в УФ и ОФ.