Корректировка регистров "Партии товаров" и "Продажи себестоимость"

Опубликовал Yermek Zhubatyrov (ermek6) в раздел Обработки - Универсальные обработки

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

Стандартными средствами сделать не представляется по двум причинам:

  1. Очень большой период, и если запускать обработку проведения, то даже при корректном количественном учете займет много времени
  2. Пересорт. Разумеется в базе не соблюдалась последовательность ввода.
В общих чертах, из базы за период выбираются поступления и реализации согласно списку
Функция ПолучитьСписокВидов()
	СписокВидов = Новый СписокЗначений;
	СписокВидов.Добавить("РеализацияТоваровУслуг");
	СписокВидов.Добавить("ПеремещениеТоваров");
	СписокВидов.Добавить("ПоступлениеТоваровУслуг");
	СписокВидов.Добавить("ВозвратТоваровОтПокупателя");
	СписокВидов.Добавить("ОприходованиеТоваров");
	СписокВидов.Добавить("СписаниеТоваров");
	СписокВидов.Добавить("КомплектацияНоменклатуры");
	СписокВидов.Добавить("ПриходныйОрдерНаТовары");
	СписокВидов.Добавить("ВозвратТоваровПоставщику");
	
	Возврат СписокВидов;
КонецФункции
 

из списка формируется запрос к документам

	Запрос = Новый Запрос;
	ФлагПервыйВход = Истина; 
	Запрос.Текст = "ВЫБРАТЬ ВложенныйЗапрос.Вид, ВложенныйЗапрос.Ссылка ИЗ (";
	Для каждого Док из Метаданные.Документы Цикл
		Если СписокВидов.НайтиПоЗначению(Док.Имя) = Неопределено
			Тогда Продолжить;
		КонецЕсли;
		Если НЕ ФлагПервыйВход Тогда
			Запрос.Текст = Запрос.Текст + СИМВОЛЫ.ПС + "	ОБЪЕДИНИТЬ ВСЕ"+ СИМВОЛЫ.ПС ;
		КонецЕСли;
		ФлагПервыйВход = Ложь;
		Запрос.Текст = Запрос.Текст + СИМВОЛЫ.ПС  + " ВЫБРАТЬ ВЫРАЗИТЬ("""+Док.Имя+""" КАК Строка) КАК Вид, Ссылка ИЗ Документ." + Док.Имя + " ГДЕ Дата МЕЖДУ &НачДата и &КонДата ";
	КонецЦикла;

Ну и для каждой строи выполняется код

Процедура ОбработкаДокумента(Ссылка);
	
	МДДок = Ссылка.Метаданные();
	Попытка
		Выполнить("Обработать"+МДДок.Имя+"(Ссылка)");
	Исключение
		СообщитьД(МДДок.Синоним+"
		|"""+Ссылка+"""
		|"+ОписаниеОшибки(),СтатусСообщения.Важное);
	КонецПопытки;
	
КонецПроцедуры

т.е. для каждого вида документов должна быть своя процедура. Например для приходных накладных

Процедура ОбработатьПоступлениеТоваровУслуг(Ссылка)
// Код процедуры
КонецПроцедуры

Информация по партиям сидит в таблице значений.

Более подробно можно посмотреть в коде обработки.

Ну и как всегда. Все делаем на копиях. если погубите свои рабочие базы, виноваты сами :)

P.S.

У меня на компе 16 гигов памяти, 10 из которых я пустил на RAM диск (вот этот вот). На этом диске обработка 5 лет шла 50 минут.

Тот же самый период на обычном жестком шла 20 часов.

Выводы делайте сами

Скачать файлы

Наименование Файл Версия Размер
Корректировка себестоимости реализации
.epf 9,61Kb
05.05.16
4
.epf 0.0.1 9,61Kb 4 Скачать

См. также

Комментарии
1. Иван (John83) 06.05.16 12:44 Сейчас в теме
А вывод таков - ставьте ССД и не парьтесь с RAMом :)
Оставьте свое сообщение