gifts2017

Контроль итогов и регистров УФ, ОФ 8.2, 8.3

Опубликовал Владимир Мосин (Silmariil) в раздел Программирование - Инструментарий

Некоторые процессы в УТ шли подозрительно долго, начали разбираться, в итоге появилась обработка, позволяющая взглянуть на регистры и итоги в 1С УТ как со стороны 1С, так и со стороны MS SQL.

Хотел начать описание с рассказа о регистрах итогах и их пересчетах, но наткнулся на отличную статью http://infostart.ru/public/177171/ (жаль, что нашел её только сейчас).

Начав исследовать наши регистры нашли в первую очередь:

  1. Не закрытые периоды
  2. Огромное количество периодов в некоторых регистрах, как в далеком прошлом, так и будущем. Это говорило о том, что пользователи ошибались с вводом даты и отправляли документы в 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 скрин-шота, как стало выглядеть в УФ и ОФ.

Скачать файлы

Наименование Файл Версия Размер
КонтрольИтогов 27
.epf 29,70Kb
10.04.15
27
.epf v. 2 29,70Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Роман С (Dach) 09.04.15 13:26
Работает только для УТ? На нетиповой УППшке запустил, полчаса работы обработки - результат ноль, 1с висит
2. Владимир Мосин (Silmariil) 09.04.15 13:28
(1) Dach, Привязки к конфигурации нет, но могу предположить что в УПП очень большое количество регистров, к сожалению не пользовался не могу подсказать.
3. Роман С (Dach) 09.04.15 13:34
(2) сколько выполнялся запрос в УТ и его обработка? Есть смысл тогда какой-нибудь прогресс-бар запилить... А еще лучше - отбор по метаданным, то есть по регистам
4. Роман С (Dach) 09.04.15 14:07
Больше часа - результат 0.... Печаль (((
5. Владимир Мосин (Silmariil) 10.04.15 21:52
(4) Dach, переделал обработку, см. upd. v2 в описании. Теперь будет видно что происходит. Тестировал на УПП, 30 секунд на получений всех данных.
6. Алексей Захаров (almas) 24.09.15 00:37
Жаль, что не показывает сколько записей всего и сколько из них нулевых. А так не понятно для чего?
картинка - да красиво сделана. Но какой сэтой картинки можно сделать анализ?
Под 8.3 не работает, пишет что тип не может быть помещен во временное хранилище. Пришлось процедуру заполнения убрать с клиента на сервер
7. Сергей Старых (tormozit) 10.05.16 08:50
(6) Добавил аналогичный инструмент в подсистему "Инструменты разработчика" в версию 3.62. Там показывается количество нулевых строк итогов и можно их удалять до заданного периода.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа