From 87e9c891d0ed6212434d1a4246b2fab2b259249d Mon Sep 17 00:00:00 2001 From: mihailkudravcev Date: Tue, 18 Aug 2026 17:00:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=9A=5F=D0=9F=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=D0=A1=D0=B5=D1=80=D0=B8=D0=B9=201.3.1.83:=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20a-YYMM?= =?UTF-8?q?DD=20=D0=B8=D0=B7=20=D1=81=D1=80=D0=BE=D0=BA=D0=B0=20=D0=B3?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20(#17).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 ++ VERSION | 2 +- src/Configuration.xml | 2 +- .../Forms/Форма/Ext/Form/Module.bsl | 133 ++++++++++++++---- 4 files changed, 113 insertions(+), 32 deletions(-) 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"); + +КонецФункции + &НаСервере Функция ИзвлечьНомерИзНаименования(ТекстНаименования)