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