РК_ПроверкаСерий 1.3.1.75: остатки, № строки, заполнение по предложениям.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-08-17 12:53:12 +03:00
parent 666688e4d2
commit 64b026e9d8
7 changed files with 309 additions and 27 deletions
@@ -589,6 +589,74 @@
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="f14e0031-0031-4000-8000-000000000031">
<Properties>
<Name>НомерСтроки</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>№</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type><v8:Type>xs:decimal</v8:Type><v8:NumberQualifiers><v8:Digits>10</v8:Digits><v8:FractionDigits>0</v8:FractionDigits><v8:AllowedSign>Nonnegative</v8:AllowedSign></v8:NumberQualifiers></Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="f14e0032-0032-4000-8000-000000000032">
<Properties>
<Name>Остаток</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Остаток</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type><v8:Type>xs:decimal</v8:Type><v8:NumberQualifiers><v8:Digits>15</v8:Digits><v8:FractionDigits>3</v8:FractionDigits><v8:AllowedSign>Any</v8:AllowedSign></v8:NumberQualifiers></Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
</ChildObjects>
</TabularSection>
<TabularSection uuid="f14e0020-0020-4000-8000-000000000020">
@@ -97,6 +97,11 @@
<CommandName>Form.Command.ИсправитьОтмеченные</CommandName>
<ExtendedTooltip name="ПроблемныеСерииИсправитьОтмеченныеРасширеннаяПодсказка" id="4"/>
</Button>
<Button name="ПроблемныеСерииЗаполнитьПоПредложениям" id="160">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.ЗаполнитьПоПредложениям</CommandName>
<ExtendedTooltip name="ПроблемныеСерииЗаполнитьПоПредложениямРасширеннаяПодсказка" id="161"/>
</Button>
<Button name="ПроблемныеСерииОтметить" id="17">
<Type>CommandBarButton</Type>
<CommandName>Form.Command.Отметить</CommandName>
@@ -142,6 +147,14 @@
<ContextMenu name="ПроблемныеСерииОтметкаКонтекстноеМеню" id="32"/>
<ExtendedTooltip name="ПроблемныеСерииОтметкаРасширеннаяПодсказка" id="33"/>
</CheckBoxField>
<LabelField name="ПроблемныеСерииНомерСтроки" id="162">
<DataPath>Объект.ПроблемныеСерии.НомерСтроки</DataPath>
<ReadOnly>true</ReadOnly>
<EditMode>EnterOnInput</EditMode>
<Width>4</Width>
<ContextMenu name="ПроблемныеСерииНомерСтрокиКонтекстноеМеню" id="163"/>
<ExtendedTooltip name="ПроблемныеСерииНомерСтрокиРасширеннаяПодсказка" id="164"/>
</LabelField>
<InputField name="ПроблемныеСерииСерия" id="34">
<DataPath>Объект.ПроблемныеСерии.Серия</DataPath>
<ReadOnly>true</ReadOnly>
@@ -150,6 +163,14 @@
<ContextMenu name="ПроблемныеСерииСерияКонтекстноеМеню" id="35"/>
<ExtendedTooltip name="ПроблемныеСерииСерияРасширеннаяПодсказка" id="36"/>
</InputField>
<InputField name="ПроблемныеСерииОстаток" id="165">
<DataPath>Объект.ПроблемныеСерии.Остаток</DataPath>
<ReadOnly>true</ReadOnly>
<EditMode>EnterOnInput</EditMode>
<Width>8</Width>
<ContextMenu name="ПроблемныеСерииОстатокКонтекстноеМеню" id="166"/>
<ExtendedTooltip name="ПроблемныеСерииОстатокРасширеннаяПодсказка" id="167"/>
</InputField>
<InputField name="ПроблемныеСерииПроблема" id="37">
<DataPath>Объект.ПроблемныеСерии.Проблема</DataPath>
<ReadOnly>true</ReadOnly>
@@ -495,7 +516,7 @@
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Записать предложенные значения в отмеченные серии</v8:content>
<v8:content>Записать значения из таблицы в справочник серий</v8:content>
</v8:item>
</ToolTip>
<Picture>
@@ -504,6 +525,25 @@
</Picture>
<Action>ИсправитьОтмеченные</Action>
</Command>
<Command name="ЗаполнитьПоПредложениям" id="157">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Заполнить по предложениям</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Для отмеченных строк перенести предложенные номер, срок и наименование в колонки таблицы (без записи в базу)</v8:content>
</v8:item>
</ToolTip>
<Picture>
<xr:Ref>StdPicture.InputFieldOpen</xr:Ref>
<xr:LoadTransparent>true</xr:LoadTransparent>
</Picture>
<Action>ЗаполнитьПоПредложениям</Action>
</Command>
<Command name="Отметить" id="3">
<Title>
<v8:item>
@@ -83,6 +83,31 @@
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПоПредложениям(Команда)
Если Объект.ПроблемныеСерии.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Сначала выполните поиск проблем");
Возврат;
КонецЕсли;
Если Не ЕстьОтмеченныеСтроки() Тогда
ПоказатьПредупреждение(, "Отметьте строки для заполнения");
Возврат;
КонецЕсли;
Попытка
Количество = ЗаполнитьПоПредложениямНаСервере();
Исключение
СообщитьОшибкуОперации(ИнформацияОбОшибке(), "Заполнить по предложениям");
Возврат;
КонецПопытки;
ОчиститьТекстПоследнейОшибки();
ПоказатьОповещениеПользователя("Проверка серий", ,
"Заполнено полей в строках: " + Формат(Количество, "ЧН=0; ЧГ=0"));
КонецПроцедуры
&НаКлиенте
Процедура Отметить(Команда)
УстановитьОтметкуВыделенныхСтрок("ПроблемныеСерии", Истина);
@@ -274,8 +299,24 @@
| )";
Выборка = Запрос.Выполнить().Выбрать();
СтрокиДанных = Новый Массив;
Серии = Новый Массив;
Пока Выборка.Следующий() Цикл
ДобавитьСтрокуПроблемы(Выборка, КэшНастроек);
ДанныеСтроки = ПодготовитьДанныеСтрокиПроблемы(Выборка, КэшНастроек);
Если ДанныеСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокиДанных.Добавить(ДанныеСтроки);
Серии.Добавить(ДанныеСтроки.Серия);
КонецЦикла;
Остатки = ОстаткиПоСериям(Серии);
НомерСтроки = 0;
Для Каждого ДанныеСтроки Из СтрокиДанных Цикл
НомерСтроки = НомерСтроки + 1;
ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, Остатки);
КонецЦикла;
Возврат Объект.ПроблемныеСерии.Количество();
@@ -283,7 +324,7 @@
КонецФункции
&НаСервере
Процедура ДобавитьСтрокуПроблемы(Выборка, КэшНастроек)
Функция ПодготовитьДанныеСтрокиПроблемы(Выборка, КэшНастроек)
Настройки = НастройкиСерийВида(Выборка.ВидНоменклатуры, КэшНастроек);
ИспНомер = Настройки.ИспользоватьНомерСерии;
@@ -317,21 +358,112 @@
КонецЕсли;
Если Проблемы.Количество() = 0 Тогда
Возврат;
Возврат Неопределено;
КонецЕсли;
Данные = Новый Структура;
Данные.Вставить("Серия", Выборка.Серия);
Данные.Вставить("ВидНоменклатуры", Выборка.ВидНоменклатуры);
Данные.Вставить("Наименование", Выборка.Наименование);
Данные.Вставить("Номер", Выборка.Номер);
Данные.Вставить("ГоденДо", Выборка.ГоденДо);
Данные.Вставить("Проблема", СтрСоединить(Проблемы, "; "));
Данные.Вставить("ПредложенныйНомер", ПредложенныйНомер);
Данные.Вставить("ПредложенныйГоденДо", ПредложенныйГоденДо);
Данные.Вставить("ПредложенноеНаименование", ПредложенноеНаименование);
Возврат Данные;
КонецФункции
&НаСервере
Процедура ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, Остатки)
НовСтр = Объект.ПроблемныеСерии.Добавить();
НовСтр.Отметка = Истина;
НовСтр.Серия = Выборка.Серия;
НовСтр.НомерСтроки = НомерСтроки;
НовСтр.Серия = ДанныеСтроки.Серия;
НовСтр.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
НовСтр.ВидНоменклатуры = Выборка.ВидНоменклатуры;
НовСтр.Наименование = Выборка.Наименование;
НовСтр.Номер = Выборка.Номер;
НовСтр.ГоденДо = Выборка.ГоденДо;
НовСтр.Проблема = СтрСоединить(Проблемы, "; ");
НовСтр.ПредложенныйНомер = ПредложенныйНомер;
НовСтр.ПредложенныйГоденДо = ПредложенныйГоденДо;
НовСтр.ПредложенноеНаименование = ПредложенноеНаименование;
НовСтр.ВидНоменклатуры = ДанныеСтроки.ВидНоменклатуры;
НовСтр.Наименование = ДанныеСтроки.Наименование;
НовСтр.Номер = ДанныеСтроки.Номер;
НовСтр.ГоденДо = ДанныеСтроки.ГоденДо;
НовСтр.Проблема = ДанныеСтроки.Проблема;
НовСтр.ПредложенныйНомер = ДанныеСтроки.ПредложенныйНомер;
НовСтр.ПредложенныйГоденДо = ДанныеСтроки.ПредложенныйГоденДо;
НовСтр.ПредложенноеНаименование = ДанныеСтроки.ПредложенноеНаименование;
НовСтр.Остаток = ОстатокСерииИзСоответствия(Остатки, ДанныеСтроки.Серия);
КонецПроцедуры
&НаСервере
Функция ЗаполнитьПоПредложениямНаСервере()
КэшНастроек = Новый Соответствие;
Заполнено = 0;
Для Каждого Стр Из Объект.ПроблемныеСерии Цикл
Если Не Стр.Отметка Или Стр.Исправлено Тогда
Продолжить;
КонецЕсли;
ПересчитатьПредложенияСтрокиПроблемы(Стр, КэшНастроек);
ИзмененийВСтроке = 0;
Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер))
И Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Тогда
Стр.Номер = СокрЛП(Стр.ПредложенныйНомер);
ИзмененийВСтроке = ИзмененийВСтроке + 1;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустой срок годности") > 0
И СрокГодностиЗаполнен(Стр.ПредложенныйГоденДо)
И Не СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
Стр.ГоденДо = Стр.ПредложенныйГоденДо;
ИзмененийВСтроке = ИзмененийВСтроке + 1;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенноеНаименование))
И Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование)) Тогда
Стр.Наименование = СокрЛП(Стр.ПредложенноеНаименование);
ИзмененийВСтроке = ИзмененийВСтроке + 1;
КонецЕсли;
Если ИзмененийВСтроке > 0 Тогда
Заполнено = Заполнено + 1;
КонецЕсли;
КонецЦикла;
Возврат Заполнено;
КонецФункции
&НаСервере
Процедура ПересчитатьПредложенияСтрокиПроблемы(Стр, КэшНастроек)
Настройки = НастройкиСерийВида(Стр.ВидНоменклатуры, КэшНастроек);
ИспНомер = Настройки.ИспользоватьНомерСерии;
ИспСрок = Настройки.ИспользоватьСрокГодностиСерии;
ТекстНаименования = Стр.Наименование;
Если ИспНомер И СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
Стр.ПредложенныйНомер = ИзвлечьНомерИзНаименования(ТекстНаименования);
КонецЕсли;
Если ИспСрок И СтрНайти(Стр.Проблема, "Пустой срок годности") > 0 Тогда
Стр.ПредложенныйГоденДо = ИзвлечьГоденДоИзНаименования(ТекстНаименования);
Если Не СрокГодностиЗаполнен(Стр.ПредложенныйГоденДо) Тогда
Стр.ПредложенныйГоденДо = '00010101';
КонецЕсли;
КонецЕсли;
Если Не ИспНомер И СтрНайти(Стр.Проблема, "Пустое наименование") > 0
И СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
Стр.ПредложенноеНаименование = "до " + Формат(Стр.ГоденДо, "ДФ=dd.MM.yy");
КонецЕсли;
КонецПроцедуры
@@ -348,22 +480,22 @@
Стр.Комментарий = "";
ЕстьИзменения = Ложь;
НомерЗаписи = НомерДляИсправленияСтроки(Стр);
ГоденДоЗаписи = ГоденДоДляИсправленияСтроки(Стр);
НаименованиеЗаписи = НаименованиеДляИсправленияСтроки(Стр);
Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер))
И Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Тогда
И ЗначениеЗаполнено(НомерЗаписи) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустой срок годности") > 0
И СрокГодностиЗаполнен(Стр.ПредложенныйГоденДо)
И Не СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
И СрокГодностиЗаполнен(ГоденДоЗаписи) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенноеНаименование))
И Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование)) Тогда
И ЗначениеЗаполнено(НаименованиеЗаписи) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
@@ -379,16 +511,16 @@
Иначе
ОбСерии = Стр.Серия.ПолучитьОбъект();
Если СтрНайти(Стр.Проблема, "Пустой номер") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенныйНомер)) Тогда
ОбСерии.Номер = СокрЛП(Стр.ПредложенныйНомер);
И ЗначениеЗаполнено(НомерЗаписи) Тогда
ОбСерии.Номер = НомерЗаписи;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустой срок годности") > 0
И СрокГодностиЗаполнен(Стр.ПредложенныйГоденДо) Тогда
ОбСерии.ГоденДо = Стр.ПредложенныйГоденДо;
И СрокГодностиЗаполнен(ГоденДоЗаписи) Тогда
ОбСерии.ГоденДо = ГоденДоЗаписи;
КонецЕсли;
Если СтрНайти(Стр.Проблема, "Пустое наименование") > 0
И ЗначениеЗаполнено(СокрЛП(Стр.ПредложенноеНаименование)) Тогда
ОбСерии.Наименование = СокрЛП(Стр.ПредложенноеНаименование);
И ЗначениеЗаполнено(НаименованиеЗаписи) Тогда
ОбСерии.Наименование = НаименованиеЗаписи;
КонецЕсли;
ОбСерии.Записать();
Стр.Исправлено = Истина;
@@ -408,6 +540,38 @@
КонецФункции
&НаСервере
Функция НомерДляИсправленияСтроки(Стр)
Номер = СокрЛП(Стр.Номер);
Если ЗначениеЗаполнено(Номер) Тогда
Возврат Номер;
КонецЕсли;
Возврат СокрЛП(Стр.ПредложенныйНомер);
КонецФункции
&НаСервере
Функция ГоденДоДляИсправленияСтроки(Стр)
Если СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
Возврат Стр.ГоденДо;
КонецЕсли;
Возврат Стр.ПредложенныйГоденДо;
КонецФункции
&НаСервере
Функция НаименованиеДляИсправленияСтроки(Стр)
Наименование = СокрЛП(Стр.Наименование);
Если ЗначениеЗаполнено(Наименование) Тогда
Возврат Наименование;
КонецЕсли;
Возврат СокрЛП(Стр.ПредложенноеНаименование);
КонецФункции
&НаСервере
Функция НастройкиСерийВида(ВидНоменклатуры, КэшНастроек)