diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59c38c3..e314aaf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,19 @@
---
+## 1.3.1.128 (2026-10-12)
+
+### #76: партия ввода остатков
+
+- Перед записью КБ загрузчик находит или создаёт один документ «Первичный документ» типа «Внутренняя накладная» на организацию и дату ввода, записывает и проводит его без режима загрузки.
+- Ссылка ставится в шапку собственных документов и комиссии 2.5.
+
+### #77: сумма регл. не по курсу даты
+
+- У документа «Ввод остатков товаров» в расширении реквизит «Не пересчитывать сумму регл. по курсу даты». По умолчанию выключен, выведен в шапку формы.
+- При включённом признаке смена количества берёт курс строки (сумма регл. / сумма без НДС), а если его нет — курс даты документа. Смена даты сумму регл. и НДС регл. не меняет.
+- Загрузчик включает признак у создаваемых КБ.
+
## 1.3.1.127 (2026-10-12)
### #36: серии ввода остатков без идентификатора строки
diff --git a/VERSION b/VERSION
index 0c19f35..84666e0 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.1.127
+1.3.1.128
diff --git a/src/ConfigDumpInfo.xml b/src/ConfigDumpInfo.xml
index dfca237..ddebfe3 100644
--- a/src/ConfigDumpInfo.xml
+++ b/src/ConfigDumpInfo.xml
@@ -309,6 +309,11 @@
+
+
+
+
+
diff --git a/src/Configuration.xml b/src/Configuration.xml
index ee690b5..ee4e29f 100644
--- a/src/Configuration.xml
+++ b/src/Configuration.xml
@@ -62,7 +62,7 @@
Role.РК_ОсновнаяРоль
- 1.3.1.127
+ 1.3.1.128
Language.Русский
@@ -115,6 +115,7 @@
ВидыНоменклатуры
ВидыЦен
РеализацияТоваровУслуг
+ ВводОстатковТоваров
ЗаказКлиента
РасходныйОрдерНаТовары
ХозяйственныеОперации
diff --git a/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl b/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
index a269f19..7f615a1 100644
--- a/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
+++ b/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
@@ -485,6 +485,20 @@
ДобавитьСтрокуПротокола(Результат, "Удалено документов: " + Формат(Результат.УдаленоДокументов, "ЧН=0; ЧГ=0"));
КонецЕсли;
+ ПартияВвода = Документы.ПервичныйДокумент.ПустаяСсылка();
+ СоздаватьДокументы = Истина;
+ Если Не РежимТест
+ И (СтрокиПоСкладу.Количество() > 0 Или СтрокиКомиссии.Количество() > 0) Тогда
+ Попытка
+ ПартияВвода = НайтиИлиСоздатьПартиюВводаОстатков(ТекстТега, Результат);
+ Исключение
+ СоздаватьДокументы = Ложь;
+ Результат.Ошибок = Результат.Ошибок + 1;
+ ДобавитьСтрокуПротокола(Результат, "[ERROR] партия ввода остатков: "
+ + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+ КонецЕсли;
+
Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл
СкладДок = ЭлементСклада.Ключ;
@@ -507,8 +521,13 @@
Продолжить;
КонецЕсли;
+ Если Не СоздаватьДокументы Тогда
+ ДобавитьСтрокуПротокола(Результат, "[SKIP] " + Контекст + " — нет партии ввода остатков");
+ Продолжить;
+ КонецЕсли;
+
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
- Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега);
+ Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега, ПартияВвода);
Если ДокументВводаСозданУспешно(Док) Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + Док.Товары.Количество();
@@ -558,8 +577,13 @@
Продолжить;
КонецЕсли;
+ Если Не СоздаватьДокументы Тогда
+ ДобавитьСтрокуПротокола(Результат, "[SKIP] " + Контекст + " — нет партии ввода остатков");
+ Продолжить;
+ КонецЕсли;
+
ДобавитьСтрокуПротокола(Результат, "[FILL] " + Контекст);
- Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега);
+ Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега, ПартияВвода);
Если ДокументВводаСозданУспешно(Док) Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + Док.Товары.Количество();
@@ -957,6 +981,54 @@
КонецФункции
+Функция НайтиИлиСоздатьПартиюВводаОстатков(ТекстТега, Результат)
+
+ КомментарийПартии = ТекстТега + ", партия ввода остатков";
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 1
+ | Док.Ссылка КАК Ссылка
+ |ИЗ
+ | Документ.ПервичныйДокумент КАК Док
+ |ГДЕ
+ | НЕ Док.ПометкаУдаления
+ | И Док.Организация = &Организация
+ | И Док.ТипПервичногоДокумента = ЗНАЧЕНИЕ(Перечисление.ТипыПервичныхДокументов.ВнутренняяНакладная)
+ | И Док.Дата = &Дата
+ | И Док.Комментарий ПОДОБНО &Комментарий";
+ Запрос.УстановитьПараметр("Организация", Организация);
+ Запрос.УстановитьПараметр("Дата", ДатаДокументовВвода);
+ Запрос.УстановитьПараметр("Комментарий", "%" + КомментарийПартии + "%");
+
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Следующий() Тогда
+ Док = Выборка.Ссылка.ПолучитьОбъект();
+ Найдена = Истина;
+ Иначе
+ Док = Документы.ПервичныйДокумент.СоздатьДокумент();
+ Док.Дата = ДатаДокументовВвода;
+ Док.Организация = Организация;
+ Док.ТипПервичногоДокумента = Перечисления.ТипыПервичныхДокументов.ВнутренняяНакладная;
+ Док.Комментарий = КомментарийПартии;
+ Найдена = Ложь;
+ КонецЕсли;
+
+ Док.ОбменДанными.Загрузка = Ложь;
+ Если Не Док.Проведен Тогда
+ Док.Записать(РежимЗаписиДокумента.Запись);
+ Док.ОбменДанными.Загрузка = Ложь;
+ Док.Записать(РежимЗаписиДокумента.Проведение);
+ КонецЕсли;
+
+ ДобавитьСтрокуПротокола(Результат, "[PARTY] "
+ + ?(Найдена, "найдена", "создана")
+ + " " + СокрЛП(Строка(Док.Ссылка))
+ + ?(Док.Проведен, ", проведена", ", не проведена"));
+
+ Возврат Док.Ссылка;
+
+КонецФункции
+
Функция СгруппироватьСопоставленныеСтрокиПоСкладу()
Группы = Новый Соответствие;
@@ -1055,7 +1127,7 @@
КонецФункции
-Функция СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега)
+Функция СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега, ПартияВвода)
Док = Документы.ВводОстатковТоваров.СоздатьДокумент();
Док.Дата = ДатаДокументовВвода;
@@ -1063,6 +1135,8 @@
Док.Склад = СкладДок;
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковСобственныхТоваров;
Док.Комментарий = ТекстТега + ", склад " + СокрЛП(Строка(СкладДок));
+ Док.Партия = ПартияВвода;
+ Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина;
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиСклада);
Док.ЦенаВключаетНДС = Ложь;
@@ -1120,7 +1194,7 @@
КонецФункции
-Функция СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега)
+Функция СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега, ПартияВвода)
Первая = СтрокиГруппы[0];
ДоговорШапки = Первая.Договор;
@@ -1141,6 +1215,8 @@
Док.Контрагент = Первая.Контрагент;
Док.Договор = ДоговорШапки;
Док.Комментарий = ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер));
+ Док.Партия = ПартияВвода;
+ Док.РК_НеПересчитыватьСуммуРеглПоКурсу = Истина;
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиГруппы);
Док.ЦенаВключаетНДС = Ложь;
diff --git a/src/Documents/ВводОстатковТоваров.xml b/src/Documents/ВводОстатковТоваров.xml
new file mode 100644
index 0000000..db2e0d5
--- /dev/null
+++ b/src/Documents/ВводОстатковТоваров.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 5719c72b-76b1-43b9-8f81-2f15f76f30bf
+ 0ab8c865-e7fc-4866-b55f-8558d7aa5706
+
+
+ b7a0471e-be57-4d71-a748-aba2f35ceae5
+ 171d675a-6dbb-4728-bf9f-6404ee5d54d7
+
+
+ 67db6f20-b180-475b-b961-206dd3786ad2
+ 4ffc047d-32b8-465a-aa0b-7e94862d2252
+
+
+ 145005ae-21a1-43ac-b2cb-dc97a8d49e8a
+ d90b58fe-f592-4777-8a53-47218adce8f8
+
+
+ e923d112-c102-4a2b-ae80-cb7b5266b1d3
+ f1636c2d-8878-40d0-91df-6b3c580c9992
+
+
+
+ Adopted
+ ВводОстатковТоваров
+
+ 66c3293d-14ec-4a51-8b6b-ac5b70921345
+
+
+
+
+
+ Own
+ РК_НеПересчитыватьСуммуРеглПоКурсу
+
+
+ ru
+ Не пересчитывать сумму регл. по курсу даты
+
+
+
+ 00000000-0000-0000-0000-000000000000
+
+ xs:boolean
+
+ false
+
+
+
+
+ ru
+ При изменении количества курс берётся из строки. Смена даты не пересчитывает сумму регл.
+
+
+ false
+
+ false
+ false
+
+
+ true
+ false
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+ DontIndex
+ Use
+ Use
+
+
+
+
+
+
diff --git a/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары.xml b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары.xml
new file mode 100644
index 0000000..79d467a
--- /dev/null
+++ b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Form.xml b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Form.xml
new file mode 100644
index 0000000..1c0c9e7
--- /dev/null
+++ b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Form.xml
@@ -0,0 +1,27996 @@
+
+
diff --git a/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Module.bsl b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Module.bsl
new file mode 100644
index 0000000..87a9ee5
--- /dev/null
+++ b/src/Documents/ВводОстатковТоваров/Forms/ФормаТовары/Ext/Form/Module.bsl
@@ -0,0 +1,162 @@
+#Область РК_СуммаРегл
+
+&НаКлиенте
+&ИзменениеИКонтроль("КоличествоПриИзменении")
+Процедура РК_КоличествоПриИзменении()
+
+ ТекущаяСтрока = Элементы[ИмяТекущейТаблицыФормы].ТекущиеДанные;
+ #Вставка
+ // --- РК ---
+ КоэффициентСуммыРегл = КоэффициентПересчетаИзВалютыУпрВРегл;
+ Если Объект.РК_НеПересчитыватьСуммуРеглПоКурсу Тогда
+ КоэффициентСуммыРегл = РК_КоэффициентСуммыРеглСтроки(ТекущаяСтрока, КоэффициентПересчетаИзВалютыУпрВРегл);
+ КонецЕсли;
+ // ---
+ #КонецВставки
+
+ СтруктураДействий = Новый Структура;
+ СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц", ПараметрыПересчетаКоличестваЕдиниц(Объект.ХозяйственнаяОперация));
+ СтруктураДействий.Вставить("ПересчитатьСумму");
+ СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект);
+ СтруктураПересчетаСуммы.НалогообложениеНДС = ПредопределенноеЗначение("Перечисление.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС");
+
+ СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
+ СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
+
+ Если ЭтоОстаткиСобственныхТоваров
+ Или ЭтоОстаткиПринятойТары
+ Или ЭтоОстаткиПереданнойТары
+ Или ЭтоОстаткиПереданныхПереработчикамТоваров2_5
+ Или ЭтоОстаткиПринятыхНаКомиссиюТоваров
+ Или ЭтоОстаткиПринятыхНаХранениеТоваров
+ Или ЭтоОстаткиПереданныхНаКомиссиюТоваров
+ Или ЭтоОстаткиПереданныхНаКомиссиюТоваров2_5
+ Или ЭтоОстаткиПереданныхНаХранениеТоваров
+ Или ЭтоОстаткиПереданныхВПроизводствоТоваров
+ Или ЭтоОстаткиОтгруженныхТоваров Тогда
+ УчетПрослеживаемыхТоваровКлиентСерверЛокализация.ДополнитьОписаниеНастроекПересчетаРеквизитовТабличнойЧасти(
+ Объект,
+ СтруктураДействий);
+ КонецЕсли;
+
+ ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
+
+ СтруктураДействий = Новый Структура;
+ Если Не Объект.ЦенаВключаетНДС Тогда
+ ТекущаяСтрока.СуммаБезНДС = ТекущаяСтрока.Сумма;
+ Иначе
+ СтруктураДействий.Вставить("ПересчитатьСуммуБезНДС", СтруктураПересчетаСуммы);
+ КонецЕсли;
+
+ #Удаление
+ СтруктураДействий.Вставить("ПересчитатьСуммуРегл", КоэффициентПересчетаИзВалютыУпрВРегл);
+ #КонецУдаления
+ #Вставка
+ // --- РК ---
+ СтруктураДействий.Вставить("ПересчитатьСуммуРегл", КоэффициентСуммыРегл);
+ // ---
+ #КонецВставки
+
+
+ Если НЕ (ЭтоОстаткиПринятойТары
+ Или ЭтоОстаткиПереданнойТары) Тогда
+ СтруктураДействий.Вставить("ПересчитатьНДСРегл", СтруктураПересчетаСуммы);
+ КонецЕсли;
+
+ ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
+
+КонецПроцедуры
+
+&НаСервере
+&ИзменениеИКонтроль("ДатаПриИзмененииСервер")
+Процедура РК_ДатаПриИзмененииСервер()
+ #Вставка
+ // --- РК ---
+ СнимокСуммРегл = Неопределено;
+ Если Объект.РК_НеПересчитыватьСуммуРеглПоКурсу Тогда
+ СнимокСуммРегл = РК_СнимокСуммРегл();
+ КонецЕсли;
+ // ---
+ #КонецВставки
+
+ КоэффициентПересчетаИзВалютыУпрВРегл = КоэффициентПересчета(ВалютаУправленческогоУчета, ВалютаРегламентированногоУчета, Объект.Дата);
+ ИспользоватьУчетПрослеживаемыхИмпортныхТоваров = УчетПрослеживаемыхТоваровЛокализация.ИспользоватьУчетПрослеживаемыхИмпортныхТоваров(
+ Объект.Дата);
+
+ ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.ВводОстатковТоваров));
+ НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект,ПараметрыУказанияСерий);
+
+ УстановитьВидимость();
+ Документы.ВводОстатковТоваров.ЗаполнитьВидДеятельностиНДС(Объект, ЭтотОбъект, Истина);
+ ЗаполнитьНалогообложениеНДС();
+ НалогообложениеНДСПриИзмененииСервер();
+ ПолучитьМетодОценкиСтоимостиТоваров();
+ УстановитьВидимостьКоличестваРНПТ();
+
+ Если Не Элементы.СобственныеТоварыГруппаКоличествоПоРНПТ.Видимость
+ Или Не Элементы.ПолученныеНаКомиссиюГруппаКоличествоПоРНПТ.Видимость
+ Или Не Элементы.ПолученныеНаХранениеГруппаКоличествоПоРНПТ.Видимость
+ Или Не Элементы.ПереданныеНаКомиссиюГруппаКоличествоПоРНПТ.Видимость
+ Или Не Элементы.ПереданныеНаКомиссию25ГруппаКоличествоПоРНПТ.Видимость
+ Или Не Элементы.ПереданныеНаХранениеГруппаКоличествоПоРНПТ.Видимость Тогда
+
+ ПересчитатьКоличествоРНПТ();
+
+ КонецЕсли;
+ //++ Локализация
+
+
+ //-- Локализация
+
+ УчетПодакцизныхТоваров.ОбновитьЭлементыУчетаПодакцизныхТоваров(ЭтотОбъект);
+
+ #Вставка
+ // --- РК ---
+ Если СнимокСуммРегл <> Неопределено Тогда
+ РК_ВосстановитьСуммыРегл(СнимокСуммРегл);
+ КонецЕсли;
+ // ---
+ #КонецВставки
+КонецПроцедуры
+
+&НаКлиенте
+Функция РК_КоэффициентСуммыРеглСтроки(СтрокаТовара, КоэффициентДаты)
+
+ Если СтрокаТовара.СуммаБезНДС = 0 Или СтрокаТовара.СуммаРегл = 0 Тогда
+ Возврат КоэффициентДаты;
+ КонецЕсли;
+
+ Возврат СтрокаТовара.СуммаРегл / СтрокаТовара.СуммаБезНДС;
+
+КонецФункции
+
+&НаСервере
+Функция РК_СнимокСуммРегл()
+
+ Снимок = Новый Массив;
+ Для Каждого СтрокаТовара Из Объект.Товары Цикл
+ Снимок.Добавить(Новый Структура(
+ "НомерСтроки, СуммаРегл, НДСРегл",
+ СтрокаТовара.НомерСтроки,
+ СтрокаТовара.СуммаРегл,
+ СтрокаТовара.НДСРегл));
+ КонецЦикла;
+ Возврат Снимок;
+
+КонецФункции
+
+&НаСервере
+Процедура РК_ВосстановитьСуммыРегл(Снимок)
+
+ Для Каждого Элемент Из Снимок Цикл
+ Если Элемент.НомерСтроки < 1 Или Элемент.НомерСтроки > Объект.Товары.Количество() Тогда
+ Продолжить;
+ КонецЕсли;
+ СтрокаТовара = Объект.Товары[Элемент.НомерСтроки - 1];
+ СтрокаТовара.СуммаРегл = Элемент.СуммаРегл;
+ СтрокаТовара.НДСРегл = Элемент.НДСРегл;
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти