Очистка таблиц итогов и остатков бухгалтерского учета от лишних записей   

В предыдущей статье была рассмотрена проблема накопления нулевых записей по регистрам остатков в конфигурациях, использующих регистры оперативного учета. После написания ее было бы логично рассмотреть, компоненту бухгалтерского учета, чтобы выяснить, существуют ли и в бухгалтерских конфигурациях подобные явления. Как видно из файла описанию структуры базы данных – за хранение бухгалтерских итогов отвечают две основные таблицы.

Первая таблица называется «Итоги». В ней поквартально хранятся обороты по синтетическим счетам плана счетов. При этом в каждой строке этой таблице обороты хранятся отдельно по 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 возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").