Материал опубликован на сайте SoftPoint.ru/
В предыдущей статье была рассмотрена проблема накопления нулевых записей по регистрам остатков в конфигурациях, использующих регистры оперативного учета. После написания ее было бы логично рассмотреть, компоненту бухгалтерского учета, чтобы выяснить, существуют ли и в бухгалтерских конфигурациях подобные явления. Как видно из файла описанию структуры базы данных – за хранение бухгалтерских итогов отвечают две основные таблицы.
Первая таблица называется «Итоги». В ней поквартально хранятся обороты по синтетическим счетам плана счетов. При этом в каждой строке этой таблице обороты хранятся отдельно по 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);
КонецПопытки;
СтрокаСообщения="Удаление записей из таблицы итогов - необратимый процесс!
|Отменить данную операцию после выполнения будет невозможно!
|Вы уверены, что хотите продолжить?";
КонецПроцедуры
Начать дискуссию