diff --git a/CHANGELOG.md b/CHANGELOG.md
index f99add8..18bb895 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,14 @@
---
+## 1.3.1.83 (2026-08-18)
+
+### РК_ПроверкаСерий — автономер из срока годности (#17)
+
+- Для «Пустой номер» (номер обязателен по политике вида): если из наименования не извлекли — номер `a-YYMMDD` из срока (фактического или предложенного).
+- Пример: срок 01.02.2027 → номер `a-270201`, наименование `a-270201 до 01.02.2027` (если наименование пустое).
+- Префикс `a-` — автоматически сгенерированный номер для исправления серии.
+
## 1.3.1.82 (2026-08-18)
### РК_ПроверкаСерий — сохранение срока годности по умолчанию
diff --git a/VERSION b/VERSION
index fce0f6e..fa1c522 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.1.82
+1.3.1.83
diff --git a/src/Configuration.xml b/src/Configuration.xml
index d08abd3..2937fff 100644
--- a/src/Configuration.xml
+++ b/src/Configuration.xml
@@ -62,7 +62,7 @@
Role.РК_ОсновнаяРоль
- 1.3.1.82
+ 1.3.1.83
Language.Русский
diff --git a/src/DataProcessors/РК_ПроверкаСерий/Forms/Форма/Ext/Form/Module.bsl b/src/DataProcessors/РК_ПроверкаСерий/Forms/Форма/Ext/Form/Module.bsl
index 5c18dc9..1e3a450 100644
--- a/src/DataProcessors/РК_ПроверкаСерий/Forms/Форма/Ext/Form/Module.bsl
+++ b/src/DataProcessors/РК_ПроверкаСерий/Forms/Форма/Ext/Form/Module.bsl
@@ -1,5 +1,5 @@
-// Проверка и исправление данных Справочник.СерииНоменклатуры (#14, #15).
-// Заполнение номера/срока — из наименования (не нумератор).
+// Проверка и исправление данных Справочник.СерииНоменклатуры (#14, #15, #17).
+// Заполнение номера — из наименования; при пустом номере и наличии срока — a-YYMMDD (#17).
// Дубли: вид + номер + ГоденДо (ДатаПроизводства в ключ не входит).
#Область ОбработчикиСобытийФормы
@@ -434,16 +434,21 @@
ПредложенныйГоденДо = '00010101';
ПредложенноеНаименование = "";
- Если ИспНомер И ПустойНомер Тогда
- ПредложенныйНомер = ИзвлечьНомерИзНаименования(Выборка.Наименование);
- Проблемы.Добавить("Пустой номер");
- КонецЕсли;
-
Если ИспСрок И ПустойСрок Тогда
ПредложенныйГоденДо = ПредложенныйГоденДоПоСтроке(Выборка.Наименование);
Проблемы.Добавить("Пустой срок годности");
КонецЕсли;
+ Если ИспНомер И ПустойНомер Тогда
+ ПредложенияНомера = ПредложенияПоНомеруИзСрока(
+ Выборка.Наименование, Выборка.ГоденДо, ПредложенныйГоденДо);
+ ПредложенныйНомер = ПредложенияНомера.Номер;
+ Если ПустоеИмя И ЗначениеЗаполнено(ПредложенияНомера.Наименование) Тогда
+ ПредложенноеНаименование = ПредложенияНомера.Наименование;
+ КонецЕсли;
+ Проблемы.Добавить("Пустой номер");
+ КонецЕсли;
+
Если Не ИспНомер И ПустоеИмя И СрокГодностиЗаполнен(Выборка.ГоденДо) Тогда
ПредложенноеНаименование = "до " + Формат(Выборка.ГоденДо, "ДФ=dd.MM.yy");
Проблемы.Добавить("Пустое наименование");
@@ -504,13 +509,6 @@
ПересчитатьПредложенияСтрокиПроблемы(Стр, КэшНастроек);
ИзмененийВСтроке = 0;
- Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
- И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер))
- И Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Тогда
- Стр.Номер = СокрЛП(Стр.ПредложенныйНомер);
- ИзмененийВСтроке = ИзмененийВСтроке + 1;
- КонецЕсли;
-
Если СтрНайти(Стр.Проблема, "Пустой срок годности") > 0
И СрокГодностиЗаполнен(Стр.ПредложенныйГоденДо)
И Не СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
@@ -518,8 +516,28 @@
ИзмененийВСтроке = ИзмененийВСтроке + 1;
КонецЕсли;
- Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
- И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенноеНаименование))
+ Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
+ И Не ЗначениеЗаполнено(СокрЛП(Стр.Номер))
+ И Не ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер)) Тогда
+ ПредложенияНомера = ПредложенияПоНомеруИзСрока(
+ Стр.Наименование, Стр.ГоденДо, Стр.ПредложенныйГоденДо);
+ Если ЗначениеЗаполнено(ПредложенияНомера.Номер) Тогда
+ Стр.ПредложенныйНомер = ПредложенияНомера.Номер;
+ Если Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование))
+ И ЗначениеЗаполнено(ПредложенияНомера.Наименование) Тогда
+ Стр.ПредложенноеНаименование = ПредложенияНомера.Наименование;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
+ И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер))
+ И Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Тогда
+ Стр.Номер = СокрЛП(Стр.ПредложенныйНомер);
+ ИзмененийВСтроке = ИзмененийВСтроке + 1;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(СокрЛП(Стр.ПредложенноеНаименование))
И Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование)) Тогда
Стр.Наименование = СокрЛП(Стр.ПредложенноеНаименование);
ИзмененийВСтроке = ИзмененийВСтроке + 1;
@@ -568,14 +586,6 @@
Настройки = НастройкиСерийВида(Стр.ВидНоменклатуры, КэшНастроек);
ТекстНаименования = Стр.Наименование;
- Если Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Или СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
- ПредложенныйНомер = ИзвлечьНомерИзНаименования(ТекстНаименования);
- Если ЗначениеЗаполнено(ПредложенныйНомер) Тогда
- Стр.ПредложенныйНомер = ПредложенныйНомер;
- Результат.Номеров = Результат.Номеров + 1;
- КонецЕсли;
- КонецЕсли;
-
Если Не СрокГодностиЗаполнен(Стр.ГоденДо) Или СтрНайти(Стр.Проблема, "Пустой срок годности") > 0 Тогда
ПодставлятьУмолчание = СтрНайти(Стр.Проблема, "Пустой срок годности") > 0;
ПредложенныйГоденДо = ПредложенныйГоденДоПоСтроке(ТекстНаименования, ПодставлятьУмолчание);
@@ -585,6 +595,20 @@
КонецЕсли;
КонецЕсли;
+ Если Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Или СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
+ ПредложенияНомера = ПредложенияПоНомеруИзСрока(
+ ТекстНаименования, Стр.ГоденДо, Стр.ПредложенныйГоденДо);
+ Если ЗначениеЗаполнено(ПредложенияНомера.Номер) Тогда
+ Стр.ПредложенныйНомер = ПредложенияНомера.Номер;
+ Результат.Номеров = Результат.Номеров + 1;
+ Если Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование))
+ И ЗначениеЗаполнено(ПредложенияНомера.Наименование) Тогда
+ Стр.ПредложенноеНаименование = ПредложенияНомера.Наименование;
+ Результат.Наименований = Результат.Наименований + 1;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
Если (Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование)) Или СтрНайти(Стр.Проблема, "Пустое наименование") > 0)
И Не Настройки.ИспользоватьНомерСерии
И СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
@@ -616,14 +640,20 @@
ИспСрок = Настройки.ИспользоватьСрокГодностиСерии;
ТекстНаименования = Стр.Наименование;
- Если ИспНомер И СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
- Стр.ПредложенныйНомер = ИзвлечьНомерИзНаименования(ТекстНаименования);
- КонецЕсли;
-
Если ИспСрок И СтрНайти(Стр.Проблема, "Пустой срок годности") > 0 Тогда
Стр.ПредложенныйГоденДо = ПредложенныйГоденДоПоСтроке(ТекстНаименования);
КонецЕсли;
+ Если ИспНомер И СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
+ ПредложенияНомера = ПредложенияПоНомеруИзСрока(
+ ТекстНаименования, Стр.ГоденДо, Стр.ПредложенныйГоденДо);
+ Стр.ПредложенныйНомер = ПредложенияНомера.Номер;
+ Если Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование))
+ И ЗначениеЗаполнено(ПредложенияНомера.Наименование) Тогда
+ Стр.ПредложенноеНаименование = ПредложенияНомера.Наименование;
+ КонецЕсли;
+ КонецЕсли;
+
Если Не ИспНомер И СтрНайти(Стр.Проблема, "Пустое наименование") > 0
И СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
Стр.ПредложенноеНаименование = "до " + Формат(Стр.ГоденДо, "ДФ=dd.MM.yy");
@@ -658,7 +688,9 @@
ЕстьИзменения = Истина;
КонецЕсли;
- Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
+ Если (СтрНайти(Стр.Проблема, "Пустое наименование") > 0
+ Или (СтрНайти(Стр.Проблема, "Пустой номер") > 0
+ И Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование))))
И ЗначениеЗаполнено(НаименованиеЗаписи) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
@@ -682,7 +714,9 @@
И СрокГодностиЗаполнен(ГоденДоЗаписи) Тогда
ОбСерии.ГоденДо = ГоденДоЗаписи;
КонецЕсли;
- Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
+ Если (СтрНайти(Стр.Проблема, "Пустое наименование") > 0
+ Или (СтрНайти(Стр.Проблема, "Пустой номер") > 0
+ И Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование))))
И ЗначениеЗаполнено(НаименованиеЗаписи) Тогда
ОбСерии.Наименование = НаименованиеЗаписи;
КонецЕсли;
@@ -783,6 +817,45 @@
КонецФункции
+&НаСервере
+Функция ПредложенияПоНомеруИзСрока(ТекстНаименования, ГоденДо, ПредложенныйГоденДо = '00010101')
+
+ Результат = Новый Структура("Номер, Наименование", "", "");
+
+ Номер = ИзвлечьНомерИзНаименования(ТекстНаименования);
+ Если ЗначениеЗаполнено(Номер) Тогда
+ Результат.Номер = Номер;
+ Возврат Результат;
+ КонецЕсли;
+
+ ГоденДоДляНомера = ГоденДо;
+ Если Не СрокГодностиЗаполнен(ГоденДоДляНомера) Тогда
+ ГоденДоДляНомера = ПредложенныйГоденДо;
+ КонецЕсли;
+
+ Если СрокГодностиЗаполнен(ГоденДоДляНомера) Тогда
+ Результат.Номер = АвтоНомерСерииИзСрока(ГоденДоДляНомера);
+ Результат.Наименование = НаименованиеСерииПоНомеруИСроку(Результат.Номер, ГоденДоДляНомера);
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+&НаСервере
+Функция АвтоНомерСерииИзСрока(ГоденДо)
+
+ Возврат "a-" + Формат(ГоденДо, "ДФ=yyMMdd");
+
+КонецФункции
+
+&НаСервере
+Функция НаименованиеСерииПоНомеруИСроку(Номер, ГоденДо)
+
+ Возврат СокрЛП(Номер) + " до " + Формат(ГоденДо, "ДФ=dd.MM.yyyy");
+
+КонецФункции
+
&НаСервере
Функция ИзвлечьНомерИзНаименования(ТекстНаименования)