Свертка базы 1С (Full version)

17.10.22

База данных - Чистка данных

В публикации рассмотрена универсальная обработка по свёртке регистров 1С.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Свертка базы 1С (Full version):
.epf 14,47Kb
169
169 Скачать (1 SM) Купить за 1 850 руб.

За основу взяты сразу несколько публикаций:

Свертка информационной базы 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 ускоряет работу базы, освобождая гигабайты пространства и повышая производительность системы. Доступна ДЕМО версия!


обработка свертка базы корректировка регистров ввод начальных остатков регистр накопления бухгалтерии сведений остатки обороты срез последних

См. также

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7769    55    22    

66

Чистка данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Розница 3.0 Платные (руб)

Позволяет удалить организации из любых из информационных баз 1С на управляемых формах (БП 3.0, УТ 11, КА 2, ERP 2, ЗУП 3.0, УНФ, Розница 2.0 и пр.). Главное требование - программа должна содержать справочник "Организации". Реализован самый быстрый алгоритм непосредственного удаления объектов. Работает даже на базах большого размера. Для ускорения работы алгоритма не запускается проверка контроля ссылочной целостности. Проверку учета можно запустить отдельно с помощью дополнительной обработки. Необходимо перед удалением самостоятельно проверить базу на наличие перекрестных ссылок разных организаций в одном документе. Эту дополнительную обработку проверки перекрестных ссылок по запросу предоставляем бесплатно нашим покупателям.

3582 руб.

16.03.2015    171506    209    81    

244

Чистка данных Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление торговлей 11 Платные (руб)

Данные обработки помогут Вам легко и, главное быстро, выполнить удаление любых данных в Ваших базах 1С на платформах 8.1-8.3. Обработки помогут легко просмотреть связи ссылок в виде дерева, выбрать что удалять, а что нет, используя любые отборы. Это позволит уменьшить объем лишней и не нужной информации в справочниках и документах, планах видов характеристик и др. объектах и облегчит работу с данными пользователям и Вам. Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. (Обновление от 29.06.2023, версия 4.2)

9600 руб.

22.02.2013    138401    258    144    

429

Чистка данных Программист Пользователь Платформа 1С v8.3 Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Обработка позволяет удобно и выборочно удалить данные из базы 1С. Это могут быть как неиспользуемые элементы справочников, так и неактуальные организации. При этом есть возможность провести анализ пересечений документов с другими организациями и таким образом уберечься от того, что при удалении обороты по другой организации изменятся.

3350 руб.

28.11.2019    25856    58    16    

74

Оптовая торговля Логистика, склад и ТМЦ Чистка данных Программист Бухгалтер Пользователь Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Если вы начали работать в программном продукте Управление Торговлей, редакция 11 или Комплексная Автоматизация редакция 2 и включили механизм учёта серий, то перейти обратно в учёт без серий будет не так-то просто. Сложность заключается в том, что нужно очистить серии в табличной части документа, например, Реализация Товаров и услуг. Предлагаем алгоритм перехода на учет без серий для программного продукта УТ11. (Очистка серий.)

2400 руб.

09.04.2019    29052    43    14    

45

Чистка данных Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если в вашей информационной базе крутится очень много данных, или база должна быть доступна 24/7 (как в моем случае), или же вы боитесь запускать тестирование и исправление, НО существует потребность удалить битые ссылки, тогда эта обработка сможет Вам помочь. Обработка выявляет битые ссылки как в самих объектах метаданных, так и в их табличных частях(!), а так же может их удалить.

2400 руб.

23.08.2021    9930    19    3    

25

Чистка данных Системный администратор Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

в современных конфигурациях стало очень много регистров сведений, хранящих вспомогательную и периодическую информацию и администраторы информационных систем стали сталкиваться с проблемой удаления помеченных на удаление объектов, так как ссылки на них хранятся в многочисленных регистрах сведений. Помочь почистить базу от ненужных записей предназначенная данная внешняя обработка на управляемой форме, которая ищет записи во всех регистрах сведений по помеченным на удаление объектах и очищает по ним записи их после использования данной обработки дальше можно смело пользоваться типовой обработкой удаление помеченных на удаление и проблем с удалением не возникнет! Удачи всем!

1 стартмани

21.01.2022    7694    1    dmbal    6    

12

Чистка данных Инструментарий разработчика Системный администратор Программист Платформа 1С v8.3 Абонемент ($m)

Очередная вариативная очистка кэша 1С с помощью Исполнителя 3.0.2.2.

1 стартмани

25.10.2023    5337    5    SerVer1C    26    

22
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1256464 20.01.23 10:54 Сейчас в теме
2. ArsenProg 12.03.23 04:08 Сейчас в теме
Почерпнул несколько идей, есть оригинальные моменты, спасибо.
3. user822247 01.06.23 10:54 Сейчас в теме
После свертки остаются битые ссылки на удаленные документы. Как их можно будет удалить после свертки?
4. user822247 01.06.23 10:56 Сейчас в теме
(3)Обработкой по удалению битых ссылок их не находит а тестирование базы занимает несколько дней. в рабочей базе такое не получится сделать.
Есть ли еще какие-нибудь варианты?
6. RustIG 1747 01.06.23 11:02 Сейчас в теме
(4)
Есть ли еще какие-нибудь варианты?

снова отсылаю вас к статье - https://infostart.ru/marketplace/1033813/
почитайте
5. RustIG 1747 01.06.23 11:01 Сейчас в теме
(3) это значит, что вы не правильно свернули регистры.
Вот здесь описаны распространенные случаи - и что делать https://infostart.ru/marketplace/1033813/
ваш случай ищите в Дополнительном описании пункт 6.
7. user822247 03.06.23 18:49 Сейчас в теме
(5) В ссылке вроде используется другая обработка.

Из 6 пункта
6) В базе велся и ведется учет по договорам разного формата - есть договора для учета в разрезе документов расчетов, есть договора для учета в целом по договору. Поэтому пришлось использовать обе обработку для создания ВводаНачальныхОстатков по взаиморасчетам с контрагентами - сначала без учета документов расчетов, затем дополнительно с учетом документов расчетов.

Посмотрите рис. ниже - в созданных документах не везде проставились документы оплаты - их нужно создать вручную через типовой механизм документа "ДокументРасчетовСКонтрагентом" (Документ расчетов с контрагентом (ручной учет)).

Пробую сейчас в демо базе и даже тестовый документ не удаляется полность(Битая ссылка остается)
8. user822247 03.06.23 19:28 Сейчас в теме
(7)Попробовал в пустой базе. Без договоров/соглашений. Просто закупка и продажа. Битая ссылка остается
9. llg_44 26 30.10.23 17:50 Сейчас в теме
Доброго дня. Простите, поясните пожалуйста. Обработка универсальна и может подойти для всех видов конфигураций? Настроенные, отраслевые можно обработать?
Оставьте свое сообщение