diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c846c0..76348ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,14 @@
---
+## 1.3.1.126 (2026-10-09)
+
+### #36: серии ввода остатков
+
+- Тип «учёт себестоимости по сериям» (лаеннек) — серия в колонке строки.
+- Тип «управление остатками серий» — колонка пустая, количество в табличной части «Серии» с тем же идентификатором строки.
+- Строки без характеристики с одной серией и одним ГТД сворачиваются.
+
## 1.3.1.125 (2026-10-07)
### #68: явный отказ партнёр-веток вне узла crm3-dev
diff --git a/VERSION b/VERSION
index 16f4b2d..494d28a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.1.125
+1.3.1.126
diff --git a/src/Configuration.xml b/src/Configuration.xml
index 0f33aa5..4a5ea69 100644
--- a/src/Configuration.xml
+++ b/src/Configuration.xml
@@ -62,7 +62,7 @@
Role.РК_ОсновнаяРоль
- 1.3.1.125
+ 1.3.1.126
Language.Русский
diff --git a/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl b/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
index 96854c2..553d488 100644
--- a/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
+++ b/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
@@ -1096,6 +1096,7 @@
Исключение
КонецПопытки;
+ СтрокиСклада = СвернутьСтрокиБезХарактеристики(СтрокиСклада);
Для Каждого СтрТ Из СтрокиСклада Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
@@ -1168,6 +1169,7 @@
Исключение
КонецПопытки;
+ СтрокиГруппы = СвернутьСтрокиБезХарактеристики(СтрокиГруппы);
Для Каждого СтрТ Из СтрокиГруппы Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
@@ -1204,7 +1206,14 @@
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Характеристика = СтрТ.Характеристика;
- НовСтр.Серия = СтрТ.СерияСсылка;
+ СкладПолитики = СтрТ.Склад;
+ Если Не ЗначениеЗаполнено(СкладПолитики) Тогда
+ СкладПолитики = Док.Склад;
+ КонецЕсли;
+ // Учёт себестоимости по сериям — колонка «Серия». Управление остатками — окно (ТЧ Серии).
+ Если СерияУказываетсяВКолонке(Док, СтрТ.Номенклатура, СкладПолитики) Тогда
+ НовСтр.Серия = СтрТ.СерияСсылка;
+ КонецЕсли;
НовСтр.Количество = КолДок;
НовСтр.КоличествоУпаковок = КолДок;
НовСтр.Сумма = СтрТ.Стоимость;
@@ -1225,16 +1234,112 @@
НовСтр.НомерГТД = СтрТ.НомерГТДСсылка;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
+ Если Не ЗначениеЗаполнено(НовСтр.ИдентификаторСтроки) Тогда
+ НовСтр.ИдентификаторСтроки = Строка(Новый УникальныйИдентификатор);
+ КонецЕсли;
СтрСер = Док.Серии.Добавить();
СтрСер.Номенклатура = НовСтр.Номенклатура;
СтрСер.Характеристика = НовСтр.Характеристика;
СтрСер.Серия = СтрТ.СерияСсылка;
СтрСер.Количество = НовСтр.Количество;
СтрСер.КоличествоУпаковок = НовСтр.Количество;
+ СтрСер.ИдентификаторСтроки = НовСтр.ИдентификаторСтроки;
КонецЕсли;
КонецПроцедуры
+Функция СерияУказываетсяВКолонке(Док, Номенклатура, Склад)
+
+ Кэш = Неопределено;
+ Если Не Док.ДополнительныеСвойства.Свойство("КэшСерияВКолонке", Кэш) Тогда
+ Кэш = Новый Соответствие;
+ Док.ДополнительныеСвойства.Вставить("КэшСерияВКолонке", Кэш);
+ КонецЕсли;
+
+ КлючСклада = "";
+ Если ЗначениеЗаполнено(Склад) Тогда
+ КлючСклада = Строка(Склад.УникальныйИдентификатор());
+ КонецЕсли;
+ Ключ = Строка(Номенклатура.УникальныйИдентификатор()) + "|" + КлючСклада;
+ ЗначениеКэша = Кэш.Получить(Ключ);
+ Если ЗначениеКэша <> Неопределено Тогда
+ Возврат ЗначениеКэша;
+ КонецЕсли;
+
+ ТипПолитики = Неопределено;
+ Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, "ВидНоменклатуры");
+ Если ЗначениеЗаполнено(Вид) И ЗначениеЗаполнено(Склад) Тогда
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 1
+ | Пол.ПолитикаУчетаСерий.ТипПолитики КАК ТипПолитики
+ |ИЗ
+ | Справочник.ВидыНоменклатуры.ПолитикиУчетаСерий КАК Пол
+ |ГДЕ
+ | Пол.Ссылка = &Вид
+ | И Пол.Склад = &Склад
+ | И Пол.ПолитикаУчетаСерий <> ЗНАЧЕНИЕ(Справочник.ПолитикиУчетаСерий.ПустаяСсылка)";
+ Запрос.УстановитьПараметр("Вид", Вид);
+ Запрос.УстановитьПараметр("Склад", Склад);
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Следующий() Тогда
+ ТипПолитики = Выборка.ТипПолитики;
+ КонецЕсли;
+ КонецЕсли;
+ Если Не ЗначениеЗаполнено(ТипПолитики) И ЗначениеЗаполнено(Вид) Тогда
+ Политика = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Вид, "ПолитикаУчетаСерий");
+ Если ЗначениеЗаполнено(Политика) Тогда
+ ТипПолитики = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Политика, "ТипПолитики");
+ КонецЕсли;
+ КонецЕсли;
+
+ ВКолонке = ТипПолитики = Перечисления.ТипыПолитикУказанияСерий.УчетСебестоимостиПоСериям
+ Или ТипПолитики = Перечисления.ТипыПолитикУказанияСерий.СправочноеУказаниеСерий;
+ Кэш.Вставить(Ключ, ВКолонке);
+ Возврат ВКолонке;
+
+КонецФункции
+
+Функция СвернутьСтрокиБезХарактеристики(Строки)
+
+ Результат = Новый Массив;
+ Индекс = Новый Соответствие;
+ Для Каждого СтрТ Из Строки Цикл
+ Если ЗначениеЗаполнено(СтрТ.Характеристика) Или Не ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
+ Результат.Добавить(СтрТ);
+ Продолжить;
+ КонецЕсли;
+ КлючГТД = "";
+ Если ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
+ КлючГТД = Строка(СтрТ.НомерГТДСсылка.УникальныйИдентификатор());
+ КонецЕсли;
+ Ключ = Строка(СтрТ.Номенклатура.УникальныйИдентификатор())
+ + "|" + Строка(СтрТ.СерияСсылка.УникальныйИдентификатор())
+ + "|" + КлючГТД;
+ Уже = Индекс.Получить(Ключ);
+ Если Уже = Неопределено Тогда
+ Индекс.Вставить(Ключ, СтрТ);
+ Результат.Добавить(СтрТ);
+ Иначе
+ Уже.Количество = КоличествоСтрокиВвода(Уже) + КоличествоСтрокиВвода(СтрТ);
+ Уже.КоличествоОрганизации = Уже.Количество;
+ Уже.Стоимость = Уже.Стоимость + СтрТ.Стоимость;
+ Уже.СтоимостьРегл = Уже.СтоимостьРегл + СтрТ.СтоимостьРегл;
+ КонецЕсли;
+ КонецЦикла;
+ Возврат Результат;
+
+КонецФункции
+
+Функция КоличествоСтрокиВвода(СтрТ)
+
+ Если СтрТ.КоличествоОрганизации <> 0 Тогда
+ Возврат СтрТ.КоличествоОрганизации;
+ КонецЕсли;
+ Возврат СтрТ.Количество;
+
+КонецФункции
+
// Расчёт СуммаНДС / СуммаСНДС / СуммаБезНДС / НДСРегл после заполнения строк (#33).
// Штатный путь — ПакетнаяОбработкаТабличнойЧасти (как в форме/модуле ВводОстатковТоваров).
//