При программном создании документов конфигурации «Управление производственным предприятием 1.3» разработчики нередко сталкиваются с ситуацией, когда документ, созданный вручную, успешно делает движения по всем регистрам (регистр бухгалтерии, регистры партий и НДС), а сформированный программным кодом делает запись только в регистр накопления ТоварыОрганизаций либо выдает ошибку «Не списано по партиям» со счетами учета 41.01, 003.01.
Разберем детально архитектуру проведения документа «Перемещение товаров», проанализируем причины подобного поведения и рассмотрим практические способы решения проблемы.
В типовой конфигурации УПП 1.3 процедура проведения документа содержит специальное ветвление. Обратим внимание на типовой фрагмент модуля документа:
Процедура ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоТаре, Отказ, Заголовок)
Если СтруктураШапкиДокумента.РаспределениеОстатковТоваровОрганизацийПоСкладам Тогда
ДвиженияПоРегиструТоварыОрганизаций(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоТаре, Отказ, Заголовок);
Иначе
ДвиженияПоРегистрамУпр(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоТаре, Отказ, Заголовок);
ДвиженияПоРегиструТоварыОрганизаций(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоТаре, Отказ, Заголовок);
ДвиженияПоРегиструСписанныеТовары(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоТаре, Отказ, Заголовок);
КонецЕсли;
КонецПроцедуры
Если в реквизите РаспределениеОстатковТоваровОрганизацийПоСкладам установлено значение Истина, документ выполняет движения исключительно по регистру накопления ТоварыОрганизаций. Вся ветка управленческого, бухгалтерского и партийного учета просто игнорируется.
По умолчанию для обычного перемещения этот флаг должен иметь значение Ложь. Проверим программный код создания документа и убедимся, что реквизит не перезаписывается ошибочно.
Проверим корректность заполнения реквизитов шапки, отвечающих за отражение операции в разных видах учета:
ОтражатьВУправленческомУчете — если по условиям задачи управленческий учет не ведется, флаг оставляется равным Ложь.ОтражатьВБухгалтерскомУчете — должен быть установлен в значение Истина.ОтражатьВНалоговомУчете — должен быть установлен в значение Истина.Если реквизит ОтражатьВБухгалтерскомУчете окажется ложным, движения по регистру бухгалтерии ЖурналПроводокБУ и регистру накопления ПартииТоваровНаСкладахБухгалтерскийУчет формироваться не будут.
Сообщение «Не списано по партиям 1 шт товара..., счета учета 41.01, 003.01» сообщает о том, что механизм проведения попытался списать остатки со склада-отправителя, но не обнаружил свободной партии в регистре ПартииТоваровНаСкладах (бухгалтерский учет) с указанными в строке параметрами.
При интерактивном вводе номенклатуры в форму срабатывают обработчики событий, автоматически заполняющие скрытые реквизиты. При программном заполнении таблицы они могут остаться пустыми:
Справочники.Качества.Новый. Если в программно создаваемом документе не заполнить реквизит Качество строки, списание не найдет остаток.СчетУчетаБУ, СчетУчетаНУ, СчетУчетаНДСПоПриобретеннымЦенностям, а также корреспондирующие счета передачи (для перемещения).Проанализируем время проведения документов. Если программный документ создается на дату без указания конкретного времени (например, 07.12.2016 00:00:00), то по моменту времени он окажется раньше документа поступления, оформленного в тот же день.
Списание партий в оперативном и неоперативном режиме выполняется строго на МоментВремени() документа. Если на эту секунду партия еще не поступила, проведение прерывается с ошибкой нехватки остатка.
В учетной политике или настройках параметров учета УПП может быть снят признак «Списывать партии при проведении документов». В таком сценарии:
Посмотрим на пример правильного заполнения реквизитов документа «Перемещение товаров» в УПП 1.3:
НовыйДок = Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата(); // Устанавливаем точное время
НовыйДок.Организация = ВыбраннаяОрганизация;
НовыйДок.СкладОтправитель = СкладОтправитель;
НовыйДок.СкладПолучатель = СкладПолучатель;
// Настройка флагов учета
НовыйДок.ОтражатьВУправленческомУчете = Ложь;
НовыйДок.ОтражатьВБухгалтерскомУчете = Истина;
НовыйДок.ОтражатьВНалоговомУчете = Истина;
НовыйДок.РаспределениеОстатковТоваровОрганизацийПоСкладам = Ложь;
// Заполнение табличной части
СтрокаТЧ = НовыйДок.Товары.Добавить();
СтрокаТЧ.Номенклатура = ТекущаяНоменклатура;
СтрокаТЧ.Количество = 1;
СтрокаТЧ.Коэффициент = 1;
СтрокаТЧ.ЕдиницаИзмерения = ТекущаяНоменклатура.БазоваяЕдиницаИзмерения;
СтрокаТЧ.Качество = Справочники.Качества.Новый;
// Заполнение счетов учета
СтрокаТЧ.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; // 41.01
СтрокаТЧ.СчетУчетаНУ = ПланыСчетов.Налоговый.ТоварыНаСкладах;
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Ошибка проведения: " + ОписаниеОшибки());
КонецПопытки;
Если ошибка сохраняется, выполним следующие шаги диагностики:
Номенклатура, Склад, Качество, Счет учета, Характеристика, Серия.