January 5, 2022

Итоги

Сильно доработанная файловая база 1С:Торговля и склад на платформе 7.7... Файл итогов регистра партий превысил размер в 2 гигабайта. При этом начинают рушиться индексы, что приводит не только к аварийному завершению работы, но и к порче данных. Что делать?

Переводить на SQL не хочется, потому что заставить работать 1С 7.7 с современными версиям MS SQL Server можно только с помощью патчей, не люблю таких решений. Можно сделать свертку базы, но в последний раз я это делал лет 10 назад, некоторых важных нюансов уже не вспомню, да и занимает этот процесс на аналогичных объемах данных целые выходные. Несколько раз начинали заниматься переходом на какую-нибудь современную конфигурацию. Но большинство имеющихся на рынке избыточно тяжелые, ведь у этого заказчика всего один магазин. Хотим попробовать УНФ, но все откладываем, не можем себя заставить, зачем если все устраивает. Любой из описанных вариантов требует много времени, а проблему нужно решить сейчас, потому что работать нужно сейчас.

Чтобы объяснить вполне очевидное решение описанной проблемы, необходимо сначала рассказать, что такое итоги. Бывали ли у вас ситуации, когда какая-нибудь социальная сеть утверждает, что у вас столько-то друзей, а вы взяли и пересчитали и результат оказался другим. Так вот итоги - это некая избыточная информация, накапливающаяся по ходу работы и позволяющая избежать лишних вычислений при выводе. Понятно, что когда у вас добавился новый друг, в итоговую таблицу в соответствующее поле должна добавиться единица. Иногда итоги расходятся с реальными данными из-за сбоев, поэтому необходим регламентный пересчет, чем социальные сети заниматься не любят. В 1С аналогично, итоги используются для быстрого вывода в отчеты начальных и конечных остатков по периодам. И тут возникает идея, а зачем вообще нужны эти данные старше нескольких лет. Ведь отчеты за такие дальние периоды уже не информативны, а значит, не нужны.

Поэтому я написал обработку на 1С 8.3 (с обычными формами), но какая разница. В DBF-файле просто удаляются лишние (старые) записи и все.

Процедура ПометитьЗаписиНаУдаление(Кнопка)
	Если Не ЗначениеЗаполнено(Файл) Тогда
		Предупреждение("Не выбран файл");
		Возврат;
	КонецЕсли;
	Если Не ЗначениеЗаполнено(ДоДаты) Тогда
		Предупреждение("Не выбрана дата");
		Возврат;
	КонецЕсли;
	
	XBase  = Новый XBase;
	Попытка
	    XBase.ОткрытьФайл(Файл);
	Исключение
	    Сообщить("Ошибка открытия файла!");
	    Возврат;
	КонецПопытки;
	
	Если Не XBase.Первая() Тогда
		Возврат;
	КонецЕсли;
	
	Н = 1; Удалено = 0; Всего = XBase.КоличествоЗаписей();
	Пока Не XBase.ВКонце() Цикл
		Если Н / 100 = Цел(Н / 100) Тогда
			Состояние("Обработано записей: " + Строка(Н) + " (" + Строка(Цел(Н / Всего * 100)) + "%)     Помечено записей: " + Строка(Удалено));
		КонецЕсли;
		
		Если XBase.PERIOD < ДоДаты Тогда
			XBase.Удалить();
			Удалено = Удалено + 1;
		КонецЕсли;
		
		XBase.Следующая();
		Н = Н + 1;
	КонецЦикла;
	
	XBase = Неопределено;
	Сообщить("Пометка на удаление завершена");
КонецПроцедуры

Процедура СжатьФайл(Кнопка)
	Если Не ЗначениеЗаполнено(Файл) Тогда
		Предупреждение("Не выбран файл");
		Возврат;
	КонецЕсли;
	
	XBase = Новый XBase;
	Попытка
	    XBase.ОткрытьФайл(Файл);
	Исключение
	    Сообщить("Ошибка открытия файла!");
	    Возврат;
	КонецПопытки;
	
	Состояние("Сжатие файла ...");
	XBase.Сжать();
	
	XBase = Неопределено;
	Сообщить("Сжатие файла завершено");
КонецПроцедуры

Видно, что код причесан всякими проверками и сообщениями, а основной алгоритм всего несколько строк. Поэтому написание первой рабочей версии и собственно удаление заняло минут 15 вместе с чаем. Отчет за периоды с удаленными итогами выглядит весело: начальный остаток всегда ноль, приход и расход есть, конечный остаток всегда ноль. Но при этом никаких ошибок при формировании не возникает. Единственное замечание, январь без итогов прошлого года не очень красив, поэтому лучше если первым оставленным месяцем будет декабрь. Получившийся размер файла позволит спокойно работать несколько лет. Что и требовалось. Дополнительных затрат на новый сервер, новую память, SQL и прочее, компания не понесла.

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

←8 | заметка 9 | 10→