Всем добра. Результатом неправильного ведения учета в типовых конфигурация 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.