РК_ПроверкаСерий 1.3.1.78: отбор, сортировка и генерация предложений.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-08-17 13:52:07 +03:00
parent 968e73eb8e
commit 3e4f9135e4
7 changed files with 443 additions and 23 deletions
+9
View File
@@ -4,6 +4,15 @@
---
## 1.3.1.78 (2026-08-17)
### РК_ПроверкаСерий — анализ таблицы проблем
- Отбор **Только с остатком**, поиск по строке в командной панели таблицы, сортировка по остатку и по текущей колонке.
- Номенклатура заполняется из `ТоварыНаСкладах` (при отсутствии остатка — из `ДвиженияСерийТоваров`).
- Кнопка **Сформировать предложения** — отдельная генерация предложенных номера/срока/наименования из наименования серии.
- Разбор срока: не только шаблон «до …», но и дата в тексте (`dd.MM.yy`, `MM.yyyy`).
## 1.3.1.77 (2026-08-17)
### Исправление
+1 -1
View File
@@ -1 +1 @@
1.3.1.77
1.3.1.78
+1
View File
@@ -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"/>
+1 -1
View File
@@ -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 @@
КонецФункции
&НаСервере
Функция НоменклатураСерииИзСоответствия(НоменклатураПоСериям, Серия)
Значение = НоменклатураПоСериям.Получить(Серия);
Если Значение = Неопределено Тогда
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Возврат Значение;
КонецФункции
&НаСервере
Процедура СортироватьПроблемныеСерииНаСервере(ВыражениеСортировки)
Объект.ПроблемныеСерии.Сортировать(ВыражениеСортировки);
КонецПроцедуры
&НаСервере
Функция ТекстПредупрежденияОбОстаткахНаСервере()