1.3.1.133: окно серий и строки одной аналитики суммируются, страна ГТД из остатка.

Проведение склада берёт максимум строки серии (#36). Строки с одной номенклатурой, характеристикой, серией и ГТД складываются до записи (#81). Пустая карточка ГТД получает код и страну из данных загрузки (#80).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-10-13 14:41:35 +03:00
parent 20e4cf51a8
commit b9655b79f7
6 changed files with 275 additions and 25 deletions
+9
View File
@@ -4,6 +4,15 @@
---
## 1.3.1.133 (2026-10-13)
### #36: окно серий сворачивается суммой перед записью ввода остатков
- Проведение склада для статусов серий 4, 6, 8 и 10 берёт максимум количества, а не сумму повторов одной серии.
- Перед записью КБ строки окна серий с одной номенклатурой, характеристикой, назначением, серией и упаковкой складываются.
- [#81](https://git.p7net.ru/rhana/crm3-migration/issues/81): строки товаров с одной номенклатурой, характеристикой, серией и ГТД суммируются, в том числе с заполненной характеристикой. Разный ГТД остаётся разными строками.
- Загрузка остатков не создаёт элементы номеров ГТД. Если у найденной карточки пуст код, в него пишется номер из остатка. Пустая страна заполняется по коду страны из исходной базы.
## 1.3.1.132 (2026-10-13)
### #79: сумма без НДС при выключенном «Цена включает НДС»
+1 -1
View File
@@ -1 +1 @@
1.3.1.132
1.3.1.133
+3 -1
View File
@@ -83,7 +83,7 @@
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла" id="f47d02ff-17f2-4764-a151-627f4067a479" configVersion="247298ad849a4d46b1f412e90c0184fe64756489"/>
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.Form.ЗагрузкаДанныхИзФайла.Form" id="f47d02ff-17f2-4764-a151-627f4067a479.0" configVersion="e853a6b3591994346f9ce1d3b7d5cf0daf864fb8"/>
<Metadata name="DataProcessor.ЗагрузкаДанныхИзФайла.ManagerModule" id="b6fd11ac-f702-4d13-b328-9a78b0874483.2" configVersion="bece1f29a627db12ff29614e8e09b65e386e3272"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков" id="5922bda8-8f69-487c-823a-8b09e343f59a" configVersion="ee131b03d569514c81758f3c969877170a39f431">
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков" id="5922bda8-8f69-487c-823a-8b09e343f59a" configVersion="9dc6e94b758c1024e246a6080a87151007a64da0">
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.СтоимостьРегл" id="068e3fcc-0bd5-4af0-a192-d100909a8cc1"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.СкладИдентификатор" id="086673fd-91b2-4966-8472-144da87650e6"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.КомментарийСопоставления" id="09d80a73-1aa6-4ecc-a39a-c667e99e3084"/>
@@ -161,6 +161,7 @@
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.ХарактеристикаНаименование" id="8fa984e4-bbf2-4d38-a80d-33827c3645da"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.ВидЗапасовИдентификатор" id="91c330ed-7136-4788-8516-9a67b86b2189"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.КоличествоКОтгрузке" id="96d40d10-3374-40d1-9daf-3ddcb1cb6b7a"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеКомиссионныеТовары.Attribute.ГТДСтранаКод" id="9ffc6bfd-69fe-4490-8dc4-b4d80e60580b"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.СерияИдентификатор" id="a0b08c20-f11b-47bb-ab41-3c80166deab5"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ПолитикаУчетаНоменклатуры.Attribute.ТочностьУказанияСрокаГодностиСерии" id="a1296c97-525a-457d-870e-634d893cea01"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.ВидНоменклатурыНаименование" id="a1896aca-6eaf-46df-87dc-2e9f3ea8ae64"/>
@@ -204,6 +205,7 @@
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.СозданныеДокументы.Attribute.ЭтоТест" id="d6f1b4c7-a45c-4b6e-9b83-f8d9201a3be5"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ПолитикаУчетаНоменклатуры" id="d8059437-d963-4b1b-8930-8ed7b9fd05fe"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.ПодключениеКСтороннейБазе" id="d8202194-9b79-46e4-b922-34f7c3add55c"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ВходящиеСобственныеТовары.Attribute.ГТДСтранаКод" id="e1699ec9-b50f-4dd1-bb23-6fa9374444ff"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.СозданныеДокументы.Attribute.Соглашение" id="e1a6c9d2-5f07-4619-8c3e-a3847bc5e690"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.Attribute.СоздаватьЗаглушкиСерий" id="e41a311b-b962-4888-ab06-c8ee29eb6351"/>
<Metadata name="DataProcessor.РК_ЗагрузкаОстатков.TabularSection.ПолитикаУчетаНоменклатуры.Attribute.ВидНоменклатурыНаименование" id="e4d84e8b-fbd4-4967-9f84-67622403de0a"/>
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles>
<Vendor/>
<Version>1.3.1.132</Version>
<Version>1.3.1.133</Version>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/>
@@ -1032,6 +1032,46 @@
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="e1699ec9-b50f-4dd1-bb23-6fa9374444ff">
<Properties>
<Name>ГТДСтранаКод</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Код страны ГТД</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</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:type="xs:string"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="b037736f-f398-4863-8734-45f0e88ee3c9">
<Properties>
<Name>ГТДИдентификатор</Name>
@@ -2558,6 +2598,46 @@
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="9ffc6bfd-69fe-4490-8dc4-b4d80e60580b">
<Properties>
<Name>ГТДСтранаКод</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Код страны ГТД</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>10</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</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:type="xs:string"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
</Properties>
</Attribute>
<Attribute uuid="41d1148e-30d6-427c-9aa6-21feaa13873f">
<Properties>
<Name>ГТДИдентификатор</Name>
@@ -176,7 +176,7 @@
КонецЕсли;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
ЗаполнитьНомерГТДСтроки(СтрТ, РежимТест);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
@@ -289,7 +289,7 @@
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
ЗаполнитьНомерГТДСтроки(СтрТ, РежимТест);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
@@ -1170,7 +1170,7 @@
Исключение
КонецПопытки;
СтрокиСклада = СвернутьСтрокиБезХарактеристики(СтрокиСклада);
СтрокиСклада = СвернутьСтрокиОднойАналитики(СтрокиСклада);
Для Каждого СтрТ Из СтрокиСклада Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
@@ -1187,6 +1187,7 @@
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Док, ПараметрыУказанияСерий);
Исключение
КонецПопытки;
СвернутьСерииДокументаВвода(Док);
Док.ОбменДанными.Загрузка = Ложь;
Док.Записать(РежимЗаписиДокумента.Запись);
@@ -1245,7 +1246,7 @@
Исключение
КонецПопытки;
СтрокиГруппы = СвернутьСтрокиБезХарактеристики(СтрокиГруппы);
СтрокиГруппы = СвернутьСтрокиОднойАналитики(СтрокиГруппы);
Для Каждого СтрТ Из СтрокиГруппы Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
@@ -1262,6 +1263,7 @@
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Док, ПараметрыУказанияСерий);
Исключение
КонецПопытки;
СвернутьСерииДокументаВвода(Док);
Док.ОбменДанными.Загрузка = Ложь;
Док.Записать(РежимЗаписиДокумента.Запись);
@@ -1269,6 +1271,56 @@
КонецФункции
// Проведение ТоварыНаСкладах для статусов 4, 6, 8, 10 берёт МАКСИМУМ количества
// окна серий в разрезе номенклатуры, характеристики, назначения, серии и упаковки (#36).
// Повторы одной серии из разных строк товаров схлопываются суммой до записи.
//
Процедура СвернутьСерииДокументаВвода(Док)
Если Док.Серии.Количество() < 2 Тогда
Возврат;
КонецЕсли;
Индекс = Новый Соответствие;
КУдалению = Новый Массив;
Для Каждого СтрСер Из Док.Серии Цикл
КлючХар = "";
Если ЗначениеЗаполнено(СтрСер.Характеристика) Тогда
КлючХар = Строка(СтрСер.Характеристика.УникальныйИдентификатор());
КонецЕсли;
КлючНазначения = "";
Если ЗначениеЗаполнено(СтрСер.Назначение) Тогда
КлючНазначения = Строка(СтрСер.Назначение.УникальныйИдентификатор());
КонецЕсли;
КлючУпаковки = "";
Если ЗначениеЗаполнено(СтрСер.Упаковка) Тогда
КлючУпаковки = Строка(СтрСер.Упаковка.УникальныйИдентификатор());
КонецЕсли;
КлючСерии = "";
Если ЗначениеЗаполнено(СтрСер.Серия) Тогда
КлючСерии = Строка(СтрСер.Серия.УникальныйИдентификатор());
КонецЕсли;
Ключ = Строка(СтрСер.Номенклатура.УникальныйИдентификатор())
+ "|" + КлючХар
+ "|" + КлючНазначения
+ "|" + КлючСерии
+ "|" + КлючУпаковки;
Уже = Индекс.Получить(Ключ);
Если Уже = Неопределено Тогда
Индекс.Вставить(Ключ, СтрСер);
Иначе
Уже.Количество = Уже.Количество + СтрСер.Количество;
Уже.КоличествоУпаковок = Уже.КоличествоУпаковок + СтрСер.КоличествоУпаковок;
КУдалению.Добавить(СтрСер);
КонецЕсли;
КонецЦикла;
Для Каждого СтрСер Из КУдалению Цикл
Док.Серии.Удалить(СтрСер);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ)
КолДок = СтрТ.КоличествоОрганизации;
@@ -1375,22 +1427,39 @@
КонецФункции
Функция СвернутьСтрокиБезХарактеристики(Строки)
// #81: одна аналитика — номенклатура, характеристика, серия и ГТД.
// Разный ГТД не схлопывается. Без серии строка остаётся отдельной:
// пустая колонка серии не отличает разные карточки окна.
//
Функция СвернутьСтрокиОднойАналитики(Строки)
Результат = Новый Массив;
Индекс = Новый Соответствие;
Для Каждого СтрТ Из Строки Цикл
Если ЗначениеЗаполнено(СтрТ.Характеристика) Или Не ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
Если Не ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
Результат.Добавить(СтрТ);
Продолжить;
КонецЕсли;
КлючХар = "";
Если ЗначениеЗаполнено(СтрТ.Характеристика) Тогда
КлючХар = Строка(СтрТ.Характеристика.УникальныйИдентификатор());
КонецЕсли;
КлючГТД = "";
Если ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
КлючГТД = Строка(СтрТ.НомерГТДСсылка.УникальныйИдентификатор());
КонецЕсли;
КлючНазначения = "";
Попытка
Если ЗначениеЗаполнено(СтрТ.НазначениеИдентификатор) Тогда
КлючНазначения = Строка(СтрТ.НазначениеИдентификатор);
КонецЕсли;
Исключение
КонецПопытки;
Ключ = Строка(СтрТ.Номенклатура.УникальныйИдентификатор())
+ "|" + КлючХар
+ "|" + Строка(СтрТ.СерияСсылка.УникальныйИдентификатор())
+ "|" + КлючГТД;
+ "|" + КлючГТД
+ "|" + КлючНазначения;
Уже = Индекс.Получить(Ключ);
Если Уже = Неопределено Тогда
Индекс.Вставить(Ключ, СтрТ);
@@ -1524,6 +1593,7 @@
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_number", "")));
КонецЕсли;
НовСтр.ГТД = ГТДТекст;
НовСтр.ГТДСтранаКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_country_code", "")));
НовСтр.ОрганизацияИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "organization_guid", ""));
НовСтр.ОрганизацияНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "organization_name", "")));
@@ -1680,28 +1750,117 @@
КонецФункции
Процедура ЗаполнитьНомерГТДСтроки(СтрТ)
// Элементы НомераГТД обработка не создаёт. Пустой код даёт в документе «<>»:
// представление справочника — код, а в списке виден регистрационный номер.
// Из нескольких карточек одного номера берётся заполненная. Если код пуст,
// в него пишется номер из остатка. Пустая страна берётся из кода страны исходной базы.
//
Процедура ЗаполнитьНомерГТДСтроки(СтрТ, РежимТест)
Если Не ЗначениеЗаполнено(СтрТ.ГТД) Тогда
Возврат;
КонецЕсли;
КодГТД = СокрЛП(СтрТ.ГТД);
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоКоду(КодГТД);
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоРеквизиту("РегистрационныйНомер", КодГТД);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоНаименованию(КодГТД, Истина);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СсылкаГТД = СсылкаПоUUID(Справочники.НомераГТД, СтрТ.ГТДИдентификатор);
Если ЗначениеЗаполнено(СсылкаГТД) И ОбщегоНазначения.СсылкаСуществует(СсылкаГТД) Тогда
СтрТ.НомерГТДСсылка = СсылкаГТД;
КонецЕсли;
КонецЕсли;
СтрТ.НомерГТДСсылка = ПодобратьКарточкуГТД(СокрЛП(СтрТ.ГТД), СтрТ.ГТДИдентификатор,
СтрТ.ГТДСтранаКод, РежимТест);
КонецПроцедуры
Функция ПодобратьКарточкуГТД(КодГТД, Идентификатор, КодСтраныИсточника, РежимТест)
СсылкаПоГуид = СсылкаПоUUID(Справочники.НомераГТД, Идентификатор);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номер", КодГТД);
Запрос.УстановитьПараметр("Ссылка", СсылкаПоГуид);
Запрос.Текст =
"ВЫБРАТЬ
| ГТД.Ссылка КАК Ссылка,
| ГТД.Код КАК Код,
| ГТД.РегистрационныйНомер КАК РегНомер,
| ГТД.СтранаПроисхождения КАК Страна
|ИЗ
| Справочник.НомераГТД КАК ГТД
|ГДЕ
| НЕ ГТД.ПометкаУдаления
| И (СОКРЛП(ГТД.Код) = &Номер
| ИЛИ ГТД.РегистрационныйНомер = &Номер
| ИЛИ ГТД.Ссылка = &Ссылка)";
Лучшая = Справочники.НомераГТД.ПустаяСсылка();
ЛучшийБалл = -1;
СтранаПолная = Справочники.СтраныМира.ПустаяСсылка();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НомерСовпадает = СокрЛП(Выборка.Код) = КодГТД Или СокрЛП(Выборка.РегНомер) = КодГТД;
Если Не НомерСовпадает Тогда
Продолжить;
КонецЕсли;
Балл = 0;
Если ЗначениеЗаполнено(СокрЛП(Выборка.Код)) Тогда
Балл = Балл + 2;
КонецЕсли;
Если ЗначениеЗаполнено(Выборка.Страна) Тогда
Балл = Балл + 1;
Если Не ЗначениеЗаполнено(СтранаПолная) Тогда
СтранаПолная = Выборка.Страна;
КонецЕсли;
КонецЕсли;
Если Балл > ЛучшийБалл Тогда
ЛучшийБалл = Балл;
Лучшая = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(Лучшая) Тогда
Возврат Справочники.НомераГТД.ПустаяСсылка();
КонецЕсли;
СтранаИсточника = СтранаМираПоКоду(КодСтраныИсточника);
Если ЗначениеЗаполнено(СтранаИсточника) Тогда
СтранаПолная = СтранаИсточника;
КонецЕсли;
Возврат ДополнитьПустуюКарточкуГТД(Лучшая, КодГТД, СтранаПолная, РежимТест);
КонецФункции
Функция СтранаМираПоКоду(КодСтраны)
Код = СокрЛП(КодСтраны);
Если ПустаяСтрока(Код) Тогда
Возврат Справочники.СтраныМира.ПустаяСсылка();
КонецЕсли;
Возврат Справочники.СтраныМира.НайтиПоКоду(Код);
КонецФункции
Функция ДополнитьПустуюКарточкуГТД(СсылкаГТД, КодГТД, СтранаПолная, РежимТест)
КодКарточки = СокрЛП(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаГТД, "Код"));
СтранаКарточки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаГТД, "СтранаПроисхождения");
НуженКод = Не ЗначениеЗаполнено(КодКарточки);
НужнаСтрана = Не ЗначениеЗаполнено(СтранаКарточки) И ЗначениеЗаполнено(СтранаПолная);
Если РежимТест Или (Не НуженКод И Не НужнаСтрана) Тогда
Возврат СсылкаГТД;
КонецЕсли;
ОбъектГТД = СсылкаГТД.ПолучитьОбъект();
Если НуженКод Тогда
ОбъектГТД.Код = КодГТД;
Если Не ЗначениеЗаполнено(ОбъектГТД.РегистрационныйНомер) Тогда
ОбъектГТД.РегистрационныйНомер = КодГТД;
КонецЕсли;
Если Не ЗначениеЗаполнено(ОбъектГТД.ТипНомераГТД) Тогда
ОбъектГТД.ТипНомераГТД = Перечисления.ТипыНомеровГТД.НомерГТД;
КонецЕсли;
КонецЕсли;
Если НужнаСтрана Тогда
ОбъектГТД.СтранаПроисхождения = СтранаПолная;
КонецЕсли;
ОбъектГТД.Записать();
Возврат ОбъектГТД.Ссылка;
КонецФункции
// A4a (#24 comment-893/897): plain dev «Основное соглашение по договорам» (продажи) →
// индивидуальное соглашение комиссии Поварова в target (не типовое 1448bf7f:
// ввод на основании типового соглашения в Заказ/Реализация запрещён).