РК_ПроверкаСерий 1.3.1.78: отбор, сортировка и генерация предложений.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,6 +4,15 @@
|
||||
|
||||
---
|
||||
|
||||
## 1.3.1.78 (2026-08-17)
|
||||
|
||||
### РК_ПроверкаСерий — анализ таблицы проблем
|
||||
|
||||
- Отбор **Только с остатком**, поиск по строке в командной панели таблицы, сортировка по остатку и по текущей колонке.
|
||||
- Номенклатура заполняется из `ТоварыНаСкладах` (при отсутствии остатка — из `ДвиженияСерийТоваров`).
|
||||
- Кнопка **Сформировать предложения** — отдельная генерация предложенных номера/срока/наименования из наименования серии.
|
||||
- Разбор срока: не только шаблон «до …», но и дата в тексте (`dd.MM.yy`, `MM.yyyy`).
|
||||
|
||||
## 1.3.1.77 (2026-08-17)
|
||||
|
||||
### Исправление
|
||||
|
||||
@@ -218,6 +218,7 @@
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ПроблемныеСерии.Attribute.Комментарий" id="f14e001c-001c-4000-8000-00000000001c"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ПроблемныеСерии.Attribute.ПорядковыйНомер" id="f14e0031-0031-4000-8000-000000000031"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ПроблемныеСерии.Attribute.Остаток" id="f14e0032-0032-4000-8000-000000000032"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ПроблемныеСерии.Attribute.ЕстьОстаток" id="f14e0033-0033-4000-8000-000000000033"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ГруппыДублей" id="f14e0020-0020-4000-8000-000000000020"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ГруппыДублей.Attribute.Отметка" id="f14e0021-0021-4000-8000-000000000021"/>
|
||||
<Metadata name="DataProcessor.РК_ПроверкаСерий.TabularSection.ГруппыДублей.Attribute.ИдентификаторГруппы" id="f14e0022-0022-4000-8000-000000000022"/>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
|
||||
</DefaultRoles>
|
||||
<Vendor/>
|
||||
<Version>1.3.1.77</Version>
|
||||
<Version>1.3.1.78</Version>
|
||||
<DefaultStyle/>
|
||||
<DefaultLanguage>Language.Русский</DefaultLanguage>
|
||||
<BriefInformation/>
|
||||
|
||||
@@ -657,6 +657,42 @@
|
||||
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||
</Properties>
|
||||
</Attribute>
|
||||
<Attribute uuid="f14e0033-0033-4000-8000-000000000033">
|
||||
<Properties>
|
||||
<Name>ЕстьОстаток</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Есть остаток</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Type>
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
</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">
|
||||
|
||||
@@ -60,14 +60,27 @@
|
||||
</Title>
|
||||
<ExtendedTooltip name="СтраницаЗаполнениеРасширеннаяПодсказка" id="73"/>
|
||||
<ChildItems>
|
||||
<CheckBoxField name="ТолькоСОстатком" id="168">
|
||||
<DataPath>ТолькоСОстатком</DataPath>
|
||||
<TitleLocation>Right</TitleLocation>
|
||||
<CheckBoxType>Auto</CheckBoxType>
|
||||
<ContextMenu name="ТолькоСОстаткомКонтекстноеМеню" id="169"/>
|
||||
<ExtendedTooltip name="ТолькоСОстаткомРасширеннаяПодсказка" id="170"/>
|
||||
<Events>
|
||||
<Event name="OnChange">ТолькоСОстаткомПриИзменении</Event>
|
||||
</Events>
|
||||
</CheckBoxField>
|
||||
<Table name="ПроблемныеСерии" id="10">
|
||||
<Representation>List</Representation>
|
||||
<ChangeRowSet>false</ChangeRowSet>
|
||||
<ChangeRowOrder>false</ChangeRowOrder>
|
||||
<ChangeRowOrder>true</ChangeRowOrder>
|
||||
<AutoInsertNewRow>false</AutoInsertNewRow>
|
||||
<EnableStartDrag>false</EnableStartDrag>
|
||||
<EnableDrag>false</EnableDrag>
|
||||
<DataPath>Объект.ПроблемныеСерии</DataPath>
|
||||
<SearchStringLocation>CommandBar</SearchStringLocation>
|
||||
<ViewStatusLocation>None</ViewStatusLocation>
|
||||
<SearchControlLocation>CommandBar</SearchControlLocation>
|
||||
<RowFilter xsi:nil="true"/>
|
||||
<ContextMenu name="ПроблемныеСерииКонтекстноеМеню" id="11">
|
||||
<Autofill>false</Autofill>
|
||||
@@ -97,11 +110,26 @@
|
||||
<CommandName>Form.Command.ИсправитьОтмеченные</CommandName>
|
||||
<ExtendedTooltip name="ПроблемныеСерииИсправитьОтмеченныеРасширеннаяПодсказка" id="4"/>
|
||||
</Button>
|
||||
<Button name="ПроблемныеСерииСформироватьПредложения" id="171">
|
||||
<Type>CommandBarButton</Type>
|
||||
<CommandName>Form.Command.СформироватьПредложения</CommandName>
|
||||
<ExtendedTooltip name="ПроблемныеСерииСформироватьПредложенияРасширеннаяПодсказка" id="172"/>
|
||||
</Button>
|
||||
<Button name="ПроблемныеСерииЗаполнитьПоПредложениям" id="160">
|
||||
<Type>CommandBarButton</Type>
|
||||
<CommandName>Form.Command.ЗаполнитьПоПредложениям</CommandName>
|
||||
<ExtendedTooltip name="ПроблемныеСерииЗаполнитьПоПредложениямРасширеннаяПодсказка" id="161"/>
|
||||
</Button>
|
||||
<Button name="ПроблемныеСерииСортироватьПоОстатку" id="173">
|
||||
<Type>CommandBarButton</Type>
|
||||
<CommandName>Form.Command.СортироватьПоОстатку</CommandName>
|
||||
<ExtendedTooltip name="ПроблемныеСерииСортироватьПоОстаткуРасширеннаяПодсказка" id="174"/>
|
||||
</Button>
|
||||
<Button name="ПроблемныеСерииСортироватьПоКолонке" id="175">
|
||||
<Type>CommandBarButton</Type>
|
||||
<CommandName>Form.Command.СортироватьПоКолонке</CommandName>
|
||||
<ExtendedTooltip name="ПроблемныеСерииСортироватьПоКолонкеРасширеннаяПодсказка" id="176"/>
|
||||
</Button>
|
||||
<Button name="ПроблемныеСерииОтметить" id="17">
|
||||
<Type>CommandBarButton</Type>
|
||||
<CommandName>Form.Command.Отметить</CommandName>
|
||||
@@ -485,6 +513,17 @@
|
||||
</v8:StringQualifiers>
|
||||
</Type>
|
||||
</Attribute>
|
||||
<Attribute name="ТолькоСОстатком" id="3">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>Только с остатком</v8:content>
|
||||
</v8:item>
|
||||
</Title>
|
||||
<Type>
|
||||
<v8:Type>xs:boolean</v8:Type>
|
||||
</Type>
|
||||
</Attribute>
|
||||
</Attributes>
|
||||
<Commands>
|
||||
<Command name="НайтиПроблемы" id="1">
|
||||
@@ -525,7 +564,7 @@
|
||||
</Picture>
|
||||
<Action>ИсправитьОтмеченные</Action>
|
||||
</Command>
|
||||
<Command name="ЗаполнитьПоПредложениям" id="157">
|
||||
<Command name="ЗаполнитьПоПредложениям" id="180">
|
||||
<Title>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
@@ -544,6 +583,63 @@
|
||||
</Picture>
|
||||
<Action>ЗаполнитьПоПредложениям</Action>
|
||||
</Command>
|
||||
<Command name="СформироватьПредложения" id="181">
|
||||
<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.GenerateReport</xr:Ref>
|
||||
<xr:LoadTransparent>true</xr:LoadTransparent>
|
||||
</Picture>
|
||||
<Action>СформироватьПредложения</Action>
|
||||
</Command>
|
||||
<Command name="СортироватьПоОстатку" id="182">
|
||||
<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.SortListDesc</xr:Ref>
|
||||
<xr:LoadTransparent>true</xr:LoadTransparent>
|
||||
</Picture>
|
||||
<Action>СортироватьПоОстатку</Action>
|
||||
</Command>
|
||||
<Command name="СортироватьПоКолонке" id="183">
|
||||
<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.SortListAsc</xr:Ref>
|
||||
<xr:LoadTransparent>true</xr:LoadTransparent>
|
||||
</Picture>
|
||||
<Action>СортироватьПоКолонке</Action>
|
||||
</Command>
|
||||
<Command name="Отметить" id="3">
|
||||
<Title>
|
||||
<v8:item>
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
Возврат;
|
||||
КонецПопытки;
|
||||
ОчиститьТекстПоследнейОшибки();
|
||||
ПрименитьОтборПроблемныхСерий();
|
||||
ПоказатьОповещениеПользователя("Проверка серий", ,
|
||||
"Найдено проблем: " + Формат(Количество, "ЧН=0; ЧГ=0"));
|
||||
|
||||
@@ -108,6 +109,64 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура СформироватьПредложения(Команда)
|
||||
|
||||
Если Объект.ПроблемныеСерии.Количество() = 0 Тогда
|
||||
ПоказатьПредупреждение(, "Сначала выполните поиск проблем");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЕстьОтмеченныеСтроки() Тогда
|
||||
ПоказатьПредупреждение(, "Отметьте строки для формирования предложений");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Попытка
|
||||
Результат = СформироватьПредложенияНаСервере();
|
||||
Исключение
|
||||
СообщитьОшибкуОперации(ИнформацияОбОшибке(), "Сформировать предложения");
|
||||
Возврат;
|
||||
КонецПопытки;
|
||||
ОчиститьТекстПоследнейОшибки();
|
||||
ПоказатьОповещениеПользователя("Проверка серий", ,
|
||||
СтрШаблон("Предложений: номер %1, годен до %2, наименование %3, номенклатура %4",
|
||||
Формат(Результат.Номеров, "ЧН=0; ЧГ=0"),
|
||||
Формат(Результат.Сроков, "ЧН=0; ЧГ=0"),
|
||||
Формат(Результат.Наименований, "ЧН=0; ЧГ=0"),
|
||||
Формат(Результат.Номенклатуры, "ЧН=0; ЧГ=0")));
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура СортироватьПоОстатку(Команда)
|
||||
СортироватьПроблемныеСерииНаСервере("Остаток Убыв, ПорядковыйНомер");
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура СортироватьПоКолонке(Команда)
|
||||
|
||||
ТекущееПоле = Элементы.ПроблемныеСерии.ТекущийЭлемент;
|
||||
Если ТекущееПоле = Неопределено Тогда
|
||||
ПоказатьПредупреждение(, "Выберите колонку таблицы (щёлкните ячейку)");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ИмяКолонки = ИмяКолонкиСортировки(ТекущееПоле.Имя);
|
||||
Если Не ЗначениеЗаполнено(ИмяКолонки) Тогда
|
||||
ПоказатьПредупреждение(, "По этой колонке сортировка недоступна");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
СортироватьПроблемныеСерииНаСервере(ИмяКолонки + " Возр");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ТолькоСОстаткомПриИзменении(Элемент)
|
||||
ПрименитьОтборПроблемныхСерий();
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура Отметить(Команда)
|
||||
УстановитьОтметкуВыделенныхСтрок("ПроблемныеСерии", Истина);
|
||||
@@ -225,6 +284,40 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Процедура ПрименитьОтборПроблемныхСерий()
|
||||
|
||||
Если ТолькоСОстатком Тогда
|
||||
Элементы.ПроблемныеСерии.ОтборСтрок = Новый ФиксированнаяСтруктура("ЕстьОстаток", Истина);
|
||||
Иначе
|
||||
Элементы.ПроблемныеСерии.ОтборСтрок = Неопределено;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаКлиенте
|
||||
Функция ИмяКолонкиСортировки(ИмяПоляФормы)
|
||||
|
||||
СоответствиеИмен = Новый Соответствие;
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииОтметка", "Отметка");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииПорядковыйНомер", "ПорядковыйНомер");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииСерия", "Серия");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииОстаток", "Остаток");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииПроблема", "Проблема");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииНоменклатура", "Номенклатура");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииВидНоменклатуры", "ВидНоменклатуры");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииНаименование", "Наименование");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииНомер", "Номер");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииГоденДо", "ГоденДо");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииПредложенныйНомер", "ПредложенныйНомер");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииПредложенныйГоденДо", "ПредложенныйГоденДо");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииПредложенноеНаименование", "ПредложенноеНаименование");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииИсправлено", "Исправлено");
|
||||
СоответствиеИмен.Вставить("ПроблемныеСерииКомментарий", "Комментарий");
|
||||
Возврат СоответствиеИмен.Получить(ИмяПоляФормы);
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаКлиенте
|
||||
Функция ЕстьОтмеченныеСтроки()
|
||||
|
||||
@@ -311,14 +404,15 @@
|
||||
Серии.Добавить(ДанныеСтроки.Серия);
|
||||
КонецЦикла;
|
||||
|
||||
Остатки = ОстаткиПоСериям(Серии);
|
||||
ОстаткиИНоменклатура = СведенияОстатковПоСериям(Серии);
|
||||
НомерСтроки = 0;
|
||||
|
||||
Для Каждого ДанныеСтроки Из СтрокиДанных Цикл
|
||||
НомерСтроки = НомерСтроки + 1;
|
||||
ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, Остатки);
|
||||
ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, ОстаткиИНоменклатура);
|
||||
КонецЦикла;
|
||||
|
||||
Объект.ПроблемныеСерии.Сортировать("Остаток Убыв, ПорядковыйНомер");
|
||||
Возврат Объект.ПроблемныеСерии.Количество();
|
||||
|
||||
КонецФункции
|
||||
@@ -376,13 +470,14 @@
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Процедура ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, Остатки)
|
||||
Процедура ДобавитьСтрокуПроблемы(ДанныеСтроки, НомерСтроки, ОстаткиИНоменклатура)
|
||||
|
||||
НовСтр = Объект.ПроблемныеСерии.Добавить();
|
||||
НовСтр.Отметка = Истина;
|
||||
НовСтр.ПорядковыйНомер = НомерСтроки;
|
||||
НовСтр.Серия = ДанныеСтроки.Серия;
|
||||
НовСтр.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
|
||||
НовСтр.Номенклатура = НоменклатураСерииИзСоответствия(
|
||||
ОстаткиИНоменклатура.Номенклатура, ДанныеСтроки.Серия);
|
||||
НовСтр.ВидНоменклатуры = ДанныеСтроки.ВидНоменклатуры;
|
||||
НовСтр.Наименование = ДанныеСтроки.Наименование;
|
||||
НовСтр.Номер = ДанныеСтроки.Номер;
|
||||
@@ -391,7 +486,8 @@
|
||||
НовСтр.ПредложенныйНомер = ДанныеСтроки.ПредложенныйНомер;
|
||||
НовСтр.ПредложенныйГоденДо = ДанныеСтроки.ПредложенныйГоденДо;
|
||||
НовСтр.ПредложенноеНаименование = ДанныеСтроки.ПредложенноеНаименование;
|
||||
НовСтр.Остаток = ОстатокСерииИзСоответствия(Остатки, ДанныеСтроки.Серия);
|
||||
НовСтр.Остаток = ОстатокСерииИзСоответствия(ОстаткиИНоменклатура.Остатки, ДанныеСтроки.Серия);
|
||||
НовСтр.ЕстьОстаток = НовСтр.Остаток > 0.000001;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
@@ -441,6 +537,78 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Функция СформироватьПредложенияНаСервере()
|
||||
|
||||
Результат = Новый Структура("Номеров, Сроков, Наименований, Номенклатуры", 0, 0, 0, 0);
|
||||
КэшНастроек = Новый Соответствие;
|
||||
Серии = Новый Массив;
|
||||
Для Каждого Стр Из Объект.ПроблемныеСерии Цикл
|
||||
Если Стр.Отметка И Не Стр.Исправлено Тогда
|
||||
Серии.Добавить(Стр.Серия);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
ОстаткиИНоменклатура = СведенияОстатковПоСериям(Серии);
|
||||
|
||||
Для Каждого Стр Из Объект.ПроблемныеСерии Цикл
|
||||
|
||||
Если Не Стр.Отметка Или Стр.Исправлено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
ЗаполнитьПредложенияСтрокиПроблемы(Стр, КэшНастроек, ОстаткиИНоменклатура, Результат);
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Процедура ЗаполнитьПредложенияСтрокиПроблемы(Стр, КэшНастроек, ОстаткиИНоменклатура, Результат)
|
||||
|
||||
Настройки = НастройкиСерийВида(Стр.ВидНоменклатуры, КэшНастроек);
|
||||
ТекстНаименования = Стр.Наименование;
|
||||
|
||||
Если Не ЗначениеЗаполнено(СокрЛП(Стр.Номер)) Или СтрНайти(Стр.Проблема, "Пустой номер") > 0 Тогда
|
||||
ПредложенныйНомер = ИзвлечьНомерИзНаименования(ТекстНаименования);
|
||||
Если ЗначениеЗаполнено(ПредложенныйНомер) Тогда
|
||||
Стр.ПредложенныйНомер = ПредложенныйНомер;
|
||||
Результат.Номеров = Результат.Номеров + 1;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не СрокГодностиЗаполнен(Стр.ГоденДо) Или СтрНайти(Стр.Проблема, "Пустой срок годности") > 0 Тогда
|
||||
ПредложенныйГоденДо = ИзвлечьГоденДоИзНаименования(ТекстНаименования);
|
||||
Если СрокГодностиЗаполнен(ПредложенныйГоденДо) Тогда
|
||||
Стр.ПредложенныйГоденДо = ПредложенныйГоденДо;
|
||||
Результат.Сроков = Результат.Сроков + 1;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если (Не ЗначениеЗаполнено(СокрЛП(Стр.Наименование)) Или СтрНайти(Стр.Проблема, "Пустое наименование") > 0)
|
||||
И Не Настройки.ИспользоватьНомерСерии
|
||||
И СрокГодностиЗаполнен(Стр.ГоденДо) Тогда
|
||||
Стр.ПредложенноеНаименование = "до " + Формат(Стр.ГоденДо, "ДФ=dd.MM.yy");
|
||||
Результат.Наименований = Результат.Наименований + 1;
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Стр.Номенклатура) Тогда
|
||||
НоменклатураСерии = НоменклатураСерииИзСоответствия(
|
||||
ОстаткиИНоменклатура.Номенклатура, Стр.Серия);
|
||||
Если ЗначениеЗаполнено(НоменклатураСерии) Тогда
|
||||
Стр.Номенклатура = НоменклатураСерии;
|
||||
Результат.Номенклатуры = Результат.Номенклатуры + 1;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Если Стр.Остаток = 0 Тогда
|
||||
Стр.Остаток = ОстатокСерииИзСоответствия(ОстаткиИНоменклатура.Остатки, Стр.Серия);
|
||||
Стр.ЕстьОстаток = Стр.Остаток > 0.000001;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Процедура ПересчитатьПредложенияСтрокиПроблемы(Стр, КэшНастроек)
|
||||
|
||||
@@ -638,29 +806,77 @@
|
||||
|
||||
ПозДо = Найти(НРег(СтрокаТекста), "до ");
|
||||
Если ПозДо = 0 Тогда
|
||||
Возврат '00010101';
|
||||
ПозДо = Найти(НРег(СтрокаТекста), "до");
|
||||
Если ПозДо > 0 Тогда
|
||||
Фрагмент = СокрЛП(Сред(СтрокаТекста, ПозДо + 2));
|
||||
ДатаИзФрагмента = РазобратьДатуИзФрагмента(Фрагмент);
|
||||
Если СрокГодностиЗаполнен(ДатаИзФрагмента) Тогда
|
||||
Возврат ДатаИзФрагмента;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
Иначе
|
||||
Фрагмент = СокрЛП(Сред(СтрокаТекста, ПозДо + 3));
|
||||
ДатаИзФрагмента = РазобратьДатуИзФрагмента(Фрагмент);
|
||||
Если СрокГодностиЗаполнен(ДатаИзФрагмента) Тогда
|
||||
Возврат ДатаИзФрагмента;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Фрагмент = СокрЛП(Сред(СтрокаТекста, ПозДо + 3));
|
||||
Возврат РазобратьДатуИзФрагмента(Фрагмент);
|
||||
Возврат НайтиДатуВТексте(СтрокаТекста);
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Функция НайтиДатуВТексте(СтрокаТекста)
|
||||
|
||||
Токены = СтрРазделить(СтрЗаменить(СтрокаТекста, ",", "."), " ", Ложь);
|
||||
Для Каждого Токен Из Токены Цикл
|
||||
ДатаИзТокена = РазобратьДатуИзФрагмента(СокрЛП(Токен));
|
||||
Если СрокГодностиЗаполнен(ДатаИзТокена) Тогда
|
||||
Возврат ДатаИзТокена;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Возврат РазобратьДатуИзФрагмента(СтрЗаменить(СтрокаТекста, ",", "."));
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Функция РазобратьДатуИзФрагмента(Фрагмент)
|
||||
|
||||
Части = СтрРазделить(Фрагмент, ".", Ложь);
|
||||
Если Части.Количество() < 3 Тогда
|
||||
ТекстФрагмента = СокрЛП(Фрагмент);
|
||||
ПозПробел = СтрНайти(ТекстФрагмента, " ");
|
||||
Если ПозПробел > 0 Тогда
|
||||
ТекстФрагмента = СокрЛП(Лев(ТекстФрагмента, ПозПробел - 1));
|
||||
КонецЕсли;
|
||||
ТекстФрагмента = СтрЗаменить(ТекстФрагмента, "/", ".");
|
||||
ТекстФрагмента = СтрЗаменить(ТекстФрагмента, "-", ".");
|
||||
|
||||
Части = СтрРазделить(ТекстФрагмента, ".", Ложь);
|
||||
Если Части.Количество() < 2 Тогда
|
||||
Возврат '00010101';
|
||||
КонецЕсли;
|
||||
|
||||
Попытка
|
||||
День = Число(СокрЛП(Части[0]));
|
||||
Месяц = Число(СокрЛП(Части[1]));
|
||||
Год = Число(СокрЛП(Части[2]));
|
||||
Если Части.Количество() >= 3 Тогда
|
||||
День = Число(СокрЛП(Части[0]));
|
||||
Месяц = Число(СокрЛП(Части[1]));
|
||||
Год = Число(СокрЛП(Части[2]));
|
||||
Иначе
|
||||
День = 1;
|
||||
Месяц = Число(СокрЛП(Части[0]));
|
||||
Год = Число(СокрЛП(Части[1]));
|
||||
Если Год >= 100 И Месяц > 12 Тогда
|
||||
День = Месяц;
|
||||
Месяц = 1;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
Если Год < 100 Тогда
|
||||
Год = Год + 2000;
|
||||
КонецЕсли;
|
||||
Если Части.Количество() = 2 И День = 1 Тогда
|
||||
День = ДеньМесяца(КонецМесяца(Дата(Год, Месяц, 1)));
|
||||
КонецЕсли;
|
||||
Возврат Дата(Год, Месяц, День);
|
||||
Исключение
|
||||
Возврат '00010101';
|
||||
@@ -716,7 +932,7 @@
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Остатки = ОстаткиПоСериям(СерииГруппы);
|
||||
Остатки = СведенияОстатковПоСериям(СерииГруппы).Остатки;
|
||||
НомерГруппы = НомерГруппы + 1;
|
||||
ДобавитьСтрокуГруппыДублей(НомерГруппы, ВыбГруппы, Мастер, СерииГруппы, Остатки);
|
||||
|
||||
@@ -791,12 +1007,12 @@
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Функция ОстаткиПоСериям(Серии)
|
||||
Функция СведенияОстатковПоСериям(Серии)
|
||||
|
||||
// ДвиженияСерийТоваров — оборотный регистр (без виртуальной таблицы Остатки).
|
||||
// Остаток по серии — из ТоварыНаСкладах (измерение Серия, ресурс ВНаличии).
|
||||
// Остаток и номенклатура — из ТоварыНаСкладах; если остатка нет — номенклатура из движений серий.
|
||||
|
||||
Результат = Новый Соответствие;
|
||||
Результат = Новый Структура("Остатки, Номенклатура", Новый Соответствие, Новый Соответствие);
|
||||
Если Серии.Количество() = 0 Тогда
|
||||
Возврат Результат;
|
||||
КонецЕсли;
|
||||
@@ -805,17 +1021,61 @@
|
||||
Запрос.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Ост.Серия КАК Серия,
|
||||
| Ост.Номенклатура КАК Номенклатура,
|
||||
| СУММА(Ост.ВНаличииОстаток) КАК Количество
|
||||
|ИЗ
|
||||
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Серия В (&Серии)) КАК Ост
|
||||
|СГРУППИРОВАТЬ ПО
|
||||
| Ост.Серия";
|
||||
| Ост.Серия,
|
||||
| Ост.Номенклатура";
|
||||
Запрос.УстановитьПараметр("Серии", Серии);
|
||||
|
||||
МаксимумПоСерии = Новый Соответствие;
|
||||
Выборка = Запрос.Выполнить().Выбрать();
|
||||
Пока Выборка.Следующий() Цикл
|
||||
Результат.Вставить(Выборка.Серия, Выборка.Количество);
|
||||
ТекущийОстаток = ОстатокСерииИзСоответствия(Результат.Остатки, Выборка.Серия);
|
||||
Результат.Остатки.Вставить(Выборка.Серия, ТекущийОстаток + Выборка.Количество);
|
||||
Если Выборка.Количество > ОстатокСерииИзСоответствия(МаксимумПоСерии, Выборка.Серия) Тогда
|
||||
МаксимумПоСерии.Вставить(Выборка.Серия, Выборка.Количество);
|
||||
Если ЗначениеЗаполнено(Выборка.Номенклатура) Тогда
|
||||
Результат.Номенклатура.Вставить(Выборка.Серия, Выборка.Номенклатура);
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
СерииБезНоменклатуры = Новый Массив;
|
||||
Для Каждого Серия Из Серии Цикл
|
||||
Если Результат.Номенклатура.Получить(Серия) = Неопределено Тогда
|
||||
СерииБезНоменклатуры.Добавить(Серия);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
Если СерииБезНоменклатуры.Количество() > 0 Тогда
|
||||
ЗапросДвижения = Новый Запрос;
|
||||
ЗапросДвижения.Текст =
|
||||
"ВЫБРАТЬ
|
||||
| Дв.Серия КАК Серия,
|
||||
| Дв.Номенклатура КАК Номенклатура,
|
||||
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Дв.Регистратор) КАК Вес
|
||||
|ИЗ
|
||||
| РегистрНакопления.ДвиженияСерийТоваров КАК Дв
|
||||
|ГДЕ
|
||||
| Дв.Серия В (&Серии)
|
||||
| И Дв.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
|
||||
|СГРУППИРОВАТЬ ПО
|
||||
| Дв.Серия,
|
||||
| Дв.Номенклатура";
|
||||
ЗапросДвижения.УстановитьПараметр("Серии", СерииБезНоменклатуры);
|
||||
ВесПоСерии = Новый Соответствие;
|
||||
ВыборкаДв = ЗапросДвижения.Выполнить().Выбрать();
|
||||
Пока ВыборкаДв.Следующий() Цикл
|
||||
Если ВыборкаДв.Вес > ОстатокСерииИзСоответствия(ВесПоСерии, ВыборкаДв.Серия) Тогда
|
||||
ВесПоСерии.Вставить(ВыборкаДв.Серия, ВыборкаДв.Вес);
|
||||
Результат.Номенклатура.Вставить(ВыборкаДв.Серия, ВыборкаДв.Номенклатура);
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
@@ -879,6 +1139,24 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Функция НоменклатураСерииИзСоответствия(НоменклатураПоСериям, Серия)
|
||||
|
||||
Значение = НоменклатураПоСериям.Получить(Серия);
|
||||
Если Значение = Неопределено Тогда
|
||||
Возврат Справочники.Номенклатура.ПустаяСсылка();
|
||||
КонецЕсли;
|
||||
Возврат Значение;
|
||||
|
||||
КонецФункции
|
||||
|
||||
&НаСервере
|
||||
Процедура СортироватьПроблемныеСерииНаСервере(ВыражениеСортировки)
|
||||
|
||||
Объект.ПроблемныеСерии.Сортировать(ВыражениеСортировки);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
&НаСервере
|
||||
Функция ТекстПредупрежденияОбОстаткахНаСервере()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user