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