База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как объединить одинаковую номенклатуру с одинаковыми ценами в приходной накладно
- В этой теме 1 ответ, 2 участника, последнее обновление 9 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
23 октября 2026 в 15:27 #38900
Уточню, логика в задаче такая. Складской учет не ведётся. Ведётся Fifo/Lifo. Каждый документ «приходная накладная» это новая партия. Т.е. в регистре накопления есть измерение «партия», которое является ссылкой на документ «приходная накладная.» Как в таком случае схлопывать одинаковую номенклатуру с одинаковыми ценами в приходной накладной?
-
23 октября 2026 в 15:27 #38901
В вашей постановке задачи партия определяется документом прихода, а складского измерения нет:
1С (Код)1234567Измерение регистра:НоменклатураПартияРесурсы:КоличествоСуммаПри проведении приходной накладной:
1С (Код)1Движение.Партия = Ссылка;Поэтому одинаковую номенклатуру в рамках одного документа нужно схлопывать по номенклатуре, а количество и сумму суммировать. Цена в регистр обычно не записывается, она рассчитывается как:
1С (Код)1Цена партии = Сумма партии / Количество партии## Правильный вариант для вашей задачи
Запрос по табличной части:
1С (Код)1234567891011121314151617181920212223242526272829303132Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Товары.Номенклатура,| СУММА(Товары.Количество) КАК Количество,| СУММА(Товары.Сумма) КАК Сумма|ИЗ| Документ.ПриходнаяНакладная.Товары КАК Товары|ГДЕ| Товары.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| Товары.Номенклатура";Запрос.УстановитьПараметр("Ссылка", Ссылка);Выборка = Запрос.Выполнить().Выбрать();Пока Выборка.Следующий() ЦиклДвижение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения =ВидДвиженияНакопления.Приход;Движение.Период = Дата;Движение.Номенклатура = Выборка.Номенклатура;Движение.Партия = Ссылка;Движение.Количество = Выборка.Количество;Движение.Сумма = Выборка.Сумма;КонецЦикла;Полностью процедура будет выглядеть примерно так:
1С (Код)1234567891011121314151617181920212223242526272829303132333435363738Процедура ОбработкаПроведения(Отказ, РежимПроведения)Движения.ОстаткиНоменклатуры.Записывать = Истина;Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| Товары.Номенклатура,| СУММА(Товары.Количество) КАК Количество,| СУММА(Товары.Сумма) КАК Сумма|ИЗ| Документ.ПриходнаяНакладная.Товары КАК Товары|ГДЕ| Товары.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| Товары.Номенклатура";Запрос.УстановитьПараметр("Ссылка", Ссылка);Выборка = Запрос.Выполнить().Выбрать();Пока Выборка.Следующий() ЦиклДвижение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения =ВидДвиженияНакопления.Приход;Движение.Период = Дата;Движение.Номенклатура = Выборка.Номенклатура;Движение.Партия = Ссылка;Движение.Количество = Выборка.Количество;Движение.Сумма = Выборка.Сумма;КонецЦикла;КонецПроцедуры## Что получится
Исходная табличная часть:
| Номенклатура | Количество | Цена | Сумма |
|—|—:|—:|—:|
| Товар 1 | 10 | 100 | 1 000 |
| Товар 1 | 5 | 100 | 500 |
| Товар 2 | 3 | 200 | 600 |После запроса будут сформированы две записи:
| Номенклатура | Партия | Количество | Сумма |
|—|—|—:|—:|
| Товар 1 | Приходная накладная | 15 | 1 500 |
| Товар 2 | Приходная накладная | 3 | 600 |Для
Товар 1цена партии останется 100 рублей:1С (Код)11500 / 15 = 100—
# Что делать, если в одном документе цена разная
Например:
| Номенклатура | Количество | Цена | Сумма |
|—|—:|—:|—:|
| Товар 1 | 10 | 100 | 1 000 |
| Товар 1 | 5 | 120 | 600 |При вашей модели это все равно одна партия, потому что партия равна ссылке на приходную накладную.
Значит, если регистр содержит только:
1С (Код)12НоменклатураПартиято разделить в регистре эти две цены невозможно. В регистре будет один остаток:
1С (Код)123Количество = 15Сумма = 1 600Средняя цена партии = 1 600 / 15 = 106,6667Это не ошибка. Это означает, что внутри одной партии учитывается средняя стоимость.
В таком случае запрос выше остается правильным:
1С (Код)12|СУММА(Товары.Количество) КАК Количество,|СУММА(Товары.Сумма) КАК СуммаНельзя при разных ценах суммировать только количество и брать цену первой строки.
Неправильно:
1С (Код)123Количество = 15Цена = 100Сумма = 1 500Правильно:
1С (Код)123Количество = 15Сумма = 1 600Цена партии = 106,6667## Почему нельзя группировать по цене
Иногда пытаются написать:
1С (Код)123|СГРУППИРОВАТЬ ПО| Товары.Номенклатура,| Товары.ЦенаЭто даст две строки при разных ценах:
| Номенклатура | Цена | Количество | Сумма |
|—|—:|—:|—:|
| Товар 1 | 100 | 10 | 1 000 |
| Товар 1 | 120 | 5 | 600 |Но затем обе строки будут записаны с одинаковыми измерениями:
1С (Код)12Номенклатура = Товар 1Партия = Один и тот же документЦена в измерения регистра не входит. Поэтому с точки зрения регистра это не две партии, а одна партия. Вы просто сформируете два движения с одинаковым набором измерений. В итогах регистра они все равно будут объединены:
1С (Код)12Количество = 15Сумма = 1 600Если задача требует, чтобы в регистре физически были разные ценовые слои, тогда измерения должны быть другими, например:
1С (Код)123НоменклатураПартияНомерСтрокиПартииНо это уже нарушает исходное условие «каждый документ является партией» в чистом виде. Тогда партией фактически становится:
1С (Код)1Документ + строка документа—
# Как это связано с FIFO и LIFO
При вашей модели FIFO/LIFO выбирает документы-партии, а не строки внутри документа.
Например, есть поступления:
| Документ | Номенклатура | Количество | Сумма |
|—|—|—:|—:|
| Приходная накладная №1 | Товар 1 | 15 | 1 600 |
| Приходная накладная №2 | Товар 1 | 20 | 2 400 |Для FIFO сначала списывается партия:
1С (Код)1Приходная накладная №1Для LIFO сначала:
1С (Код)1Приходная накладная №2Цена внутри конкретного документа уже является средней стоимостью партии:
1С (Код)12Себестоимость единицы партии =Сумма партии / Количество партииПоэтому в расходной накладной при списании из партии нужно рассчитывать стоимость пропорционально:
1С (Код)12СтоимостьСписания =КоличествоСписания * СуммаПартии / КоличествоПартииЕсли партия №1 содержит:
1С (Код)12Количество = 15Сумма = 1 600то стоимость единицы:
1С (Код)1106,6667При списании 3 единиц:
1С (Код)13 * 106,6667 = 320В реальном коде лучше считать стоимость без преждевременного округления:
1С (Код)12345678910Если ВыборкаПартии.КоличествоОстаток <> 0 ТогдаСтоимостьЕдиницы =ВыборкаПартии.СуммаОстаток/ ВыборкаПартии.КоличествоОстаток;ИначеСтоимостьЕдиницы = 0;КонецЕсли;СтоимостьСписания =КоличествоИзПартии * СтоимостьЕдиницы;## Важное замечание по полю
СуммаЕсли в табличной части сумма рассчитывается как:
1С (Код)1Количество * Ценато в запросе можно использовать
Товары.Сумма.Если поля
Суммав табличной части нет, сумму можно рассчитать в запросе:1С (Код)1234567891011Запрос.Текст ="ВЫБРАТЬ| Товары.Номенклатура,| СУММА(Товары.Количество) КАК Количество,| СУММА(Товары.Количество * Товары.Цена) КАК Сумма|ИЗ| Документ.ПриходнаяНакладная.Товары КАК Товары|ГДЕ| Товары.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| Товары.Номенклатура";## Ответ именно для вашей экзаменационной задачи
При условии:
1С (Код)1234складского учета нет;каждая приходная накладная является партией;партия хранится ссылкой на документ;FIFO/LIFO работает по документам-партиям;делайте так:
1. В запросе группируйте табличную часть по
Номенклатура.
2. Количество объединяйте черезСУММА(Количество).
3. Сумму объединяйте черезСУММА(Сумма).
4. В движение записывайте одну партию, равнуюСсылкадокумента.
5. Не включайте цену вСГРУППИРОВАТЬ ПО, если хотите одну запись на номенклатуру в партии.
6. Если цены внутри документа различаются, партия получает среднюю стоимость через общую сумму и общее количество.
7. Для FIFO/LIFO при списании выбирайте документы-партии, а не строки приходной накладной.То есть ключевой запрос на экзамене будет именно таким:
1С (Код)12345678910|ВЫБРАТЬ| Товары.Номенклатура,| СУММА(Товары.Количество) КАК Количество,| СУММА(Товары.Сумма) КАК Сумма|ИЗ| Документ.ПриходнаяНакладная.Товары КАК Товары|ГДЕ| Товары.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| Товары.НоменклатураВ данной модели это и есть корректное «схлопывание» одинаковой номенклатуры в рамках одной партии.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.