База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как списывать только товары, если в документах две части: товары и услуги?
- В этой теме 1 ответ, 2 участника, последнее обновление 4 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
23 октября 2026 в 16:03 #38910
А если в расходной накладной две табличные части — товары и услуги? Как нам списывать только товары?
-
23 октября 2026 в 16:03 #38911
Если в расходной накладной есть две отдельные табличные части:
—
Товары
—Услугито в регистр
ОстаткиНоменклатурынужно формировать движения только по табличной частиТовары.Табличную часть
Услугипри списании складских остатков обрабатывать не нужно.## Простой вариант без FIFO
1С (Код)12345678910111213141516171819202122232425262728Процедура ОбработкаПроведения(Отказ, Режим)Движения.ОстаткиНоменклатуры.Записывать = Истина;Для Каждого ТекСтрокаТовары Из Товары ЦиклЕсли ТекСтрокаТовары.Количество <= 0 ТогдаПродолжить;КонецЕсли;Движение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;Движение.Количество = ТекСтрокаТовары.Количество;// Партия и стоимость здесь должны быть определены// алгоритмом списания, например FIFO.Движение.Партия = ТекСтрокаТовары.Партия;Движение.Стоимость = ТекСтрокаТовары.Стоимость;КонецЦикла;// Табличную часть Услуги здесь не обрабатываем.// Услуги не уменьшают складской остаток.КонецПроцедурыНо для FIFO нельзя просто взять
ПартияиСтоимостьиз строки документа, если пользователь их там не указывает. При FIFO партия и себестоимость должны определяться по остаткам регистра.## Вариант с FIFO
Для каждой строки из табличной части
Товарынужно:1. получить остатки по номенклатуре;
2. выбрать партии в порядке FIFO;
3. списать нужное количество начиная с самой ранней партии;
4. сформировать одно или несколько расходных движений;
5. табличную частьУслугине обрабатывать.Пример основной логики:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788Процедура ОбработкаПроведения(Отказ, Режим)Движения.ОстаткиНоменклатуры.Записывать = Истина;Для Каждого ТекСтрокаТовары Из Товары ЦиклЕсли ТекСтрокаТовары.Количество <= 0 ТогдаПродолжить;КонецЕсли;ОсталосьСписать = ТекСтрокаТовары.Количество;Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Остатки.Партия КАК Партия,| Остатки.КоличествоОстаток КАК КоличествоОстаток,| Остатки.СтоимостьОстаток КАК СтоимостьОстаток|ИЗ| РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &Момент,| Номенклатура = &Номенклатура| ) КАК Остатки|ГДЕ| Остатки.КоличествоОстаток > 0|УПОРЯДОЧИТЬ ПО| Остатки.Партия.Дата";Запрос.УстановитьПараметр("Момент", Дата);Запрос.УстановитьПараметр("Номенклатура",ТекСтрокаТовары.Номенклатура);ВыборкаОстатков = Запрос.Выполнить().Выбрать();Пока ВыборкаОстатков.Следующий() И ОсталосьСписать > 0 ЦиклЕсли ВыборкаОстатков.КоличествоОстаток <= 0 ТогдаПродолжить;КонецЕсли;КоличествоКСписанию = ОсталосьСписать;Если ВыборкаОстатков.КоличествоОстаток < КоличествоКСписанию ТогдаКоличествоКСписанию =ВыборкаОстатков.КоличествоОстаток;КонецЕсли;СтоимостьЕдиницы =ВыборкаОстатков.СтоимостьОстаток/ ВыборкаОстатков.КоличествоОстаток;СтоимостьКСписанию =СтоимостьЕдиницы * КоличествоКСписанию;Движение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения =ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура =ТекСтрокаТовары.Номенклатура;Движение.Партия =ВыборкаОстатков.Партия;Движение.Количество =КоличествоКСписанию;Движение.Стоимость =СтоимостьКСписанию;ОсталосьСписать =ОсталосьСписать - КоличествоКСписанию;КонецЦикла;Если ОсталосьСписать > 0 ТогдаОтказ = Истина;Сообщить("Недостаточно остатка товара: "+ Строка(ТекСтрокаТовары.Номенклатура));Возврат;КонецЕсли;КонецЦикла;КонецПроцедурыВ данном запросе каждая строка также оформлена с символом
|, как требуется для текста запроса 1С.## Что произойдет с услугами
Допустим, документ содержит:
### Табличная часть
Товары| Номенклатура | Количество |
|—|—:|
| Ручка | 1 |### Табличная часть
Услуги| Номенклатура | Количество |
|—|—:|
| Доставка | 1 |При проведении:
— по ручке создается движение
Расходв регистреОстаткиНоменклатуры;
— по услуге движение в регистре складских остатков не создается.Услуга может отражаться отдельно:
— в регистре затрат;
— в бухгалтерском регистре;
— в документе поступления услуг;
— в составе дополнительных расходов.Но складской остаток услуги уменьшать не нужно.
## Если регистр содержит склад
Если в регистре есть измерение
Склад, его также нужно заполнять в расходном движении:1С (Код)1Движение.Склад = Склад;И это условие нужно добавить в запрос остатков. Например:
1С (Код)1234567891011121314|ВЫБРАТЬ| Остатки.Партия КАК Партия,| Остатки.КоличествоОстаток КАК КоличествоОстаток,| Остатки.СтоимостьОстаток КАК СтоимостьОстаток|ИЗ| РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &Момент,| Номенклатура = &Номенклатура| И Склад = &Склад| ) КАК Остатки|ГДЕ| Остатки.КоличествоОстаток > 0|УПОРЯДОЧИТЬ ПО| Остатки.Партия.ДатаИ параметр:
1С (Код)1Запрос.УстановитьПараметр("Склад", Склад);## Если в табличной части
Товарымогут находиться услугиЕсли услуги находятся не в отдельной табличной части, а вместе с товарами, тогда нужно проверять вид номенклатуры:
1С (Код)123456Если ТекСтрокаТовары.Номенклатура.ВидНоменклатуры =Перечисления.ВидыНоменклатуры.Услуга ТогдаПродолжить;КонецЕсли;Но если у вас действительно две отдельные табличные части, проверка не нужна. Достаточно обходить только:
1С (Код)1Для Каждого ТекСтрокаТовары Из Товары Цикли вообще не обращаться к табличной части
Услуги.Еще один важный момент: в расходном документе сумма строки обычно является продажной стоимостью. Для регистра остатков в поле
Стоимостьнужно записывать себестоимость, полученную из партии, а не сумму реализации из документа.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.