Программное создание документа корректировки регистров в типовых конфигурациях (УТ11, БП3, ERP).

Всем добра. Результатом неправильного ведения учета в типовых конфигурация 1С является бардак по основным регистрам учета ТоварыНаСкладах, ТоварыОрганизаций, СвободныеОстатки, ТоварыКОтгрузке. Один из моих клиентов, бездумно отключил использование ордерных складов, и через некоторое время ожидаемо получил путаницу по учету, а так как ордера уже были отключены, то документально исправить это добро не представлялось возможным. Потому и было принято прибегнуть к крайней мере, использование документа Корректировка регистров.

Ниже опишу код программного создания такого документа.

&НаСервере
Процедура ВыровнятьНаСервере()
	
	
	Док = Документы.КорректировкаРегистров.СоздатьДокумент();
	Док.Дата= КонецДня(ТекущаяДата() - 86400); //Дата равно концу предыдущего дня
	Док.Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь();
	Док.Комментарий = "Корректировка по тоовару " + Номенклатура.Наименование;
	Док.Операция  = Перечисления.ОперацииКорректировкиРегистров.РучнаяКорректировка;
	Док.Организация = Справочники.Организации.ОрганизацияПоУмолчанию();
	
	// Заполняем состав таблицы регистиров
	НовСтрРег = Док.ТаблицаРегистров.Добавить();
	НовСтрРег.Имя = "ТоварыНаСкладах";
	
	НовСтрРег2 = Док.ТаблицаРегистров.Добавить();
	НовСтрРег2.Имя = "СвободныеОстатки";
	
	НовСтрРег3 = Док.ТаблицаРегистров.Добавить();
	НовСтрРег3.Имя = "ТоварыОрганизаций";
	
	НовСтрРег4 = Док.ТаблицаРегистров.Добавить();
	НовСтрРег4.Имя = "ТоварыКОтгрузке";	
	Док.Записать(РежимЗаписиДокумента.Запись); // записываем что иметь ссылку для набора записей
	
	//Создаем записи регистра ТоварыНаСкладах
	Для Каждого товар Из ТоварыНаСкладах Цикл
		Если товар.ВНаличии > 0 И товар.КОтгрузке >=0 Тогда
			НаборОстатки = Док.Движения.ТоварыНаСкладах.ДобавитьРасход();
			НаборОстатки.Номенклатура = товар.Номенклатура;
			НаборОстатки.Активность = Истина;
			НаборОстатки.Период = Док.Дата;
			НаборОстатки.Серия = товар.Серия;
			НаборОстатки.ВНаличии = товар.ВНаличии;
			НаборОстатки.КОтгрузке = товар.КОтгрузке;
			НаборОстатки.Склад = товар.Склад;
			НаборОстатки.Регистратор = док.Ссылка;
			//НаборОстатки.НомерСтроки = НомерСтроки + 1;
			НаборОстатки.КонтролироватьОстатки = Истина;			
		ИначеЕсли товар.ВНаличии < 0 И товар.КОтгрузке <=0 Тогда
			НаборОстатки = Док.Движения.ТоварыНаСкладах.ДобавитьПриход();
			НаборОстатки.Номенклатура = товар.Номенклатура;
			НаборОстатки.Активность = Истина;
			НаборОстатки.Период = Док.Дата;
			НаборОстатки.Серия = товар.Серия;
			Если товар.ВНаличии <> 0 Тогда
				НаборОстатки.ВНаличии = товар.ВНаличии * (-1);
			КонецЕсли;
			Если товар.КОтгрузке <> 0 Тогда
				НаборОстатки.КОтгрузке = товар.КОтгрузке * (-1);
			КонецЕсли;			
			НаборОстатки.КОтгрузке = товар.КОтгрузке;
			НаборОстатки.Склад = товар.Склад;
			НаборОстатки.Регистратор = док.Ссылка;
			//НаборОстатки.НомерСтроки = НомерСтроки + 1;
			НаборОстатки.КонтролироватьОстатки = Истина;
		Иначе
			Сообщить("Шалом!");
		КонецЕсли;
		
		//Если нам нужно актуализировать остаток то тут же делаем
		Если АктуальныйОстаток > 0 Тогда
			НаборОстаткиАктуальные = Док.Движения.ТоварыНаСкладах.ДобавитьПриход();
			НаборОстаткиАктуальные.Номенклатура = товар.Номенклатура;
			НаборОстаткиАктуальные.Активность = Истина;
			НаборОстаткиАктуальные.Период = Док.Дата;
			НаборОстаткиАктуальные.Серия = товар.Серия;
			НаборОстаткиАктуальные.ВНаличии = АктуальныйОстаток;
			НаборОстаткиАктуальные.Склад = товар.Склад;
			НаборОстаткиАктуальные.Регистратор = док.Ссылка;
			НаборОстаткиАктуальные.КонтролироватьОстатки = Истина;	
		КонецЕсли;
	КонецЦикла;
	
	//Создаем записи регистра СвободныеОстатки
	Для Каждого товар Из СвободныеОстатки Цикл
		Если товар.ВНаличии > 0 И товар.ВРезервеСоСклада >=0 И товар.ВРезервеПодЗаказ >=0 Тогда
			НаборСвОстатки = Док.Движения.СвободныеОстатки.ДобавитьРасход();
			НаборСвОстатки.Номенклатура = товар.Номенклатура;
			НаборСвОстатки.Склад = товар.Склад;			
			НаборСвОстатки.Активность = Истина;
			НаборСвОстатки.Период = Док.Дата;
			НаборСвОстатки.ВНаличии = товар.ВНаличии;
			НаборСвОстатки.ВРезервеСоСклада = товар.ВРезервеСоСклада;
			НаборСвОстатки.ВРезервеПодЗаказ = товар.ВРезервеПодЗаказ;			
			НаборСвОстатки.Регистратор = док.Ссылка;
		ИначеЕсли товар.ВНаличии < 0 И товар.ВРезервеСоСклада <=0 И товар.ВРезервеПодЗаказ <=0 Тогда
			НаборСвОстатки = Док.Движения.СвободныеОстатки.ДобавитьПриход();
			НаборСвОстатки.Номенклатура = товар.Номенклатура;
			НаборСвОстатки.Склад = товар.Склад;			
			НаборСвОстатки.Активность = Истина;
			НаборСвОстатки.Период = Док.Дата;
			НаборСвОстатки.ВНаличии = товар.ВНаличии * (-1);
			Если НаборСвОстатки.ВРезервеСоСклада <> 0 Тогда
				НаборСвОстатки.ВРезервеСоСклада = товар.ВРезервеСоСклада * (-1);
			КонецЕсли;
			Если НаборСвОстатки.ВРезервеПодЗаказ <> 0 Тогда
				НаборСвОстатки.ВРезервеПодЗаказ = товар.ВРезервеПодЗаказ * (-1);
			КонецЕсли;	
			НаборСвОстатки.Регистратор = док.Ссылка;
		Иначе
			Сообщить("Шалом!");
		КонецЕсли;
		
		//Если нам нужно актуализировать остаток то тут же делаем
		Если АктуальныйОстаток > 0 Тогда
			НаборСвОстатки = Док.Движения.СвободныеОстатки.ДобавитьПриход();
			НаборСвОстатки.Номенклатура = товар.Номенклатура;
			НаборСвОстатки.Склад = товар.Склад;			
			НаборСвОстатки.Активность = Истина;
			НаборСвОстатки.Период = Док.Дата;
			НаборСвОстатки.ВНаличии = АктуальныйОстаток;	
			НаборСвОстатки.Регистратор = док.Ссылка;	
		КонецЕсли;	
	КонецЦикла;
	
	//Создаем записи регистра ТоварыОрганизаций
	Для Каждого товар Из ТоварыОрганизаций Цикл
		Если товар.Количество > 0 И товар.КОформлениюСписания >=0 Тогда
			НаборТоварОрг = Док.Движения.ТоварыОрганизаций.ДобавитьРасход();
			НаборТоварОрг.АналитикаУчетаНоменклатуры = товар.АналитикаУчетаНоменклатуры;
			НаборТоварОрг.ВидЗапасов = товар.ВидЗапасов;
			НаборТоварОрг.НомерГТД = товар.НомерГТД;
			НаборТоварОрг.Организация = товар.Организация;
			НаборТоварОрг.Активность = Истина;
			НаборТоварОрг.Регистратор = док.Ссылка;
			НаборТоварОрг.Период = Док.Дата;
			НаборТоварОрг.Количество = товар.Количество;
			НаборТоварОрг.КОформлениюСписания = товар.КОформлениюСписания;			
			
		ИначеЕсли товар.Количество < 0 И товар.КОформлениюСписания <=0 Тогда
			НаборТоварОрг = Док.Движения.ТоварыОрганизаций.ДобавитьПриход();
			НаборТоварОрг.АналитикаУчетаНоменклатуры = товар.АналитикаУчетаНоменклатуры;
			НаборТоварОрг.ВидЗапасов = товар.ВидЗапасов;
			НаборТоварОрг.НомерГТД = товар.НомерГТД;
			НаборТоварОрг.Организация = товар.Организация;
			НаборТоварОрг.Активность = Истина;
			НаборТоварОрг.Регистратор = док.Ссылка;
			НаборТоварОрг.Период = Док.Дата;
			НаборТоварОрг.Количество = товар.Количество * (-1);			
			Если НаборТоварОрг.КОформлениюСписания <> 0 Тогда
				НаборТоварОрг.КОформлениюСписания = товар.КОформлениюСписания * (-1);
			КонецЕсли;	
			НаборТоварОрг.Регистратор = док.Ссылка;
		Иначе
			Сообщить("Шалом!");
		КонецЕсли;
		
		//Если нам нужно актуализировать остаток то тут же делаем
		Если АктуальныйОстаток > 0 Тогда
			НаборТоварОрг = Док.Движения.ТоварыОрганизаций.ДобавитьПриход();
			НаборТоварОрг.АналитикаУчетаНоменклатуры = товар.АналитикаУчетаНоменклатуры;
			НаборТоварОрг.ВидЗапасов = товар.ВидЗапасов;
			НаборТоварОрг.НомерГТД = товар.НомерГТД;
			НаборТоварОрг.Организация = товар.Организация;
			НаборТоварОрг.Активность = Истина;
			НаборТоварОрг.Регистратор = док.Ссылка;
			НаборТоварОрг.Период = Док.Дата;
			НаборТоварОрг.Количество = АктуальныйОстаток;			
			НаборТоварОрг.Регистратор = док.Ссылка	
		КонецЕсли;		
	КонецЦикла;
	
	
	
	//Создаем записи регистра ТоварыКОтгрузке
	Для Каждого товар Из ТоварыКОтгрузке Цикл
		Если товар.КОтгрузке > 0 ИЛИ товар.КСборке > 0 Тогда
			НаборТоварОтрузке = Док.Движения.ТоварыКОтгрузке.ДобавитьРасход();
			НаборТоварОтрузке.Склад = товар.Склад;
			НаборТоварОтрузке.Получатель = товар.Получатель;
			НаборТоварОтрузке.ДокументОтгрузки = товар.ДокументОтгрузки;
			НаборТоварОтрузке.Номенклатура = товар.Номенклатура;
			НаборТоварОтрузке.Серия = товар.Серия;
			НаборТоварОтрузке.Активность = Истина;
			НаборТоварОтрузке.Регистратор = док.Ссылка;
			НаборТоварОтрузке.Период = Док.Дата;
			НаборТоварОтрузке.КОтгрузке = товар.КОтгрузке;
			НаборТоварОтрузке.КСборке = товар.КСборке;			
		Иначе
			Сообщить("Шалом!");
		КонецЕсли;		
	КонецЦикла;	
	
	Док.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры

&НаКлиенте
Процедура Выровнять(Команда)
	ВыровнятьНаСервере();
КонецПроцедуры

Сразу оговорюсь, что регистр ТоварыКОтгрузке как таковой не влияет на количественный учет, но из за него типовой подбор товаров в документы продажи показывает неверные значения. Давать такую обработку пользователяем немного опасно, поэтому все корректировки должен делать специалист который понимает принципы учета в типовых и осознает последствия своих действий.

Ссылка на пример обработки для УТ11.

Posted in 1C

Добавить комментарий

Ваш адрес email не будет опубликован.