РК_ЗагрузкаОстатков 1.3.1.62: кол. склад и финансовое раздельно, себестоимость rh_.

В таблицу приходят два количества и сумма только финансового контура; комиссия без серий. Документы ввода заполняют сумму из rh_, как волна 1. Нужен ws-rhana ≥ 0.0.0.38.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-08-13 16:57:23 +03:00
parent be72455409
commit 8778167248
10 changed files with 1418 additions and 62 deletions
@@ -48,12 +48,55 @@
НовСтр.Количество = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_commission",
ЗначениеСвойства(СтрокаAPI, "qty_org", НовСтр.Количество)), 0);
НовСтр.КоличествоОрганизации = НовСтр.Количество;
НовСтр.СерияИдентификатор = UUIDИзСтроки("");
НовСтр.Серия = "";
НовСтр.СерияНомер = "";
НовСтр.СерияСсылка = Справочники.СерииНоменклатуры.ПустаяСсылка();
НовСтр.СоглашениеИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "agreement_guid", ""));
НовСтр.СоглашениеНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "agreement_name", "")));
НовСтр.ПартнерИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "partner_guid", ""));
НовСтр.ПартнерНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "partner_name", "")));
НовСтр.КонтрагентИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "contractor_guid", ""));
НовСтр.КонтрагентНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "contractor_name", "")));
НовСтр.НазначениеИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "purpose_guid", ""));
НовСтр.Назначение = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "purpose_name", "")));
НовСтр.ВидЗапасовИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "inventory_kind_guid", ""));
НовСтр.ВидЗапасов = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "inventory_kind_name", "")));
НовСтр.ТипЗапасов = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "inventory_kind_type", "")));
КонецЦикла;
КонецПроцедуры
// Заполняет ТЧ ПолитикаУчетаНоменклатуры ответом POST /v1/stock/nomenclature-policy.
//
Процедура ЗаполнитьПолитикуУчетаИзОтвета(ОтветAPI, ОчищатьПередЗаполнением = Истина) Экспорт
Если ОчищатьПередЗаполнением Тогда
ПолитикаУчетаНоменклатуры.Очистить();
КонецЕсли;
СтрокиОтвета = Неопределено;
Если ТипЗнч(ОтветAPI) = Тип("Структура") Или ТипЗнч(ОтветAPI) = Тип("Соответствие") Тогда
СтрокиОтвета = ЗначениеСвойства(ОтветAPI, "rows", Неопределено);
КонецЕсли;
Если ТипЗнч(СтрокиОтвета) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаAPI Из СтрокиОтвета Цикл
НовСтр = ПолитикаУчетаНоменклатуры.Добавить();
НовСтр.ВидНоменклатурыИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "kind_guid", ""));
НовСтр.ВидНоменклатурыНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "kind_name", "")));
НовСтр.ИспользоватьСерии = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_series", Ложь));
НовСтр.НастройкаИспользованияСерий = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_usage", "")));
НовСтр.ИспользоватьНомерСерии = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_series_number", Ложь));
НовСтр.ИспользоватьСрокГодностиСерии = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_series_expire", Ложь));
НовСтр.ТочностьУказанияСрокаГодностиСерии = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_expire_accuracy", "")));
НовСтр.ИспользоватьRFIDМеткиСерии = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_series_rfid", Ложь));
НовСтр.ИспользоватьХарактеристики = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_characteristics", Ложь));
НовСтр.ИспользованиеХарактеристик = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristics_usage", "")));
НовСтр.ВестиУчетПоГТД = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_gtd", Ложь));
НовСтр.ВестиУчетСертификатовНоменклатуры = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_certificates", Ложь));
КонецЦикла;
КонецПроцедуры
@@ -112,17 +155,19 @@
Хар = НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат);
СтрТ.Характеристика = Хар;
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
Если СтрТ.Количество <> 0 Тогда
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
@@ -140,7 +185,7 @@
КонецФункции
// Сопоставление комиссионных строк (переданные 2.5): соглашение, партнёр, контрагент, договор.
// Склад не обязателен. Серии — только существующие или созданные из исходных данных.
// Склад не обязателен. Серии в комиссионном товаре не используются.
//
Функция СопоставитьВходящиеКомиссионныеТовары(РежимТест = Истина) Экспорт
@@ -150,14 +195,6 @@
Результат.Вставить("СозданоСерий", 0);
Результат.Вставить("СозданоХарактеристик", 0);
СуффиксДатыСер = Формат(?(ЗначениеЗаполнено(ДатаДокументовВвода), ДатаДокументовВвода, ДатаОстатков), "ДФ=yyyyMMdd");
Если ПустаяСтрока(СуффиксДатыСер) Тогда
СуффиксДатыСер = Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd");
КонецЕсли;
КэшТребуетсяСерия = Новый Соответствие;
КэшСерий = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
СтрТ.Сопоставлено = Ложь;
@@ -203,19 +240,6 @@
Хар = НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат);
СтрТ.Характеристика = Хар;
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СтрТ.Склад, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
СтрТ.Сопоставлено = Истина;
@@ -232,7 +256,8 @@
// Создание документов ВводОстатковТоваров по сопоставленным строкам.
// Собственные — 1 документ на склад; комиссия 2.5 — 1 документ на соглашение+партнёра (без склада).
// Себестоимость не заполняется (нет данных в API) — только оперативный учёт количества.
// Количество в документе — финансовое (rh_), если не 0, иначе складское.
// Себестоимость — из rh_ (сумма USD, СуммаРегл); серии только у собственных строк.
//
// Параметры:
// РежимТест - Булево - только подсчёт без записи
@@ -494,7 +519,7 @@
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковСобственныхТоваров;
Док.Комментарий = ТекстТега + ", склад " + СокрЛП(Строка(СкладДок));
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = Ложь;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиСклада);
Док.ЦенаВключаетНДС = Ложь;
Попытка
@@ -502,11 +527,20 @@
Исключение
КонецПопытки;
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
Если Док.ОтражатьСебестоимость Тогда
Попытка
Док.Валюта = Константы.ВалютаУправленческогоУчета.Получить();
Исключение
Док.Валюта = Неопределено;
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Валюта) Тогда
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.НалогообложениеНДС) Тогда
Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
@@ -551,14 +585,23 @@
Док.Договор = Первая.Договор;
Док.Комментарий = ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер));
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = Ложь;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиГруппы);
Док.ЦенаВключаетНДС = Ложь;
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
Если Док.ОтражатьСебестоимость Тогда
Попытка
Док.Валюта = Константы.ВалютаУправленческогоУчета.Получить();
Исключение
Док.Валюта = Неопределено;
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Валюта) Тогда
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.НалогообложениеНДС) Тогда
Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
@@ -592,14 +635,30 @@
Процедура ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ)
КолДок = СтрТ.КоличествоОрганизации;
Если КолДок = 0 Тогда
КолДок = СтрТ.Количество;
КонецЕсли;
Если КолДок = 0 Тогда
Возврат;
КонецЕсли;
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Характеристика = СтрТ.Характеристика;
НовСтр.Серия = СтрТ.СерияСсылка;
НовСтр.Количество = СтрТ.Количество;
НовСтр.КоличествоУпаковок = СтрТ.Количество;
НовСтр.Цена = 0;
НовСтр.Сумма = 0;
НовСтр.Количество = КолДок;
НовСтр.КоличествоУпаковок = КолДок;
НовСтр.Сумма = СтрТ.Стоимость;
Если КолДок <> 0 И СтрТ.Стоимость <> 0 Тогда
НовСтр.Цена = Окр(СтрТ.Стоимость / КолДок, 2);
Иначе
НовСтр.Цена = 0;
КонецЕсли;
Попытка
НовСтр.СуммаРегл = СтрТ.СтоимостьРегл;
Исключение
КонецПопытки;
Попытка
НовСтр.СтавкаНДС = СтрТ.Номенклатура.СтавкаНДС;
Исключение
@@ -618,6 +677,17 @@
КонецПроцедуры
Функция ЕстьСтоимостьВСтроках(Строки)
Для Каждого СтрТ Из Строки Цикл
Если СтрТ.Стоимость <> 0 Или СтрТ.СтоимостьРегл <> 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI)
НовСтр.НоменклатураИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "nomenclature_guid", ""));
@@ -645,18 +715,34 @@
КонецЕсли;
НовСтр.ГТДИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "gtd_guid", ""));
НовСтр.ГТД = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_name", "")));
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_name", "")));
Если ПустаяСтрока(ГТДТекст) Тогда
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_code", "")));
КонецЕсли;
Если ПустаяСтрока(ГТДТекст) Тогда
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_number", "")));
КонецЕсли;
НовСтр.ГТД = ГТДТекст;
НовСтр.ОрганизацияИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "organization_guid", ""));
НовСтр.ОрганизацияНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "organization_name", "")));
НовСтр.Количество = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_warehouse",
КолСклад = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_warehouse", 0), 0);
КолФин = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_financial",
ЗначениеСвойства(СтрокаAPI, "qty_org", 0)), 0);
НовСтр.Количество = КолСклад;
НовСтр.КоличествоОрганизации = КолФин;
НовСтр.КоличествоКОтгрузке = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_to_ship", 0), 0);
НовСтр.КоличествоОрганизации = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_org", 0), 0);
НовСтр.ВидНоменклатурыИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "policy_kind_guid", ""));
НовСтр.ВидНоменклатурыНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "policy_kind_name", "")));
НовСтр.Стоимость = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "cost_mgmt", 0), 0);
НовСтр.СтоимостьРегл = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "cost_regl", 0), 0);
НовСтр.Валюта = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_mgmt", "")));
НовСтр.ВалютаРегл = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_regl", "")));
ВидGUID = ЗначениеСвойства(СтрокаAPI, "kind_guid", ЗначениеСвойства(СтрокаAPI, "policy_kind_guid", ""));
ВидИмя = ЗначениеСвойства(СтрокаAPI, "kind_name", ЗначениеСвойства(СтрокаAPI, "policy_kind_name", ""));
НовСтр.ВидНоменклатурыИдентификатор = UUIDИзСтроки(ВидGUID);
НовСтр.ВидНоменклатурыНаименование = СокрЛП(Строка(ВидИмя));
НовСтр.ПолитикаСерии = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "policy_use_series", "")));
НовСтр.ПолитикаХарактеристик = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "policy_use_characteristics", "")));
@@ -1073,6 +1159,19 @@
КонецФункции
Функция БулевоИзЗначения(Значение)
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат Значение;
КонецЕсли;
Если Значение = Неопределено Или Значение = Null Тогда
Возврат Ложь;
КонецЕсли;
Стр = НРег(СокрЛП(Строка(Значение)));
Возврат Стр = "true" Или Стр = "1" Или Стр = "да" Или Стр = "истина";
КонецФункции
#КонецОбласти
#КонецЕсли