РК_ЗагрузкаОстатков 1.3.1.60: комиссия 2.5 и вкладка документов ввода.

Собственные и комиссионные ТЧ, серии только при отсутствии (заглушки по флагу);
созданные ВводОстатковТоваров выводятся на отдельную страницу для контроля.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-08-13 14:55:33 +03:00
parent 383e4a7e1e
commit 665b257714
9 changed files with 3353 additions and 270 deletions
@@ -3,12 +3,12 @@
#Область ПрограммныйИнтерфейс
// Заполняет ТЧ ВходящиеДанные строками остатков Transfer API (mode=combined по умолчанию).
// Заполняет ТЧ ВходящиеСобственныеТовары строками остатков Transfer API (mode=combined по умолчанию).
//
Процедура ЗаполнитьВходящиеДанныеИзОтветаОстатков(ОтветAPI, ОчищатьПередЗаполнением = Истина) Экспорт
Процедура ЗаполнитьВходящиеСобственныеТоварыИзОтветаОстатков(ОтветAPI, ОчищатьПередЗаполнением = Истина) Экспорт
Если ОчищатьПередЗаполнением Тогда
ВходящиеДанные.Очистить();
ВходящиеСобственныеТовары.Очистить();
КонецЕсли;
СтрокиОтвета = Неопределено;
@@ -20,14 +20,46 @@
КонецЕсли;
Для Каждого СтрокаAPI Из СтрокиОтвета Цикл
НовСтр = ВходящиеДанные.Добавить();
НовСтр = ВходящиеСобственныеТовары.Добавить();
ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI);
КонецЦикла;
КонецПроцедуры
// Сопоставление строк ТЧ с НСИ целевой ИБ + создание серий-заглушек при необходимости.
// Алгоритм — по логике scripts/generate_balances_apply_bsl.py (артикул/GUID/код/имя; серии Перенос_*).
// Заполняет ТЧ ВходящиеКомиссионныеТовары остатками mode=commission (переданные 2.5).
//
Процедура ЗаполнитьВходящиеКомиссионныеТоварыИзОтветаОстатков(ОтветAPI, ОчищатьПередЗаполнением = Истина) Экспорт
Если ОчищатьПередЗаполнением Тогда
ВходящиеКомиссионныеТовары.Очистить();
КонецЕсли;
СтрокиОтвета = Неопределено;
Если ТипЗнч(ОтветAPI) = Тип("Структура") Или ТипЗнч(ОтветAPI) = Тип("Соответствие") Тогда
СтрокиОтвета = ЗначениеСвойства(ОтветAPI, "rows", Неопределено);
КонецЕсли;
Если ТипЗнч(СтрокиОтвета) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаAPI Из СтрокиОтвета Цикл
НовСтр = ВходящиеКомиссионныеТовары.Добавить();
ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI);
НовСтр.Количество = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_commission",
ЗначениеСвойства(СтрокаAPI, "qty_org", НовСтр.Количество)), 0);
НовСтр.КоличествоОрганизации = НовСтр.Количество;
НовСтр.СоглашениеИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "agreement_guid", ""));
НовСтр.СоглашениеНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "agreement_name", "")));
НовСтр.ПартнерИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "partner_guid", ""));
НовСтр.ПартнерНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "partner_name", "")));
НовСтр.КонтрагентИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "contractor_guid", ""));
НовСтр.КонтрагентНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "contractor_name", "")));
КонецЦикла;
КонецПроцедуры
// Сопоставление строк ТЧ с НСИ целевой ИБ.
// Серии создаются только если не найдены; заглушки Перенос_* — только при СоздаватьЗаглушкиСерий.
//
// Параметры:
// РежимТест - Булево - Истина: только поиск, без создания серий/характеристик
@@ -35,7 +67,7 @@
// Возвращаемое значение:
// Структура - Сопоставлено, НеСопоставлено, СозданоСерий, СозданоХарактеристик
//
Функция СопоставитьВходящиеДанные(РежимТест = Истина) Экспорт
Функция СопоставитьВходящиеСобственныеТовары(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("Сопоставлено", 0);
@@ -51,7 +83,7 @@
КэшТребуетсяСерия = Новый Соответствие;
КэшСерий = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеДанные Цикл
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
СтрТ.Сопоставлено = Ложь;
СтрТ.КомментарийСопоставления = "";
@@ -83,24 +115,18 @@
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если ЗначениеЗаполнено(СтрТ.ГТД) Тогда
КодГТД = СокрЛП(СтрТ.ГТД);
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоКоду(КодГТД);
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоРеквизиту("РегистрационныйНомер", КодГТД);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоНаименованию(КодГТД, Истина);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СсылкаГТД = СсылкаПоUUID(Справочники.НомераГТД, СтрТ.ГТДИдентификатор);
Если ЗначениеЗаполнено(СсылкаГТД) И ОбщегоНазначения.СсылкаСуществует(СсылкаГТД) Тогда
СтрТ.НомерГТДСсылка = СсылкаГТД;
КонецЕсли;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
СтрТ.КомментарийСопоставления = "OK";
@@ -113,21 +139,116 @@
КонецФункции
// Создание документов ВводОстатковТоваров по сопоставленным строкам (1 документ на склад).
// Сопоставление комиссионных строк (переданные 2.5): соглашение, партнёр, контрагент, договор.
// Склад не обязателен. Серии — только существующие или созданные из исходных данных.
//
Функция СопоставитьВходящиеКомиссионныеТовары(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("Сопоставлено", 0);
Результат.Вставить("НеСопоставлено", 0);
Результат.Вставить("СозданоСерий", 0);
Результат.Вставить("СозданоХарактеристик", 0);
СуффиксДатыСер = Формат(?(ЗначениеЗаполнено(ДатаДокументовВвода), ДатаДокументовВвода, ДатаОстатков), "ДФ=yyyyMMdd");
Если ПустаяСтрока(СуффиксДатыСер) Тогда
СуффиксДатыСер = Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd");
КонецЕсли;
КэшТребуетсяСерия = Новый Соответствие;
КэшСерий = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
СтрТ.Сопоставлено = Ложь;
СтрТ.КомментарийСопоставления = "";
СтрТ.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
СтрТ.Склад = Справочники.Склады.ПустаяСсылка();
СтрТ.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
СтрТ.СерияСсылка = Справочники.СерииНоменклатуры.ПустаяСсылка();
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.ПустаяСсылка();
СтрТ.Соглашение = Справочники.СоглашенияСКлиентами.ПустаяСсылка();
СтрТ.Партнер = Справочники.Партнеры.ПустаяСсылка();
СтрТ.Контрагент = Справочники.Контрагенты.ПустаяСсылка();
СтрТ.Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
Ном = НайтиНоменклатуруСтроки(СтрТ);
Если Не ЗначениеЗаполнено(Ном) Тогда
СтрТ.КомментарийСопоставления = "Номенклатура не найдена";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Номенклатура = Ном;
СкладЦель = НайтиСкладСтроки(СтрТ);
Если ЗначениеЗаполнено(СкладЦель) Тогда
СтрТ.Склад = СкладЦель;
КонецЕсли;
Согл = НайтиСоглашениеСтроки(СтрТ);
Если Не ЗначениеЗаполнено(Согл) Тогда
СтрТ.КомментарийСопоставления = "Соглашение не найдено";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Соглашение = Согл;
ЗаполнитьПартнераКонтрагентаДоговорСтроки(СтрТ, Согл);
Если Не ЗначениеЗаполнено(СтрТ.Партнер) Тогда
СтрТ.КомментарийСопоставления = "Партнер / комиссионер не найден";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
Хар = НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат);
СтрТ.Характеристика = Хар;
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СтрТ.Склад, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
СтрТ.КомментарийСопоставления = "OK";
КонецЕсли;
Результат.Сопоставлено = Результат.Сопоставлено + 1;
КонецЦикла;
Возврат Результат;
КонецФункции
// Создание документов ВводОстатковТоваров по сопоставленным строкам.
// Собственные — 1 документ на склад; комиссия 2.5 — 1 документ на соглашение+партнёра (без склада).
// Себестоимость не заполняется (нет данных в API) — только оперативный учёт количества.
//
// Параметры:
// РежимТест - Булево - только подсчёт без записи
//
// Возвращаемое значение:
// Структура - СозданоДокументов, УдаленоДокументов, СтрокВДокументах, Пропущено, Ошибок, ТекстТега
// Структура - СозданоДокументов, СозданоДокументовКомиссии, УдаленоДокументов,
// СтрокВДокументах, СтрокКомиссии, Пропущено, Ошибок, ТекстТега
//
Функция СоздатьДокументыВводаОстатков(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("СозданоДокументов", 0);
Результат.Вставить("СозданоДокументовКомиссии", 0);
Результат.Вставить("УдаленоДокументов", 0);
Результат.Вставить("СтрокВДокументах", 0);
Результат.Вставить("СтрокКомиссии", 0);
Результат.Вставить("Пропущено", 0);
Результат.Вставить("Ошибок", 0);
Результат.Вставить("ТекстТега", "");
@@ -142,12 +263,13 @@
ТекстТега = ТегКомментарияДокументов();
Результат.ТекстТега = ТекстТега;
СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу();
Если СтрокиПоСкладу.Количество() = 0 Тогда
Возврат Результат;
КонецЕсли;
СозданныеДокументы.Очистить();
Если ПерезаписатьДокументы И Не РежимТест Тогда
СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу();
СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии();
Если ПерезаписатьДокументы И Не РежимТест
И (СтрокиПоСкладу.Количество() > 0 Или СтрокиКомиссии.Количество() > 0) Тогда
Результат.УдаленоДокументов = УдалитьПрежниеДокументыВолны(ТекстТега);
КонецЕсли;
@@ -163,6 +285,8 @@
Если РежимТест Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество();
ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)), Истина);
Продолжить;
КонецЕсли;
@@ -174,6 +298,43 @@
СтрТ.ДокументВвода = Док.Ссылка;
СтрТ.ЗагруженоВДокумент = Истина;
КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, Док.Комментарий, Ложь);
КонецЕсли;
Исключение
Результат.Ошибок = Результат.Ошибок + 1;
КонецПопытки;
КонецЦикла;
Для Каждого ЭлементГруппы Из СтрокиКомиссии Цикл
СтрокиГруппы = ЭлементГруппы.Значение;
Если СтрокиГруппы.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Попытка
Если РежимТест Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество();
Первая = СтрокиГруппы[0];
ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено,
Первая.Соглашение, Первая.Партнер, СтрокиГруппы,
ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)), Истина);
Продолжить;
КонецЕсли;
Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега);
Если ЗначениеЗаполнено(Док) Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + Док.Товары.Количество();
Для Каждого СтрТ Из СтрокиГруппы Цикл
СтрТ.ДокументВвода = Док.Ссылка;
СтрТ.ЗагруженоВДокумент = Истина;
КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Комиссия 2.5", Неопределено,
Док.СоглашениеСКомиссионером, Док.Партнер, СтрокиГруппы, Док.Комментарий, Ложь);
КонецЕсли;
Исключение
Результат.Ошибок = Результат.Ошибок + 1;
@@ -189,6 +350,33 @@
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьВСозданныеДокументы(ДокументСсылка, ВидОстатков, Склад, Соглашение, Партнер, СтрокиТоваров, Комментарий, ЭтоТест)
НовСтр = СозданныеДокументы.Добавить();
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
НовСтр.Документ = ДокументСсылка;
КонецЕсли;
НовСтр.ВидОстатков = ВидОстатков;
Если ЗначениеЗаполнено(Склад) Тогда
НовСтр.Склад = Склад;
КонецЕсли;
Если ЗначениеЗаполнено(Соглашение) Тогда
НовСтр.Соглашение = Соглашение;
КонецЕсли;
Если ЗначениеЗаполнено(Партнер) Тогда
НовСтр.Партнер = Партнер;
КонецЕсли;
НовСтр.КоличествоСтрок = СтрокиТоваров.Количество();
Колво = 0;
Для Каждого СтрТ Из СтрокиТоваров Цикл
Колво = Колво + СтрТ.Количество;
КонецЦикла;
НовСтр.КоличествоТоваров = Колво;
НовСтр.Комментарий = Комментарий;
НовСтр.ЭтоТест = ЭтоТест;
КонецПроцедуры
Функция ТегКомментарияДокументов()
Суффикс = Формат(ДатаДокументовВвода, "ДФ=yyyyMMdd");
@@ -202,7 +390,7 @@
Функция СгруппироватьСопоставленныеСтрокиПоСкладу()
Группы = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеДанные Цикл
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
Если Не СтрТ.Сопоставлено Тогда
Продолжить;
КонецЕсли;
@@ -223,7 +411,7 @@
// Переключить ключи на ссылки складов для удобства обхода.
Результат = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеДанные Цикл
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
Если Не СтрТ.Сопоставлено Или Не ЗначениеЗаполнено(СтрТ.Склад) Тогда
Продолжить;
КонецЕсли;
@@ -237,6 +425,33 @@
КонецФункции
Функция СгруппироватьСопоставленныеСтрокиКомиссии()
Группы = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
Если Не СтрТ.Сопоставлено Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.Соглашение) Или Не ЗначениеЗаполнено(СтрТ.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Если СтрТ.Количество <= 0 Тогда
Продолжить;
КонецЕсли;
КлючГруппы = Строка(СтрТ.Соглашение.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Партнер.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Договор.УникальныйИдентификатор());
СтрокиГруппы = Группы.Получить(КлючГруппы);
Если СтрокиГруппы = Неопределено Тогда
СтрокиГруппы = Новый Массив;
Группы.Вставить(КлючГруппы, СтрокиГруппы);
КонецЕсли;
СтрокиГруппы.Добавить(СтрТ);
КонецЦикла;
Возврат Группы;
КонецФункции
Функция УдалитьПрежниеДокументыВолны(ТекстТега)
Удалено = 0;
@@ -251,7 +466,9 @@
| И НЕ Ввод.Проведен
| И Ввод.Организация = &Организация
| И Ввод.Комментарий ПОДОБНО &Тег
| И Ввод.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВводОстатковСобственныхТоваров)";
| И Ввод.ХозяйственнаяОперация В (
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВводОстатковСобственныхТоваров),
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВводОстатковТоваровПереданныхНаКомиссию2_5))";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Тег", "%" + ТекстТега + "%");
@@ -301,29 +518,7 @@
КонецПопытки;
Для Каждого СтрТ Из СтрокиСклада Цикл
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Характеристика = СтрТ.Характеристика;
НовСтр.Серия = СтрТ.СерияСсылка;
НовСтр.Количество = СтрТ.Количество;
НовСтр.КоличествоУпаковок = СтрТ.Количество;
НовСтр.Цена = 0;
НовСтр.Сумма = 0;
Попытка
НовСтр.СтавкаНДС = СтрТ.Номенклатура.СтавкаНДС;
Исключение
КонецПопытки;
Если ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
НовСтр.НомерГТД = СтрТ.НомерГТДСсылка;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
СтрСер = Док.Серии.Добавить();
СтрСер.Номенклатура = НовСтр.Номенклатура;
СтрСер.Характеристика = НовСтр.Характеристика;
СтрСер.Серия = СтрТ.СерияСсылка;
СтрСер.Количество = НовСтр.Количество;
СтрСер.КоличествоУпаковок = НовСтр.Количество;
КонецЕсли;
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
Если Док.Товары.Количество() = 0 Тогда
@@ -343,6 +538,86 @@
КонецФункции
Функция СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега)
Первая = СтрокиГруппы[0];
Док = Документы.ВводОстатковТоваров.СоздатьДокумент();
Док.Дата = ДатаДокументовВвода;
Док.Организация = Организация;
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковТоваровПереданныхНаКомиссию2_5;
Док.СоглашениеСКомиссионером = Первая.Соглашение;
Док.Партнер = Первая.Партнер;
Док.Контрагент = Первая.Контрагент;
Док.Договор = Первая.Договор;
Док.Комментарий = ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер));
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = Ложь;
Док.ЦенаВключаетНДС = Ложь;
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
Если Не ЗначениеЗаполнено(Док.НалогообложениеНДС) Тогда
Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
КонецЕсли;
Попытка
ПараметрыНДС = Документы.ВводОстатковТоваров.ИнициализироватьПараметрыВидовДеятельностиНДС(Док);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(Док.ВидДеятельностиНДС, ПараметрыНДС);
Исключение
КонецПопытки;
Для Каждого СтрТ Из СтрокиГруппы Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
Если Док.Товары.Количество() = 0 Тогда
Возврат Документы.ВводОстатковТоваров.ПустаяСсылка();
КонецЕсли;
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(Док, "Товары");
Попытка
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(Док, Документы.ВводОстатковТоваров);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Док, ПараметрыУказанияСерий);
Исключение
КонецПопытки;
Док.ОбменДанными.Загрузка = Ложь;
Док.Записать(РежимЗаписиДокумента.Запись);
Возврат Док;
КонецФункции
Процедура ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ)
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Характеристика = СтрТ.Характеристика;
НовСтр.Серия = СтрТ.СерияСсылка;
НовСтр.Количество = СтрТ.Количество;
НовСтр.КоличествоУпаковок = СтрТ.Количество;
НовСтр.Цена = 0;
НовСтр.Сумма = 0;
Попытка
НовСтр.СтавкаНДС = СтрТ.Номенклатура.СтавкаНДС;
Исключение
КонецПопытки;
Если ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
НовСтр.НомерГТД = СтрТ.НомерГТДСсылка;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
СтрСер = Док.Серии.Добавить();
СтрСер.Номенклатура = НовСтр.Номенклатура;
СтрСер.Характеристика = НовСтр.Характеристика;
СтрСер.Серия = СтрТ.СерияСсылка;
СтрСер.Количество = НовСтр.Количество;
СтрСер.КоличествоУпаковок = НовСтр.Количество;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI)
НовСтр.НоменклатураИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "nomenclature_guid", ""));
@@ -364,6 +639,10 @@
НовСтр.СерияИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "series_guid", ""));
НовСтр.Серия = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_name", "")));
НовСтр.СерияНомер = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_number", "")));
Если ПустаяСтрока(НовСтр.Серия) И Не ПустаяСтрока(НовСтр.СерияНомер) Тогда
НовСтр.Серия = НовСтр.СерияНомер;
КонецЕсли;
НовСтр.ГТДИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "gtd_guid", ""));
НовСтр.ГТД = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_name", "")));
@@ -492,44 +771,169 @@
КонецФункции
Функция НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия)
КлючТребСер = Строка(Ном.УникальныйИдентификатор());
ТребуетсяСерия = КэшТребуетсяСерия.Получить(КлючТребСер);
Если ТребуетсяСерия <> Неопределено Тогда
Возврат ТребуетсяСерия;
КонецЕсли;
ТребуетсяСерия = Ложь;
Попытка
ТребуетсяСерия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры.ИспользоватьСерии") = Истина;
Исключение
Попытка
ТребуетсяСерия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры").ИспользоватьСерии;
Исключение
КонецПопытки;
КонецПопытки;
КэшТребуетсяСерия.Вставить(КлючТребСер, ТребуетсяСерия);
Возврат ТребуетсяСерия;
КонецФункции
Процедура ЗаполнитьНомерГТДСтроки(СтрТ)
Если Не ЗначениеЗаполнено(СтрТ.ГТД) Тогда
Возврат;
КонецЕсли;
КодГТД = СокрЛП(СтрТ.ГТД);
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоКоду(КодГТД);
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоРеквизиту("РегистрационныйНомер", КодГТД);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоНаименованию(КодГТД, Истина);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СсылкаГТД = СсылкаПоUUID(Справочники.НомераГТД, СтрТ.ГТДИдентификатор);
Если ЗначениеЗаполнено(СсылкаГТД) И ОбщегоНазначения.СсылкаСуществует(СсылкаГТД) Тогда
СтрТ.НомерГТДСсылка = СсылкаГТД;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиСоглашениеСтроки(СтрТ)
Согл = СсылкаПоUUID(Справочники.СоглашенияСКлиентами, СтрТ.СоглашениеИдентификатор);
Если ЗначениеЗаполнено(Согл) И ОбщегоНазначения.СсылкаСуществует(Согл) Тогда
Возврат Согл;
КонецЕсли;
ИмяСогл = СокрЛП(СтрТ.СоглашениеНаименование);
Если ЗначениеЗаполнено(ИмяСогл) Тогда
Возврат Справочники.СоглашенияСКлиентами.НайтиПоНаименованию(ИмяСогл, Истина);
КонецЕсли;
Возврат Справочники.СоглашенияСКлиентами.ПустаяСсылка();
КонецФункции
Процедура ЗаполнитьПартнераКонтрагентаДоговорСтроки(СтрТ, Соглашение)
Партнер = СсылкаПоUUID(Справочники.Партнеры, СтрТ.ПартнерИдентификатор);
Если Не (ЗначениеЗаполнено(Партнер) И ОбщегоНазначения.СсылкаСуществует(Партнер)) Тогда
Партнер = Справочники.Партнеры.ПустаяСсылка();
ИмяПарт = СокрЛП(СтрТ.ПартнерНаименование);
Если ЗначениеЗаполнено(ИмяПарт) Тогда
Партнер = Справочники.Партнеры.НайтиПоНаименованию(ИмяПарт, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Партнер) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Партнер");
Исключение
КонецПопытки;
КонецЕсли;
СтрТ.Партнер = Партнер;
Контр = СсылкаПоUUID(Справочники.Контрагенты, СтрТ.КонтрагентИдентификатор);
Если Не (ЗначениеЗаполнено(Контр) И ОбщегоНазначения.СсылкаСуществует(Контр)) Тогда
Контр = Справочники.Контрагенты.ПустаяСсылка();
ИмяКонтр = СокрЛП(СтрТ.КонтрагентНаименование);
Если ЗначениеЗаполнено(ИмяКонтр) Тогда
Контр = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтр, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Контр = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Контрагент");
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Партнер) Тогда
Попытка
Контр = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер);
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Партнер) Тогда
ЗапросК = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| К.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК К
|ГДЕ
| К.Партнер = &Партнер
| И НЕ К.ПометкаУдаления");
ЗапросК.УстановитьПараметр("Партнер", Партнер);
ВыбК = ЗапросК.Выполнить().Выбрать();
Если ВыбК.Следующий() Тогда
Контр = ВыбК.Ссылка;
КонецЕсли;
КонецЕсли;
СтрТ.Контрагент = Контр;
Договор = СсылкаПоUUID(Справочники.ДоговорыКонтрагентов, СтрТ.ДоговорИдентификатор);
Если Не (ЗначениеЗаполнено(Договор) И ОбщегоНазначения.СсылкаСуществует(Договор)) Тогда
Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
ИмяДог = СокрЛП(СтрТ.ДоговорНаименование);
Если ЗначениеЗаполнено(ИмяДог) Тогда
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(ИмяДог, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Договор) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Договор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Договор");
Исключение
КонецПопытки;
КонецЕсли;
СтрТ.Договор = Договор;
КонецПроцедуры
Функция НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат)
Сер = Справочники.СерииНоменклатуры.ПустаяСсылка();
ВидНом = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры");
КлючТребСер = Строка(Ном.УникальныйИдентификатор());
ТребуетсяСерия = КэшТребуетсяСерия.Получить(КлючТребСер);
Если ТребуетсяСерия = Неопределено Тогда
ТребуетсяСерия = Ложь;
Попытка
ТребуетсяСерия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры.ИспользоватьСерии") = Истина;
Исключение
Попытка
ТребуетсяСерия = ВидНом.ИспользоватьСерии;
Исключение
КонецПопытки;
КонецПопытки;
КэшТребуетсяСерия.Вставить(КлючТребСер, ТребуетсяСерия);
КонецЕсли;
ТребуетсяСерия = НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия);
ИмяСерии = СокрЛП(СтрТ.Серия);
Если Не ЗначениеЗаполнено(ИмяСерии) И ТребуетсяСерия Тогда
КодСклЗагл = "";
Попытка
КодСклЗагл = СокрЛП(Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СкладЦель, "Код")));
Исключение
КодСклЗагл = "";
КонецПопытки;
Если ПустаяСтрока(КодСклЗагл) Тогда
КодСклЗагл = Лев(СтрЗаменить(Строка(СкладЦель.УникальныйИдентификатор()), "-", ""), 8);
НомерСерии = СокрЛП(СтрТ.СерияНомер);
ЭтоЗаглушка = Ложь;
Если Не ЗначениеЗаполнено(ИмяСерии) И Не ЗначениеЗаполнено(НомерСерии) Тогда
Если Не ТребуетсяСерия Тогда
Возврат Сер;
КонецЕсли;
Если Не СоздаватьЗаглушкиСерий Тогда
СтрТ.КомментарийСопоставления = "Серия обязательна, в источнике пустая (заглушки выключены)";
Возврат Сер;
КонецЕсли;
КодСклЗагл = "КОМ";
Если ЗначениеЗаполнено(СкладЦель) Тогда
Попытка
КодСклЗагл = СокрЛП(Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СкладЦель, "Код")));
Исключение
КодСклЗагл = "";
КонецПопытки;
Если ПустаяСтрока(КодСклЗагл) Тогда
КодСклЗагл = Лев(СтрЗаменить(Строка(СкладЦель.УникальныйИдентификатор()), "-", ""), 8);
КонецЕсли;
КонецЕсли;
ИмяСерии = "Перенос_" + КодСклЗагл + "_" + СуффиксДатыСер;
СтрТ.Серия = ИмяСерии;
КонецЕсли;
Если Не ТребуетсяСерия И Не ЗначениеЗаполнено(ИмяСерии) Тогда
Возврат Сер;
ЭтоЗаглушка = Истина;
КонецЕсли;
СсылкаПоГуид = СсылкаПоUUID(Справочники.СерииНоменклатуры, СтрТ.СерияИдентификатор);
@@ -550,25 +954,34 @@
ВидСер = ВидНом;
КонецЕсли;
КлючКэшСер = Строка(ВидСер.УникальныйИдентификатор()) + "|" + ИмяСерии;
КлючПоискаНомера = ?(ЗначениеЗаполнено(НомерСерии), НомерСерии, ИмяСерии);
КлючКэшСер = Строка(ВидСер.УникальныйИдентификатор()) + "|" + ИмяСерии + "|" + КлючПоискаНомера;
СерИзКэш = КэшСерий.Получить(КлючКэшСер);
Если СерИзКэш <> Неопределено Тогда
Возврат СерИзКэш;
КонецЕсли;
Если ИспНомерСерии Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоРеквизиту("Номер", ИмяСерии, , ВидСер);
Если ИспНомерСерии И ЗначениеЗаполнено(КлючПоискаНомера) Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоРеквизиту("Номер", КлючПоискаНомера, , ВидСер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) Тогда
Если Не ЗначениеЗаполнено(Сер) И ЗначениеЗаполнено(ИмяСерии) Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(ИмяСерии, Истина, , ВидСер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И ЗначениеЗаполнено(НомерСерии) И НомерСерии <> ИмяСерии Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(НомерСерии, Истина, , ВидСер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И Не РежимТест И (ТребуетсяСерия Или ЗначениеЗаполнено(ИмяСерии)) Тогда
МожноСоздать = Не РежимТест И ЗначениеЗаполнено(ИмяСерии);
Если ЭтоЗаглушка Тогда
МожноСоздать = МожноСоздать И СоздаватьЗаглушкиСерий;
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И МожноСоздать Тогда
Попытка
ОбСер = Справочники.СерииНоменклатуры.ПустойОбъект(ВидСер);
Если ИспНомерСерии Тогда
НомерСер = ИмяСерии;
Если СтрНачинаетсяС(ИмяСерии, "Перенос_") Тогда
НомерСер = КлючПоискаНомера;
Если ЭтоЗаглушка И СтрНачинаетсяС(ИмяСерии, "Перенос_") Тогда
НомерСер = Сред(ИмяСерии, СтрДлина("Перенос_") + 1);
КонецЕсли;
ОбСер.Номер = НомерСер;