В предыдущей статье была рассмотрена проблема накопления нулевых записей по регистрам остатков в конфигурациях, использующих регистры оперативного учета. После написания ее было бы логично рассмотреть, компоненту бухгалтерского учета, чтобы выяснить, существуют ли и в бухгалтерских конфигурациях подобные явления. Как видно из файла описанию структуры базы данных – за хранение бухгалтерских итогов отвечают две основные таблицы.
Первая таблица называется «Итоги». В ней поквартально хранятся обороты по синтетическим счетам плана счетов. При этом в каждой строке этой таблице обороты хранятся отдельно по 1 -му, 2 -му и 3 -му месяцу квартала. Исходя из этих условий, данная таблица никогда не бывает большой по объему. Тем не менее, мы включим ее в список таблиц для тестирования и очистки.
Вторая таблица называется «Остатки». В ней, также поквартально, как и в первой таблице, хранится начальное сальдо, хранятся поквартально отдельно обороты по Дебету и по Кредиту по счетам в разрезе субконто. Для каждого месяца (имеется в виду 1 -й, 2 -й, 3 -й по порядку) хранится отдельная пара (обороты по Дебету и Кредиту). Вот для этой таблицы объем избыточных данных тоже должен быть большим.
Если сравнить избыточность данных в таблице «Остатки» бухгалтерского учета с таблицами регистров, то сравнение покажет нам, что количество нулевых записей в бухучете значительно меньше в процентном соотношении. Это объясняется тем, что в случае с бухгалтерским учетом нулевой будет считаться запись, для которой как обороты, так и остатки по всем трем месяцам квартала были нулевые.
Тем не менее пустые строки там тоже есть. Поэтому мы их удалим. Для удобства использования я взял за основу обработку из предыдущей статьи и добавил в нее пункты, связанные с работой с таблицами бухгалтерского учета.
Обработка работает только для баз в формате SQL . Написана с использованием Rainbow . Если у вас нет компоненты Rainbow , то ее можно загрузить здесь. Используйте обработку на свой страх и риск.
Текст модуля можно посмотреть здесь:
Перем ТекМета ; Перем СтрокаСообщения ;
//________________________________________________________ Процедура ЧиститьРегистры () Если Вопрос(СтрокаСообщения ,4 )=6 Тогда ЗапросРадуги =СоздатьОбъект("ODBCQuery" ); Для к =1 по Метаданные.Регистр () Цикл Если Метаданные.Регистр (к ).ТипРегистра ="Остатки" Тогда ТекИдентификатор =Метаданные.Регистр (к ).Идентификатор ; ТекСиноним =Метаданные.Регистр (к ).Синоним ; Если ТекСиноним ="" Тогда ТекСиноним =ТекИдентификатор ; КонецЕсли; ИмяТаблицы =ТекМета .ИмяТаблицыИтогов (ТекИдентификатор ); ТекстЗапроса ="DELETE |FROM " +ИмяТаблицы +" |WHERE " ; Для й =1 по Метаданные.Регистр (к ).Ресурс () Цикл ТекИдРесурса =Метаданные.Регистр (к ).Ресурс (й ).Идентификатор ; ТекстЗапроса =ТекстЗапроса +?(й =1 ,"" ," AND " )+"(SP" +ТекМета .ИдРесурсаРегистра (ТекИдентификатор ,ТекИдРесурса )+"=0)" ; КонецЦикла; //Теперь выполняем запрос Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда Сообщить("Обработан регистр <" +ТекСиноним +">" ,"i" ); ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; КонецЕсли; КонецЦикла; ЗапросРадуги ="" ; КонецЕсли; КонецПроцедуры
//________________________________________________________ Процедура ПосчитатьРегистры () ЗапросРадуги =СоздатьОбъект("ODBCQuery" ); Для к =1 по Метаданные.Регистр () Цикл Если Метаданные.Регистр (к ).ТипРегистра ="Остатки" Тогда ТекИдентификатор =Метаданные.Регистр (к ).Идентификатор ; ТекСиноним =Метаданные.Регистр (к ).Синоним ; Если ТекСиноним ="" Тогда ТекСиноним =ТекИдентификатор ; КонецЕсли; ИмяТаблицы =ТекМета .ИмяТаблицыИтогов (ТекИдентификатор ); ТекстЗапроса ="SELECT COUNT(*) |FROM " +ИмяТаблицы +" |WHERE " ; Для й =1 по Метаданные.Регистр (к ).Ресурс () Цикл ТекИдРесурса =Метаданные.Регистр (к ).Ресурс (й ).Идентификатор ; ТекстЗапроса =ТекстЗапроса +?(й =1 ,"" ," AND " )+"(SP" +ТекМета .ИдРесурсаРегистра (ТекИдентификатор ,ТекИдРесурса )+"=0)" ; КонецЦикла; //Выполняем запрос на общее количество ПолноеЧисло =0 ; Если ЗапросРадуги .Prepare ("SELECT COUNT(*) FROM " +ИмяТаблицы ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПолноеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; //Теперь выполняем запрос на количество пустых ПустоеЧисло =0 ; Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПустоеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; Сообщить("Пустых строк итогов по регистру <" +ТекСиноним +"> : " +ПустоеЧисло +" из " + ПолноеЧисло +" возможных." ,"i" ); КонецЕсли; КонецЦикла; ЗапросРадуги ="" ; КонецПроцедуры
//________________________________________________________ Процедура ЧиститьБухучет () Если Метаданные.ОсновнойПланСчетов .Выбран ()=0 Тогда Предупреждение("В данной конфигурации бухгалтерский учет не ведется!!!" ,20 ); Возврат; КонецЕсли; Если Вопрос(СтрокаСообщения ,4 )=6 Тогда ЗапросРадуги =СоздатьОбъект("ODBCQuery" ); ТекстЗапроса ="DELETE |FROM _1SBKTTL |WHERE (OBDT1 = 0) AND (OBKT1 = 0) AND (OBDT2 = 0) AND (OBKT2 = 0) AND (OBDT3 = 0) AND (OBKT3 = 0) AND (SD = 0)" ; Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда Сообщить("Обработана таблица остатков (сальдо и обороты по субконто)" ,"i" ); ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; ТекстЗапроса ="DELETE |FROM _1SBKTTLC |WHERE (OB1 = 0) AND (OB2 = 0) AND (OB3 = 0)" ; Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда Сообщить("Обработана таблица итогов (обороты по синтетическим счетам)" ,"i" ); ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; ЗапросРадуги ="" ; КонецЕсли; КонецПроцедуры
//________________________________________________________ Процедура ПосчитатьБухучет () Если Метаданные.ОсновнойПланСчетов .Выбран ()=0 Тогда Предупреждение("В данной конфигурации бухгалтерский учет не ведется!!!" ,20 ); Возврат; КонецЕсли; ЗапросРадуги =СоздатьОбъект("ODBCQuery" ); //Сначала таблица остатков (обороты по субконто и сальдо)
//Выполняем запрос на общее количество ПолноеЧисло =0 ; Если ЗапросРадуги .Prepare ("SELECT COUNT(*) FROM _1SBKTTL" ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПолноеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли;
//Теперь выполняем запрос на количество пустых ПустоеЧисло =0 ; ТекстЗапроса ="SELECT COUNT(*) |FROM _1SBKTTL |WHERE (OBDT1 = 0) AND (OBKT1 = 0) AND (OBDT2 = 0) AND (OBKT2 = 0) AND (OBDT3 = 0) AND (OBKT3 = 0) AND (SD = 0)" ; Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПустоеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; Сообщить("Пустых строк в таблице остатков (сальдо и обороты по субконто): " +ПустоеЧисло +" из " + ПолноеЧисло +" возможных." ,"i" );
//Теперь таблица итогов (обороты по синтетическим счетам)
//Выполняем запрос на общее количество ПолноеЧисло =0 ; Если ЗапросРадуги .Prepare ("SELECT COUNT(*) FROM _1SBKTTLC" ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПолноеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли;
//Теперь выполняем запрос на количество пустых ПустоеЧисло =0 ; ТекстЗапроса ="SELECT COUNT(*) |FROM _1SBKTTLC |WHERE (OB1 = 0) AND (OB2 = 0) AND (OB3 = 0)" ; Если ЗапросРадуги .Prepare (ТекстЗапроса ,1 ,1 )=1 Тогда Если ЗапросРадуги .Open ()=1 Тогда ЗапросРадуги .GotoNext (); Если ЗапросРадуги .IsOK ()=1 Тогда ПустоеЧисло =ЗапросРадуги .GetLong (0 ); КонецЕсли; ЗапросРадуги .Close (); Иначе Предупреждение("Ошибка открытия запроса!" ,10 ); КонецЕсли; ЗапросРадуги .Reset (); Иначе Предупреждение("Ошибка выполнения запроса!" ,10 ); КонецЕсли; Сообщить("Пустых строк в таблице итогов (обороты по синтетическим счетам): " +ПустоеЧисло +" из " + ПолноеЧисло +" возможных." ,"i" ); ЗапросРадуги ="" ; КонецПроцедуры
//________________________________________________________ Процедура ПриОткрытии () Попытка ЗагрузитьВнешнююКомпоненту("rainbow.dll" ); ТекМета =СоздатьОбъект("MetaDataWork" ); Исключение Форма .кнПосчитатьРегистры .Доступность (0 ); Форма .кнЧиститьРегистры .Доступность (0 ); Форма .кнПосчитатьБухучет .Доступность (0 ); Форма .кнЧиститьБухучет .Доступность (0 ); КонецПопытки; СтрокаСообщения ="Удаление записей из таблицы итогов - необратимый процесс! |Отменить данную операцию после выполнения будет невозможно! |Вы уверены, что хотите продолжить?" ; КонецПроцедуры
Эту обработку можно загрузить в разделе "Скачать".
Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").
|