За основу взяты сразу несколько публикаций:
- Свертка регистра накопления
- Свертка регистра бухгалтерии произвольной структуры
- Размер таблиц 1С в базе данных MS SQL
Свертка информационной базы 1С – необратимая операция с базой, при которой происходит удаление документов и движений до даты свертки и формирование вместо них документов ввода остатков сразу во все регистры.
Датой свертки обычно является начало года (к примеру, 01.01.2022 00:00:00). Документы ввода остатков должны быть регистраторами сворачиваемых регистров. К примеру, КорректировкаРегистров в УНФ или ОперацияБух в Бухгалтерии. Обычно документы ввода остатков формируют датой за секунду до даты свертки (к примеру, 31.12.2021 23:59:59).
При свертке базы мы теряем информацию об оборотах за сворачиваемый период, но сохраняем информацию об остатках на дату свертки.
К примеру, ответ по движениям товаров за 2021 год (регистр накопления вида остатки) до свертки выглядит так.
После свертки на дату 01.01.2022 00:00:00 отчет выглядит так. Информация об оборотах в 2021 году исчезла, но остатки сохранились.
Еще пример, отчет по продажам до свертки (регистр накопления вида обороты) показывал продажи за 2021 и 2022 года.
После свертки на дату 01.01.2022 00:00:00 продажи за 2021 год исчезли.
Другой пример, сведения о трудовой деятельности до свертки (периодический подчиненный регистр сведений) показывают информацию о приеме на работу и об увольнении.
После свертки на дату 01.01.2022 00:00:00 видно только, что сотрудник уже нигде не работает.
Вот пример свертки регистра бухгалтерии. Так выглядит Оборотно-сальдовая ведомость за 2016 год до свертки.
После свертки на дату 01.01.2017 00:00:00 в Оборотно-сальдовой ведомости информация об оборотах исчезла, но остатки на начало 2017 года сохранились. Кроме того, появились обороты (но не остатки) по вспомогательному 000 счету.
В итоге получилась обработка, позволяющая:
- Свернуть Регистры накопления вида Остатки;
- Очистить движения Регистров накопления вида Обороты;
- Свернуть Периодические Подчиненные Регистры сведений;
- Свернуть Регистр Бухгалтерии в 1С:Бухгалтерии 3.
- Удалить непосредственно все документы до даты свертки.
- Узнать имена таблиц SQL.
Внешний вид обработки.
Обработка пишет лог.
Обработка может быть использована как основа для разработки своей обработки свёртки. Обработка тестировалась на платформе версии 8.3.21.1302 и демо-базе Бухгалтерия предприятия версии 3.0.116.32. Код обработки ниже.
&НаКлиенте
Процедура ЗаполнитьСписокРегистров(Команда)
ЗаполнитьСписокРегистровНакопленияОстатки();
ЗаполнитьСписокРегистровНакопленияОбороты();
ЗаполнитьСписокРегистровСведенийПериодических();
ЗаполнитьСтруктуруБазыSQL();
КонецПроцедуры
#Область РегистрыНакопленияОстатки
&НаСервере
Процедура ЗаполнитьСписокРегистровНакопленияОстатки()
ТаблицаРегистровНакопленияВидаОстатки.Очистить();
Для каждого Регистр Из Метаданные.РегистрыНакопления Цикл
Если Регистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда
Продолжить;
КонецЕсли;
Если СтрНайти(Строка(Регистр.СтандартныеРеквизиты.Регистратор.Тип), СинонимДокументаКорректировкиРегистров) = 0 Тогда
Продолжить;
КонецЕсли;
ТаблицаРегистровСтрока = ТаблицаРегистровНакопленияВидаОстатки.Добавить();
ТаблицаРегистровСтрока.Имя = Регистр.Имя;
ТаблицаРегистровСтрока.Синоним = Регистр.Синоним;
Для каждого СтрокаТаблицаСтруктуры из ТаблицаСтруктуры Цикл
Если СтрокаТаблицаСтруктуры.Метаданные = "РегистрНакопления." + Регистр.Имя Тогда
ТаблицаРегистровСтрока.ИмяТаблицыХранения = ?(ТаблицаРегистровСтрока.ИмяТаблицыХранения = "", "", ТаблицаРегистровСтрока.ИмяТаблицыХранения + "; ") + СтрокаТаблицаСтруктуры.ИмяТаблицыХранения;
КонецЕсли;
КонецЦикла;
Для каждого Измерение Из Регистр.Измерения Цикл
ТаблицаРегистровСтрока.СписокИзмерений.Добавить(Измерение.Имя,Измерение.Синоним);
КонецЦикла;
Для каждого Ресурс Из Регистр.Ресурсы Цикл
ТаблицаРегистровСтрока.СписокРесурсов.Добавить(Ресурс.Имя,Ресурс.Синоним);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СвернутьРегистрыНакопления(Команда)
ОчиститьСообщения();
КорректировкаРегистровСсылка = СвернутьРегистрыНакопленияНаСервере();
Если КорректировкаРегистровСсылка.Пустая() Тогда
Возврат;
КонецЕсли;
//П = Новый Структура("Ключ", КорректировкаРегистровСсылка);
////Форма = ПолучитьФорму("Документ.КорректировкаРегистров.Форма.ФормаДокумента", П);
//Форма = ПолучитьФорму("Документ." + ИмяДокументаКорректировкиРегистров + ".Форма.ФормаДокумента", П);
//Форма.Открыть();
КонецПроцедуры
&НаСервере
Функция СвернутьРегистрыНакопленияНаСервере()
ТаблицаРегистровПомеченные = ТаблицаРегистровНакопленияВидаОстатки.НайтиСтроки(Новый структура("Пометка",Истина));
Если Не ТаблицаРегистровПомеченные.Количество() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не выбрано ни одного регистра!");
//Возврат Документы.КорректировкаРегистров.ПустаяСсылка();
Возврат Документы[ИмяДокументаКорректировкиРегистров].ПустаяСсылка();
КонецЕсли;
КорректировкаРегистровСсылка = СоздатьДокументКорректировки("Свертка регистров накопления вида Остатки");
ЗаписатьЛог("=== Начало свертки регистров накопления вида Остатки ===",,,ЛогФайл);
Для каждого СтрокаТаблицаРегистров Из ТаблицаРегистровПомеченные Цикл
ЗаписатьЛог("--- Регистр накопления: " + СтрокаТаблицаРегистров.Имя,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.* ИЗ РегистрНакопления." + СтрокаТаблицаРегистров.Имя + ".Остатки(&ДатаСвертки, ) КАК Т";
Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыНакопления[СтрокаТаблицаРегистров.Имя].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(КорректировкаРегистровСсылка);
НаборЗаписей.Прочитать();
Пока Выборка.Следующий() Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Запись.Период = ДатаСвертки-1;
Запись.Регистратор = КорректировкаРегистровСсылка;
Для Каждого Ресурс Из СтрокаТаблицаРегистров.СписокРесурсов Цикл
Запись[Ресурс.Значение] = Выборка[Ресурс.Значение+"Остаток"];
КонецЦикла;
КонецЦикла;
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписей.Записать();
ЗаписатьЛог("--- --- : остатки записаны. " + КорректировкаРегистровСсылка,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Т.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления." + СтрокаТаблицаРегистров.Имя + " КАК Т
|ГДЕ
| Т.Период < &Период
|
|СГРУППИРОВАТЬ ПО
| Т.Регистратор,
| Т.Период
|
|УПОРЯДОЧИТЬ ПО
| Т.Период" ;
Запрос.УстановитьПараметр("Период", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Регистратор = КорректировкаРегистровСсылка Тогда
Продолжить;
КонецЕсли;
НаборЗаписейКОчистке = РегистрыНакопления[СтрокаТаблицаРегистров.Имя].СоздатьНаборЗаписей();
НаборЗаписейКОчистке.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписейКОчистке.ОбменДанными.Загрузка = Истина;
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписейКОчистке.Записать();
ЗаписатьЛог("--- --- : движения очищены. " + Выборка.Регистратор,,,ЛогФайл);
КонецЦикла;
КонецЦикла;
ЗаписатьЛог(КорректировкаРегистровСсылка,,,ЛогФайл);
ЗаписатьЛог("=== Окончиние свертки регистров накопления вида Остатки ===",,,ЛогФайл);
Возврат КорректировкаРегистровСсылка;
КонецФункции
#КонецОбласти
#Область РегистрыСведенийПериодическиеЗависимые
&НаСервере
Процедура ЗаполнитьСписокРегистровСведенийПериодических()
ТаблицаРегистровСведений.Очистить();
Для каждого Регистр Из Метаданные.РегистрыСведений Цикл
Если Регистр.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
Продолжить;
КонецЕсли;
Если Регистр.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
Продолжить;
КонецЕсли;
Если СтрНайти(Строка(Регистр.СтандартныеРеквизиты.Регистратор.Тип), СинонимДокументаКорректировкиРегистров) = 0 Тогда
Продолжить;
КонецЕсли;
ТаблицаРегистровСтрока = ТаблицаРегистровСведений.Добавить();
ТаблицаРегистровСтрока.Имя = Регистр.Имя;
ТаблицаРегистровСтрока.Синоним = Регистр.Синоним;
Для каждого СтрокаТаблицаСтруктуры из ТаблицаСтруктуры Цикл
Если СтрокаТаблицаСтруктуры.Метаданные = "РегистрСведений." + Регистр.Имя Тогда
ТаблицаРегистровСтрока.ИмяТаблицыХранения = ?(ТаблицаРегистровСтрока.ИмяТаблицыХранения = "", "", ТаблицаРегистровСтрока.ИмяТаблицыХранения + "; ") + СтрокаТаблицаСтруктуры.ИмяТаблицыХранения;
КонецЕсли;
КонецЦикла;
Для каждого Измерение Из Регистр.Измерения Цикл
ТаблицаРегистровСтрока.СписокИзмерений.Добавить(Измерение.Имя,Измерение.Синоним);
КонецЦикла;
Для каждого Ресурс Из Регистр.Ресурсы Цикл
ТаблицаРегистровСтрока.СписокРесурсов.Добавить(Ресурс.Имя,Ресурс.Синоним);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СвернутьРегистрыСведений(Команда)
ОчиститьСообщения();
КорректировкаРегистровСсылка = СвернутьРегистрыСведенийНаСервере();
Если КорректировкаРегистровСсылка.Пустая() Тогда
Возврат;
КонецЕсли;
//П = Новый Структура("Ключ", КорректировкаРегистровСсылка);
////Форма = ПолучитьФорму("Документ.КорректировкаРегистров.Форма.ФормаДокумента", П);
//Форма = ПолучитьФорму("Документ." + ИмяДокументаКорректировкиРегистров + ".Форма.ФормаДокумента", П);
//Форма.Открыть();
КонецПроцедуры
&НаСервере
Функция СвернутьРегистрыСведенийНаСервере()
ТаблицаРегистровПомеченные = ТаблицаРегистровСведений.НайтиСтроки(Новый структура("Пометка",Истина));
Если Не ТаблицаРегистровПомеченные.Количество() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не выбрано ни одного регистра!");
Возврат Документы[ИмяДокументаКорректировкиРегистров].ПустаяСсылка();
КонецЕсли;
КорректировкаРегистровСсылка = СоздатьДокументКорректировки("Свертка подчиненных периодических регистров сведений");
ЗаписатьЛог("=== Начало свертки подчиненных периодических регистров сведений ===",,,ЛогФайл);
Для каждого СтрокаТаблицаРегистров Из ТаблицаРегистровПомеченные Цикл
ЗаписатьЛог("--- Регистр сведений: " + СтрокаТаблицаРегистров.Имя,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.* ИЗ РегистрСведений." + СтрокаТаблицаРегистров.Имя + ".СрезПоследних(&ДатаСвертки, ) КАК Т";
Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыСведений[СтрокаТаблицаРегистров.Имя].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(КорректировкаРегистровСсылка);
НаборЗаписей.Прочитать();
Пока Выборка.Следующий() Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Запись.Период = ДатаСвертки-1;
Запись.Регистратор = КорректировкаРегистровСсылка;
КонецЦикла;
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписей.Записать();
ЗаписатьЛог("--- --- : остатки записаны. " + КорректировкаРегистровСсылка,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Т.Регистратор КАК Регистратор
|ИЗ
| РегистрСведений." + СтрокаТаблицаРегистров.Имя + " КАК Т
|ГДЕ
| Т.Период < &Период
|
|СГРУППИРОВАТЬ ПО
| Т.Регистратор,
| Т.Период
|
|УПОРЯДОЧИТЬ ПО
| Т.Период" ;
Запрос.УстановитьПараметр("Период", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
Пока выборка.Следующий() Цикл
Если Выборка.Регистратор = КорректировкаРегистровСсылка Тогда
Продолжить;
КонецЕсли;
НаборЗаписейКОчистке = РегистрыСведений[СтрокаТаблицаРегистров.Имя].СоздатьНаборЗаписей();
НаборЗаписейКОчистке.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписейКОчистке.ОбменДанными.Загрузка = Истина;
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписейКОчистке.Записать();
ЗаписатьЛог("--- --- : движения очищены. " + Выборка.Регистратор,,,ЛогФайл);
КонецЦикла;
КонецЦикла;
ЗаписатьЛог(КорректировкаРегистровСсылка,,,ЛогФайл);
ЗаписатьЛог("=== Окончиние свертки периодических регистров сведений ===",,,ЛогФайл);
Возврат КорректировкаРегистровСсылка;
КонецФункции
#КонецОбласти
#Область РегистрыНакопленияОборотные
&НаСервере
Процедура ЗаполнитьСписокРегистровНакопленияОбороты()
ТаблицаРегистровНакопленияОбороты.Очистить();
Для каждого Регистр Из Метаданные.РегистрыНакопления Цикл
Если Регистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
Продолжить;
КонецЕсли;
ТаблицаРегистровСтрока = ТаблицаРегистровНакопленияОбороты.Добавить();
ТаблицаРегистровСтрока.Имя = Регистр.Имя;
ТаблицаРегистровСтрока.Синоним = Регистр.Синоним;
Для каждого СтрокаТаблицаСтруктуры из ТаблицаСтруктуры Цикл
Если СтрокаТаблицаСтруктуры.Метаданные = "РегистрНакопления." + Регистр.Имя Тогда
ТаблицаРегистровСтрока.ИмяТаблицыХранения = ?(ТаблицаРегистровСтрока.ИмяТаблицыХранения = "", "", ТаблицаРегистровСтрока.ИмяТаблицыХранения + "; ") + СтрокаТаблицаСтруктуры.ИмяТаблицыХранения;
КонецЕсли;
КонецЦикла;
Для каждого Измерение Из Регистр.Измерения Цикл
ТаблицаРегистровСтрока.СписокИзмерений.Добавить(Измерение.Имя,Измерение.Синоним);
КонецЦикла;
Для каждого Ресурс Из Регистр.Ресурсы Цикл
ТаблицаРегистровСтрока.СписокРесурсов.Добавить(Ресурс.Имя,Ресурс.Синоним);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьДвиженияОборотныхРегистров(Команда)
ОчиститьДвиженияОборотныхРегистровНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОчиститьДвиженияОборотныхРегистровНаСервере()
ТаблицаРегистровПомеченные = ТаблицаРегистровНакопленияОбороты.НайтиСтроки(Новый структура("Пометка",Истина));
Если Не ТаблицаРегистровПомеченные.Количество() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не выбрано ни одного регистра!");
Возврат;
КонецЕсли;
ЗаписатьЛог("=== Начало очистки регистров накопления вида Обороты ===",,,ЛогФайл);
Для каждого СтрокаТаблицаРегистров Из ТаблицаРегистровПомеченные Цикл
ЗаписатьЛог("--- Регистр накопления: " + СтрокаТаблицаРегистров.Имя,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Т.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления." + СтрокаТаблицаРегистров.Имя + " КАК Т
|ГДЕ
| Т.Период < &Период
|
|СГРУППИРОВАТЬ ПО
| Т.Регистратор,
| Т.Период
|
|УПОРЯДОЧИТЬ ПО
| Т.Период" ;
Запрос.УстановитьПараметр("Период", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписейКОчистке = РегистрыНакопления[СтрокаТаблицаРегистров.Имя].СоздатьНаборЗаписей();
НаборЗаписейКОчистке.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписейКОчистке.ОбменДанными.Загрузка = Истина;
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписейКОчистке.Записать();
ЗаписатьЛог("--- --- " + Выборка.Регистратор + ": движения очищены",,,ЛогФайл);
КонецЦикла;
КонецЦикла;
ЗаписатьЛог("=== Окончиние очистки регистров накопления вида Обороты ===",,,ЛогФайл);
КонецПроцедуры
#КонецОбласти
#Область РегистрыБухгалтерии
&НаСервере
Процедура ЗаполнитьСписокРегистровБухгалтерии()
Для Каждого МетаданныеРегистра Из Метаданные.РегистрыБухгалтерии Цикл
Элементы.ИмяРегистраБухгалтерии.СписокВыбора.Добавить(МетаданныеРегистра.Имя, МетаданныеРегистра.Имя);
КонецЦикла;
Если Элементы.ИмяРегистраБухгалтерии.СписокВыбора.Количество() > 0 Тогда
ИмяРегистраБухгалтерии = Элементы.ИмяРегистраБухгалтерии.СписокВыбора[0].Значение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СвернутьРегистрБухгалтерии(Команда)
СвернутьРегистрБухгалтерииНаСервере();
КонецПроцедуры
&НаСервере
Процедура СвернутьРегистрБухгалтерииНаСервере()
КорректировкаРегистровСсылка = СоздатьДокументКорректировки("Свертка регистра Бухгалтерии " + ИмяРегистраБухгалтерии);
ЗаписатьЛог("=== Начало свертки регистра Бухгалтерии "+ ИмяРегистраБухгалтерии +" ===",,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.* ИЗ РегистрБухгалтерии." + ИмяРегистраБухгалтерии + ".Остатки(&ДатаСвертки, , , Организация = &Организация) КАК Т";
Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
Запрос.УстановитьПараметр("Организация", ОрганизацияБух);
Выборка = Запрос.Выполнить().Выбрать();
НаборЗаписей = РегистрыБухгалтерии[ИмяРегистраБухгалтерии].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(КорректировкаРегистровСсылка);
НаборЗаписей.Прочитать();
Пока Выборка.Следующий() Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Запись.Период = ДатаСвертки-1;
Запись.Регистратор = КорректировкаРегистровСсылка;
ЗаписатьЛог("--- --- : Счет " + Выборка.Счет + " - " + Выборка.Счет.Вид + " - " +
?(Выборка.Счет.Забалансовый, "Забалансовый", ""),,,ЛогФайл);
Если Выборка["СуммаОстатокКт"] <> 0 Тогда
Запись.СчетКт = Выборка.Счет;
Запись.Сумма = Выборка["СуммаОстатокКт"];
Если Не Выборка.Счет.Забалансовый Тогда
Запись.СчетДт = ВспомогательныйСчет;
КонецЕсли;
Для Каждого СтрокаВидаСубконто Из Выборка.Счет.ВидыСубконто Цикл
Запись.СубконтоКт[СтрокаВидаСубконто.ВидСубконто] = Выборка["Субконто" + СтрокаВидаСубконто.НомерСтроки];
КонецЦикла;
Для Каждого Ресурс Из Метаданные.РегистрыБухгалтерии[ИмяРегистраБухгалтерии].Ресурсы Цикл
Если Ресурс.Балансовый Тогда
Продолжить;
КонецЕсли;
Запись[Ресурс.Имя + "Кт"] = Выборка[Ресурс.Имя + "Остаток"];
КонецЦикла;
Иначе
Запись.СчетДт = Выборка.Счет;
Запись.Сумма = Выборка["СуммаОстатокДт"];
Если Не Выборка.Счет.Забалансовый Тогда
Запись.СчетКт = ВспомогательныйСчет;
КонецЕсли;
Для Каждого СтрокаВидаСубконто Из Выборка.Счет.ВидыСубконто Цикл
Запись.СубконтоДт[СтрокаВидаСубконто.ВидСубконто] = Выборка["Субконто" + СтрокаВидаСубконто.НомерСтроки];
КонецЦикла;
Для Каждого Ресурс Из Метаданные.РегистрыБухгалтерии[ИмяРегистраБухгалтерии].Ресурсы Цикл
Если Ресурс.Балансовый Тогда
Продолжить;
КонецЕсли;
Запись[Ресурс.Имя + "Дт"] = Выборка[Ресурс.Имя + "Остаток"];
КонецЦикла;
КонецЕсли;
КонецЦикла;
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписей.Записать();
ЗаписатьЛог("--- --- : остатки записаны. " + КорректировкаРегистровСсылка,,,ЛогФайл);
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Т.Регистратор КАК Регистратор
|ИЗ
| РегистрБухгалтерии." + ИмяРегистраБухгалтерии + " КАК Т
|ГДЕ
| Т.Период < &Период
| И Т.Организация = &Организация
|
|СГРУППИРОВАТЬ ПО
| Т.Регистратор,
| Т.Период
|
|УПОРЯДОЧИТЬ ПО
| Т.Период" ;
Запрос.УстановитьПараметр("Период", ДатаСвертки);
Запрос.УстановитьПараметр("Организация", ОрганизацияБух);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Регистратор = КорректировкаРегистровСсылка Тогда
Продолжить;
КонецЕсли;
НаборЗаписейКОчистке = РегистрыБухгалтерии[ИмяРегистраБухгалтерии].СоздатьНаборЗаписей();
НаборЗаписейКОчистке.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписейКОчистке.ОбменДанными.Загрузка = Истина;
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
НаборЗаписейКОчистке.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписейКОчистке.Записать();
ЗаписатьЛог("--- --- : движения очищены. " + Выборка.Регистратор,,,ЛогФайл);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область Вспомогательные
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Метаданные.Имя = "УправлениеТорговлей" И Лев(Метаданные.Версия, 2) = "11" Тогда
ИмяДокументаКорректировкиРегистров = "КорректировкаРегистров";
СинонимДокументаКорректировкиРегистров = "Корректировка регистров";
ИначеЕсли Метаданные.Имя = "Розница" И Лев(Метаданные.Версия, 1) = "2" Тогда
ИмяДокументаКорректировкиРегистров = "КорректировкаРегистров";
СинонимДокументаКорректировкиРегистров = "Корректировка регистров";
ИначеЕсли Метаданные.Имя = "УправлениеНебольшойФирмой" Тогда
ИмяДокументаКорректировкиРегистров = "КорректировкаРегистров";
СинонимДокументаКорректировкиРегистров = "Корректировка регистров";
ИначеЕсли Метаданные.Имя = "БухгалтерияПредприятия" И Лев(Метаданные.Версия, 1) = "3" Тогда
ИмяДокументаКорректировкиРегистров = "ОперацияБух";
СинонимДокументаКорректировкиРегистров = "Операция";
ВспомогательныйСчет = ПланыСчетов.Хозрасчетный.Вспомогательный;
КонецЕсли;
ЗаполнитьСписокРегистровБухгалтерии();
ДатаСвертки = НачалоГода(ТекущаяДата());
ЛогФайл = "C:\temp\svertka.txt";
ЗапросSql = "
|USE BASE_NAME
|GO
|
|SELECT
| t.Name AS TableName,
| SUM(a.used_pages) * 8 / 1024 / 1024 AS UsedSpaceGB
|FROM
| sys.tables t
| INNER JOIN sys.indexes i ON t.object_id = i.object_id
| INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
| INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
| LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
|WHERE
| t.Name NOT LIKE 'dt%'
| AND t.is_ms_shipped = 0
| AND i.object_id > 255
|GROUP BY
| t.Name, s.Name, p.Rows
|ORDER BY
| SUM(a.used_pages) * 8 / 1024 / 1024 DESC;
|GO";
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСтруктуруБазыSQL()
МассивОбъектов = Новый Массив;
ТаблицаСтруктуры.Загрузить(ПолучитьСтруктуруХраненияБазыДанных(МассивОбъектов, Истина));
КонецПроцедуры
&НаСервере
Процедура ЗаписатьЛог(Строка, ОтправитьВТелеграм = Ложь, IDПользователяТелеграм = "", ПутьКЛогФайлу)
СтрокаКЗаписи = Строка(ТекущаяДата()) + ": " + Строка;
Файл = Новый ЗаписьТекста(ПутьКЛогФайлу,,,Истина);
Файл.ЗаписатьСтроку(СтрокаКЗаписи);
Файл.Закрыть();
Сообщить(СтрокаКЗаписи);
КонецПроцедуры
&НаСервере
Функция СоздатьДокументКорректировки(Комментарий = "Свертка регистров")
КорректировкаРегистрокОбъект = Документы[ИмяДокументаКорректировкиРегистров].СоздатьДокумент();
Если Метаданные.Имя = "БухгалтерияПредприятия" И Лев(Метаданные.Версия, 1) = "3" Тогда
КорректировкаРегистрокОбъект.Организация = ОрганизацияБух;
КонецЕсли;
КорректировкаРегистрокОбъект.Дата = ДатаСвертки-1;
КорректировкаРегистрокОбъект.УстановитьНовыйНомер();
КорректировкаРегистрокОбъект.ОбменДанными.Загрузка = Истина;
КорректировкаРегистрокОбъект.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
КорректировкаРегистрокОбъект.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
КорректировкаРегистрокОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
КорректировкаРегистрокОбъект.Комментарий = Комментарий;
КорректировкаРегистрокОбъект.Записать();
Возврат КорректировкаРегистрокОбъект.Ссылка;
КонецФункции
#КонецОбласти
#Область Интерфейс
&НаКлиенте
Процедура СнятьВсеОтметкиРН(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровНакопленияВидаОстатки Цикл
СтрокаТаблицыРегистров.Пометка = Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВсеРН(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровНакопленияВидаОстатки Цикл
СтрокаТаблицыРегистров.Пометка = Истина;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВсеРС(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровСведений Цикл
СтрокаТаблицыРегистров.Пометка = Истина;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СнятьВсеОтметкиРС(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровСведений Цикл
СтрокаТаблицыРегистров.Пометка = Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОтметитьВсеРНО(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровНакопленияОбороты Цикл
СтрокаТаблицыРегистров.Пометка = Истина;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СнятьВсеОтметкиРНО(Команда)
Для каждого СтрокаТаблицыРегистров из ТаблицаРегистровНакопленияОбороты Цикл
СтрокаТаблицыРегистров.Пометка = Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьДокументы(Команда)
УдалитьДокументыНаСервере();
КонецПроцедуры
&НаСервере
Процедура УдалитьДокументыНаСервере()
ЗаписатьЛог("=== Начало удаления документов ===",,,ЛогФайл);
Для каждого Документ Из Метаданные.Документы Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ * ИЗ Документ." + Документ.Имя + " КАК Док
|ГДЕ
| Док.Дата < &ДатаСвертки
|
|УПОРЯДОЧИТЬ ПО
| Док.Дата";
Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Ссылка.Дата = ДатаСвертки - 1 И СтрНайти(Выборка.Ссылка.Комментарий, "Свертка")<>0 Тогда
Продолжить;
КонецЕсли;
ДокументОбъект = Выборка.Ссылка.ПолучитьОБъект();
ЗаписатьЛог("--- --- : Удаление " + Выборка.Ссылка,,,ЛогФайл);
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ДополнительныеСвойства.Вставить("АвтоОбработка", Истина);
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьРегистрациюИзменений", Истина);
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
ДокументОбъект.Удалить();
КонецЦикла;
КонецЦикла;
ЗаписатьЛог("=== Окончание удаления документов ===",,,ЛогФайл);
КонецПроцедуры
#КонецОбласти
Готовое решение
Database Compression Tool (DCT): Универсальный инструмент сжатия, свертки и конвертации баз данных 1С
Универсальный инструмент сжатия, свертки и конвертации баз данных 1С.
Свертка баз данных еще никогда не была такой простой и быстрой!
DCT ускоряет работу базы, освобождая гигабайты пространства и повышая производительность системы. Доступна ДЕМО версия!