Files
crm3_26.rhana/src/DataProcessors/РК_ЗагрузкаОстатков/Ext/ObjectModule.bsl
T
mihailkudravcev 9cd242af48 РК_ЗагрузкаОстатков 1.3.1.102: свернуть комиссионные остатки (#19).
Команда на форме: пары −/+ без/с серией и группы net≈0 перед сопоставлением.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 12:44:31 +03:00

1332 lines
80 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// Заполняет ТЧ ВходящиеСобственныеТовары строками остатков Transfer API (mode=combined по умолчанию).
//
Процедура ЗаполнитьВходящиеСобственныеТоварыИзОтветаОстатков(ОтветAPI, ОчищатьПередЗаполнением = Истина) Экспорт
Если ОчищатьПередЗаполнением Тогда
ВходящиеСобственныеТовары.Очистить();
КонецЕсли;
СтрокиОтвета = Неопределено;
Если ТипЗнч(ОтветAPI) = Тип("Структура") Или ТипЗнч(ОтветAPI) = Тип("Соответствие") Тогда
СтрокиОтвета = ЗначениеСвойства(ОтветAPI, "rows", Неопределено);
КонецЕсли;
Если ТипЗнч(СтрокиОтвета) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаAPI Из СтрокиОтвета Цикл
НовСтр = ВходящиеСобственныеТовары.Добавить();
ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI);
КонецЦикла;
КонецПроцедуры
// Заполняет ТЧ ВходящиеКомиссионныеТовары остатками 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", "")));
НовСтр.НазначениеИдентификатор = 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", Ложь));
КонецЦикла;
КонецПроцедуры
// Сопоставление строк ТЧ с НСИ целевой ИБ.
// Серии создаются только если не найдены; заглушки Перенос_* — только при СоздаватьЗаглушкиСерий.
//
// Параметры:
// РежимТест - Булево - Истина: только поиск, без создания серий/характеристик
//
// Возвращаемое значение:
// Структура - Сопоставлено, НеСопоставлено, СозданоСерий, СозданоХарактеристик
//
Функция СопоставитьВходящиеСобственныеТовары(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("Сопоставлено", 0);
Результат.Вставить("НеСопоставлено", 0);
Результат.Вставить("СозданоСерий", 0);
Результат.Вставить("СозданоХарактеристик", 0);
СуффиксДатыСер = Формат(?(ЗначениеЗаполнено(ДатаДокументовВвода), ДатаДокументовВвода, ДатаОстатков), "ДФ=yyyyMMdd");
Если ПустаяСтрока(СуффиксДатыСер) Тогда
СуффиксДатыСер = Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd");
КонецЕсли;
КэшТребуетсяСерия = Новый Соответствие;
КэшСерий = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
СтрТ.Сопоставлено = Ложь;
СтрТ.КомментарийСопоставления = "";
СтрТ.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
СтрТ.Склад = Справочники.Склады.ПустаяСсылка();
СтрТ.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
СтрТ.СерияСсылка = Справочники.СерииНоменклатуры.ПустаяСсылка();
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.ПустаяСсылка();
Ном = НайтиНоменклатуруСтроки(СтрТ);
Если Не ЗначениеЗаполнено(Ном) Тогда
СтрТ.КомментарийСопоставления = "Номенклатура не найдена";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Номенклатура = Ном;
СкладЦель = НайтиСкладСтроки(СтрТ);
Если Не ЗначениеЗаполнено(СкладЦель) Тогда
СтрТ.КомментарийСопоставления = "Склад не найден";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Склад = СкладЦель;
Хар = НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат);
СтрТ.Характеристика = Хар;
Если СтрТ.Количество <> 0 Тогда
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
СтрТ.КомментарийСопоставления = "OK";
КонецЕсли;
Результат.Сопоставлено = Результат.Сопоставлено + 1;
КонецЦикла;
Возврат Результат;
КонецФункции
// Сопоставление комиссионных строк (переданные 2.5): соглашение, партнёр, контрагент, договор.
// Склад не обязателен. Серии и ГТД — как в документах волны 1.
//
Функция СопоставитьВходящиеКомиссионныеТовары(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("Сопоставлено", 0);
Результат.Вставить("НеСопоставлено", 0);
Результат.Вставить("СозданоСерий", 0);
Результат.Вставить("СозданоХарактеристик", 0);
СуффиксДатыСер = Формат(?(ЗначениеЗаполнено(ДатаДокументовВвода), ДатаДокументовВвода, ДатаОстатков), "ДФ=yyyyMMdd");
Если ПустаяСтрока(СуффиксДатыСер) Тогда
СуффиксДатыСер = Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd");
КонецЕсли;
КэшТребуетсяСерия = Новый Соответствие;
КэшСерий = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
СтрТ.Сопоставлено = Ложь;
СтрТ.КомментарийСопоставления = "";
СтрТ.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
СтрТ.Склад = Справочники.Склады.ПустаяСсылка();
СтрТ.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
СтрТ.СерияСсылка = Справочники.СерииНоменклатуры.ПустаяСсылка();
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.ПустаяСсылка();
СтрТ.Соглашение = Справочники.СоглашенияСКлиентами.ПустаяСсылка();
СтрТ.Партнер = Справочники.Партнеры.ПустаяСсылка();
СтрТ.Контрагент = Справочники.Контрагенты.ПустаяСсылка();
СтрТ.Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
Ном = НайтиНоменклатуруСтроки(СтрТ);
Если Не ЗначениеЗаполнено(Ном) Тогда
СтрТ.КомментарийСопоставления = "Номенклатура не найдена";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Номенклатура = Ном;
СкладЦель = НайтиСкладСтроки(СтрТ);
Если ЗначениеЗаполнено(СкладЦель) Тогда
СтрТ.Склад = СкладЦель;
КонецЕсли;
Согл = НайтиСоглашениеСтроки(СтрТ);
Если Не ЗначениеЗаполнено(Согл) Тогда
СтрТ.КомментарийСопоставления = "Соглашение не найдено";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
СтрТ.Соглашение = Согл;
ЗаполнитьПартнераКонтрагентаДоговорСтроки(СтрТ, Согл);
Если Не ЗначениеЗаполнено(СтрТ.Партнер) Тогда
СтрТ.КомментарийСопоставления = "Партнер / комиссионер не найден";
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
Хар = НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат);
СтрТ.Характеристика = Хар;
Сер = НайтиИлиСоздатьСерию(СтрТ, Ном, СтрТ.Склад, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат);
СтрТ.СерияСсылка = Сер;
Если НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия) И Не ЗначениеЗаполнено(Сер) Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена"
+ ?(РежимТест, " (тест)", "")
+ ?(СоздаватьЗаглушкиСерий, "", "; заглушки выключены");
КонецЕсли;
Результат.НеСопоставлено = Результат.НеСопоставлено + 1;
Продолжить;
КонецЕсли;
ЗаполнитьНомерГТДСтроки(СтрТ);
СтрТ.Сопоставлено = Истина;
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда
СтрТ.КомментарийСопоставления = "OK";
КонецЕсли;
Результат.Сопоставлено = Результат.Сопоставлено + 1;
КонецЦикла;
Возврат Результат;
КонецФункции
// Схлопывает строки ТЧ ВходящиеКомиссионныеТовары:
// 1) отрицательная без серии + положительная с серией (|qty| равны) — обе удаляются;
// 2) оставшиеся группы с net qty ≈ 0 — все строки группы удаляются.
//
// Возвращаемое значение:
// Структура - БылоСтрок, СталоСтрок, УдаленоСтрок, УдаленоПар, УдаленоГруппNetZero
//
Функция СвернутьКомиссионныеОстатки() Экспорт
Результат = Новый Структура;
Результат.Вставить("БылоСтрок", ВходящиеКомиссионныеТовары.Количество());
Результат.Вставить("СталоСтрок", 0);
Результат.Вставить("УдаленоСтрок", 0);
Результат.Вставить("УдаленоПар", 0);
Результат.Вставить("УдаленоГруппNetZero", 0);
Если Результат.БылоСтрок = 0 Тогда
Возврат Результат;
КонецЕсли;
Удаляемые = Новый Соответствие;
Группы = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
Ключ = КлючАналитикиКомиссионнойСтроки(СтрТ);
СтрокиГруппы = Группы.Получить(Ключ);
Если СтрокиГруппы = Неопределено Тогда
СтрокиГруппы = Новый Массив;
Группы.Вставить(Ключ, СтрокиГруппы);
КонецЕсли;
СтрокиГруппы.Добавить(СтрТ);
КонецЦикла;
Для Каждого ЭлементГруппы Из Группы Цикл
СтрокиГруппы = ЭлементГруппы.Значение;
Помеченные = Новый Соответствие;
Отрицательные = Новый Массив;
ПоложительныеССерией = Новый Массив;
Для Каждого СтрТ Из СтрокиГруппы Цикл
Если Помеченные.Получить(СтрТ) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Кол = СтрТ.Количество;
Если Кол < 0 И Не СерияЗаполненаВСтрокеКомиссии(СтрТ) Тогда
Отрицательные.Добавить(СтрТ);
ИначеЕсли Кол > 0 И СерияЗаполненаВСтрокеКомиссии(СтрТ) Тогда
ПоложительныеССерией.Добавить(СтрТ);
КонецЕсли;
КонецЦикла;
Для Каждого НегСтр Из Отрицательные Цикл
Если Помеченные.Получить(НегСтр) <> Неопределено Тогда
Продолжить;
КонецЕсли;
НужноеКол = -НегСтр.Количество;
Для Каждого ПозСтр Из ПоложительныеССерией Цикл
Если Помеченные.Получить(ПозСтр) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если ПозСтр.Количество = НужноеКол Тогда
Помеченные.Вставить(НегСтр, Истина);
Помеченные.Вставить(ПозСтр, Истина);
Результат.УдаленоПар = Результат.УдаленоПар + 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Остаток = Новый Массив;
СуммаКол = 0;
Для Каждого СтрТ Из СтрокиГруппы Цикл
Если Помеченные.Получить(СтрТ) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Остаток.Добавить(СтрТ);
СуммаКол = СуммаКол + СтрТ.Количество;
КонецЦикла;
Если Остаток.Количество() > 1 И Abs(СуммаКол) < 0.000001 Тогда
Для Каждого СтрТ Из Остаток Цикл
Помеченные.Вставить(СтрТ, Истина);
КонецЦикла;
Результат.УдаленоГруппNetZero = Результат.УдаленоГруппNetZero + 1;
КонецЕсли;
Для Каждого ЭлементПометки Из Помеченные Цикл
Удаляемые.Вставить(ЭлементПометки.Ключ, Истина);
КонецЦикла;
КонецЦикла;
Для Инд = ВходящиеКомиссионныеТовары.Количество() - 1 По 0 Цикл
СтрТ = ВходящиеКомиссионныеТовары[Инд];
Если Удаляемые.Получить(СтрТ) <> Неопределено Тогда
ВходящиеКомиссионныеТовары.Удалить(Инд);
КонецЕсли;
КонецЦикла;
Результат.УдаленоСтрок = Удаляемые.Количество();
Результат.СталоСтрок = ВходящиеКомиссионныеТовары.Количество();
Возврат Результат;
КонецФункции
// Создание документов ВводОстатковТоваров по сопоставленным строкам.
// Собственные — 1 документ на склад; комиссия 2.5 — 1 документ на соглашение+партнёра (без склада).
// Количество в документе — финансовое (rh_), если не 0, иначе складское.
// Себестоимость — из rh_ (сумма USD, СуммаРегл). Серии и ГТД — у собственных и комиссии.
//
// Параметры:
// РежимТест - Булево - только подсчёт без записи
//
// Возвращаемое значение:
// Структура - СозданоДокументов, СозданоДокументовКомиссии, УдаленоДокументов,
// СтрокВДокументах, СтрокКомиссии, Пропущено, Ошибок, ТекстТега
//
Функция СоздатьДокументыВводаОстатков(РежимТест = Истина) Экспорт
Результат = Новый Структура;
Результат.Вставить("СозданоДокументов", 0);
Результат.Вставить("СозданоДокументовКомиссии", 0);
Результат.Вставить("УдаленоДокументов", 0);
Результат.Вставить("СтрокВДокументах", 0);
Результат.Вставить("СтрокКомиссии", 0);
Результат.Вставить("Пропущено", 0);
Результат.Вставить("Ошибок", 0);
Результат.Вставить("ТекстТега", "");
Если Не ЗначениеЗаполнено(Организация) Тогда
ВызватьИсключение "Укажите организацию для документов ввода остатков";
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаДокументовВвода) Тогда
ВызватьИсключение "Укажите дату документов ввода";
КонецЕсли;
ТекстТега = ТегКомментарияДокументов();
Результат.ТекстТега = ТекстТега;
СозданныеДокументы.Очистить();
СтрокиПоСкладу = СгруппироватьСопоставленныеСтрокиПоСкладу();
СтрокиКомиссии = СгруппироватьСопоставленныеСтрокиКомиссии();
Если ПерезаписатьДокументы И Не РежимТест
И (СтрокиПоСкладу.Количество() > 0 Или СтрокиКомиссии.Количество() > 0) Тогда
Результат.УдаленоДокументов = УдалитьПрежниеДокументыВолны(ТекстТега);
КонецЕсли;
Для Каждого ЭлементСклада Из СтрокиПоСкладу Цикл
СкладДок = ЭлементСклада.Ключ;
СтрокиСклада = ЭлементСклада.Значение;
Если СтрокиСклада.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Попытка
Если РежимТест Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + СтрокиСклада.Количество();
ДобавитьВСозданныеДокументы(Неопределено, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, ТекстТега + ", склад " + СокрЛП(Строка(СкладДок)), Истина);
Продолжить;
КонецЕсли;
Док = СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега);
Если ЗначениеЗаполнено(Док) Тогда
Результат.СозданоДокументов = Результат.СозданоДокументов + 1;
Результат.СтрокВДокументах = Результат.СтрокВДокументах + Док.Товары.Количество();
Для Каждого СтрТ Из СтрокиСклада Цикл
СтрТ.ДокументВвода = Док.Ссылка;
СтрТ.ЗагруженоВДокумент = Истина;
КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Собственные", СкладДок,
Неопределено, Неопределено, СтрокиСклада, Док.Комментарий, Ложь);
КонецЕсли;
Исключение
Результат.Ошибок = Результат.Ошибок + 1;
КонецПопытки;
КонецЦикла;
Для Каждого ЭлементГруппы Из СтрокиКомиссии Цикл
СтрокиГруппы = ЭлементГруппы.Значение;
Если СтрокиГруппы.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Попытка
Если РежимТест Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + СтрокиГруппы.Количество();
Первая = СтрокиГруппы[0];
ДобавитьВСозданныеДокументы(Неопределено, "Комиссия 2.5", Неопределено,
Первая.Соглашение, Первая.Партнер, СтрокиГруппы,
ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер)), Истина);
Продолжить;
КонецЕсли;
Док = СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега);
Если ЗначениеЗаполнено(Док) Тогда
Результат.СозданоДокументовКомиссии = Результат.СозданоДокументовКомиссии + 1;
Результат.СтрокКомиссии = Результат.СтрокКомиссии + Док.Товары.Количество();
Для Каждого СтрТ Из СтрокиГруппы Цикл
СтрТ.ДокументВвода = Док.Ссылка;
СтрТ.ЗагруженоВДокумент = Истина;
КонецЦикла;
ДобавитьВСозданныеДокументы(Док.Ссылка, "Комиссия 2.5", Неопределено,
Док.СоглашениеСКомиссионером, Док.Партнер, СтрокиГруппы, Док.Комментарий, Ложь);
КонецЕсли;
Исключение
Результат.Ошибок = Результат.Ошибок + 1;
КонецПопытки;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьВСозданныеДокументы(ДокументСсылка, ВидОстатков, Склад, Соглашение, Партнер, СтрокиТоваров, Комментарий, ЭтоТест)
НовСтр = СозданныеДокументы.Добавить();
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
НовСтр.Документ = ДокументСсылка;
КонецЕсли;
НовСтр.ВидОстатков = ВидОстатков;
Если ЗначениеЗаполнено(Склад) Тогда
НовСтр.Склад = Склад;
КонецЕсли;
Если ЗначениеЗаполнено(Соглашение) Тогда
НовСтр.Соглашение = Соглашение;
КонецЕсли;
Если ЗначениеЗаполнено(Партнер) Тогда
НовСтр.Партнер = Партнер;
КонецЕсли;
НовСтр.КоличествоСтрок = СтрокиТоваров.Количество();
Колво = 0;
Для Каждого СтрТ Из СтрокиТоваров Цикл
Колво = Колво + СтрТ.Количество;
КонецЦикла;
НовСтр.КоличествоТоваров = Колво;
НовСтр.Комментарий = Комментарий;
НовСтр.ЭтоТест = ЭтоТест;
КонецПроцедуры
Функция ТегКомментарияДокументов()
Суффикс = Формат(ДатаДокументовВвода, "ДФ=yyyyMMdd");
Если ПустаяСтрока(Суффикс) Тогда
Суффикс = Формат(ДатаОстатков, "ДФ=yyyyMMdd");
КонецЕсли;
Возврат "РК_ПереносОстатков " + Суффикс;
КонецФункции
Функция СгруппироватьСопоставленныеСтрокиПоСкладу()
Группы = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
Если Не СтрТ.Сопоставлено Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.Склад) Или Не ЗначениеЗаполнено(СтрТ.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Если СтрТ.Количество <= 0 Тогда
Продолжить;
КонецЕсли;
КлючСклада = Строка(СтрТ.Склад.УникальныйИдентификатор());
СтрокиСклада = Группы.Получить(КлючСклада);
Если СтрокиСклада = Неопределено Тогда
СтрокиСклада = Новый Массив;
Группы.Вставить(КлючСклада, СтрокиСклада);
КонецЕсли;
СтрокиСклада.Добавить(СтрТ);
КонецЦикла;
// Переключить ключи на ссылки складов для удобства обхода.
Результат = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеСобственныеТовары Цикл
Если Не СтрТ.Сопоставлено Или Не ЗначениеЗаполнено(СтрТ.Склад) Тогда
Продолжить;
КонецЕсли;
КлючСклада = Строка(СтрТ.Склад.УникальныйИдентификатор());
СтрокиСклада = Группы.Получить(КлючСклада);
Если СтрокиСклада <> Неопределено И Результат.Получить(СтрТ.Склад) = Неопределено Тогда
Результат.Вставить(СтрТ.Склад, СтрокиСклада);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция СгруппироватьСопоставленныеСтрокиКомиссии()
Группы = Новый Соответствие;
Для Каждого СтрТ Из ВходящиеКомиссионныеТовары Цикл
Если Не СтрТ.Сопоставлено Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.Соглашение) Или Не ЗначениеЗаполнено(СтрТ.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Если СтрТ.Количество <= 0 Тогда
Продолжить;
КонецЕсли;
КлючГруппы = Строка(СтрТ.Соглашение.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Партнер.УникальныйИдентификатор())
+ "|" + Строка(СтрТ.Договор.УникальныйИдентификатор());
СтрокиГруппы = Группы.Получить(КлючГруппы);
Если СтрокиГруппы = Неопределено Тогда
СтрокиГруппы = Новый Массив;
Группы.Вставить(КлючГруппы, СтрокиГруппы);
КонецЕсли;
СтрокиГруппы.Добавить(СтрТ);
КонецЦикла;
Возврат Группы;
КонецФункции
Функция УдалитьПрежниеДокументыВолны(ТекстТега)
Удалено = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ввод.Ссылка КАК Ссылка
|ИЗ
| Документ.ВводОстатковТоваров КАК Ввод
|ГДЕ
| НЕ Ввод.ПометкаУдаления
| И НЕ Ввод.Проведен
| И Ввод.Организация = &Организация
| И Ввод.Комментарий ПОДОБНО &Тег
| И Ввод.ХозяйственнаяОперация В (
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВводОстатковСобственныхТоваров),
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВводОстатковТоваровПереданныхНаКомиссию2_5))";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Тег", "%" + ТекстТега + "%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ДокОб = Выборка.Ссылка.ПолучитьОбъект();
ДокОб.Удалить();
Удалено = Удалено + 1;
Исключение
КонецПопытки;
КонецЦикла;
Возврат Удалено;
КонецФункции
Функция СоздатьДокументПоСкладу(СкладДок, СтрокиСклада, ТекстТега)
Док = Документы.ВводОстатковТоваров.СоздатьДокумент();
Док.Дата = ДатаДокументовВвода;
Док.Организация = Организация;
Док.Склад = СкладДок;
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковСобственныхТоваров;
Док.Комментарий = ТекстТега + ", склад " + СокрЛП(Строка(СкладДок));
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиСклада);
Док.ЦенаВключаетНДС = Ложь;
Попытка
Док.Подразделение = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СкладДок, "Подразделение");
Исключение
КонецПопытки;
Если Док.ОтражатьСебестоимость Тогда
Попытка
Док.Валюта = Константы.ВалютаУправленческогоУчета.Получить();
Исключение
Док.Валюта = Неопределено;
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Валюта) Тогда
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.НалогообложениеНДС) Тогда
Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
КонецЕсли;
Попытка
ПараметрыНДС = Документы.ВводОстатковТоваров.ИнициализироватьПараметрыВидовДеятельностиНДС(Док);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(Док.ВидДеятельностиНДС, ПараметрыНДС);
Исключение
КонецПопытки;
Для Каждого СтрТ Из СтрокиСклада Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
Если Док.Товары.Количество() = 0 Тогда
Возврат Документы.ВводОстатковТоваров.ПустаяСсылка();
КонецЕсли;
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(Док, "Товары");
Попытка
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(Док, Документы.ВводОстатковТоваров);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Док, ПараметрыУказанияСерий);
Исключение
КонецПопытки;
Док.ОбменДанными.Загрузка = Ложь;
Док.Записать(РежимЗаписиДокумента.Запись);
Возврат Док;
КонецФункции
Функция СоздатьДокументКомиссии(СтрокиГруппы, ТекстТега)
Первая = СтрокиГруппы[0];
Док = Документы.ВводОстатковТоваров.СоздатьДокумент();
Док.Дата = ДатаДокументовВвода;
Док.Организация = Организация;
Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВводОстатковТоваровПереданныхНаКомиссию2_5;
Док.СоглашениеСКомиссионером = Первая.Соглашение;
Док.Партнер = Первая.Партнер;
Док.Контрагент = Первая.Контрагент;
Док.Договор = Первая.Договор;
Док.Комментарий = ТекстТега + ", комиссия 2.5, " + СокрЛП(Строка(Первая.Партнер));
Док.ОтражатьВОперативномУчете = Истина;
Док.ОтражатьСебестоимость = ЕстьСтоимостьВСтроках(СтрокиГруппы);
Док.ЦенаВключаетНДС = Ложь;
Если Док.ОтражатьСебестоимость Тогда
Попытка
Док.Валюта = Константы.ВалютаУправленческогоУчета.Получить();
Исключение
Док.Валюта = Неопределено;
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.Валюта) Тогда
Попытка
Док.Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
Исключение
Док.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Док.НалогообложениеНДС) Тогда
Док.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
КонецЕсли;
Попытка
ПараметрыНДС = Документы.ВводОстатковТоваров.ИнициализироватьПараметрыВидовДеятельностиНДС(Док);
УчетНДСУП.ЗаполнитьВидДеятельностиНДС(Док.ВидДеятельностиНДС, ПараметрыНДС);
Исключение
КонецПопытки;
Для Каждого СтрТ Из СтрокиГруппы Цикл
ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ);
КонецЦикла;
Если Док.Товары.Количество() = 0 Тогда
Возврат Документы.ВводОстатковТоваров.ПустаяСсылка();
КонецЕсли;
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(Док, "Товары");
Попытка
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(Док, Документы.ВводОстатковТоваров);
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Док, ПараметрыУказанияСерий);
Исключение
КонецПопытки;
Док.ОбменДанными.Загрузка = Ложь;
Док.Записать(РежимЗаписиДокумента.Запись);
Возврат Док;
КонецФункции
Процедура ДобавитьСтрокуТоваровДокументаВвода(Док, СтрТ)
КолДок = СтрТ.КоличествоОрганизации;
Если КолДок = 0 Тогда
КолДок = СтрТ.Количество;
КонецЕсли;
Если КолДок = 0 Тогда
Возврат;
КонецЕсли;
НовСтр = Док.Товары.Добавить();
НовСтр.Номенклатура = СтрТ.Номенклатура;
НовСтр.Характеристика = СтрТ.Характеристика;
НовСтр.Серия = СтрТ.СерияСсылка;
НовСтр.Количество = КолДок;
НовСтр.КоличествоУпаковок = КолДок;
НовСтр.Сумма = СтрТ.Стоимость;
Если КолДок <> 0 И СтрТ.Стоимость <> 0 Тогда
НовСтр.Цена = Окр(СтрТ.Стоимость / КолДок, 2);
Иначе
НовСтр.Цена = 0;
КонецЕсли;
Попытка
НовСтр.СуммаРегл = СтрТ.СтоимостьРегл;
Исключение
КонецПопытки;
Попытка
НовСтр.СтавкаНДС = СтрТ.Номенклатура.СтавкаНДС;
Исключение
КонецПопытки;
Если ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
НовСтр.НомерГТД = СтрТ.НомерГТДСсылка;
КонецЕсли;
Если ЗначениеЗаполнено(СтрТ.СерияСсылка) Тогда
СтрСер = Док.Серии.Добавить();
СтрСер.Номенклатура = НовСтр.Номенклатура;
СтрСер.Характеристика = НовСтр.Характеристика;
СтрСер.Серия = СтрТ.СерияСсылка;
СтрСер.Количество = НовСтр.Количество;
СтрСер.КоличествоУпаковок = НовСтр.Количество;
КонецЕсли;
КонецПроцедуры
Функция ЕстьСтоимостьВСтроках(Строки)
Для Каждого СтрТ Из Строки Цикл
Если СтрТ.Стоимость <> 0 Или СтрТ.СтоимостьРегл <> 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ЗаполнитьСтрокуВходящихДанныхИзAPI(НовСтр, СтрокаAPI)
НовСтр.НоменклатураИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "nomenclature_guid", ""));
НовСтр.НоменклатураНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_name", "")));
НовСтр.НоменклатураКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_code", "")));
НовСтр.Артикул = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_article", "")));
НовСтр.СкладИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "warehouse_guid", ""));
НовСтр.СкладНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "warehouse_name", "")));
НовСтр.ЕдИзмИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "unit_guid", ""));
НовСтр.ЕдИзм = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "unit_name", "")));
Если ПустаяСтрока(НовСтр.ЕдИзм) Тогда
НовСтр.ЕдИзм = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "unit_code", "")));
КонецЕсли;
НовСтр.ХарактеристикаИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "characteristic_guid", ""));
НовСтр.ХарактеристикаНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristic_name", "")));
НовСтр.СерияИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "series_guid", ""));
НовСтр.Серия = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_name", "")));
НовСтр.СерияНомер = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "series_number", "")));
Если ПустаяСтрока(НовСтр.Серия) И Не ПустаяСтрока(НовСтр.СерияНомер) Тогда
НовСтр.Серия = НовСтр.СерияНомер;
КонецЕсли;
НовСтр.ГТДИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "gtd_guid", ""));
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_name", "")));
Если ПустаяСтрока(ГТДТекст) Тогда
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_code", "")));
КонецЕсли;
Если ПустаяСтрока(ГТДТекст) Тогда
ГТДТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "gtd_number", "")));
КонецЕсли;
НовСтр.ГТД = ГТДТекст;
НовСтр.ОрганизацияИдентификатор = UUIDИзСтроки(ЗначениеСвойства(СтрокаAPI, "organization_guid", ""));
НовСтр.ОрганизацияНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "organization_name", "")));
КолСклад = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_warehouse", 0), 0);
КолФин = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_financial",
ЗначениеСвойства(СтрокаAPI, "qty_org", 0)), 0);
НовСтр.Количество = КолСклад;
НовСтр.КоличествоОрганизации = КолФин;
НовСтр.КоличествоКОтгрузке = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "qty_to_ship", 0), 0);
НовСтр.Стоимость = ЧислоИзЗначения(ЗначениеСвойства(Строка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);
НовСтр.ВидНоменклатурыНаименование = СокрЛП(Строка(ВидИмя));
НовСтр.ра_ВидНоменклатурыCRM326 = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "kind_crm326_name", "")));
НовСтр.ПолитикаСерии = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "policy_use_series", "")));
НовСтр.ПолитикаХарактеристик = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "policy_use_characteristics", "")));
НовСтр.Сопоставлено = Ложь;
НовСтр.КомментарийСопоставления = "";
КонецПроцедуры
Функция НайтиНоменклатуруСтроки(СтрТ)
Ном = Справочники.Номенклатура.ПустаяСсылка();
Арт = СокрЛП(СтрТ.Артикул);
ИмяНом = СокрЛП(СтрТ.НоменклатураНаименование);
КодНом = СокрЛП(СтрТ.НоменклатураКод);
Если ЗначениеЗаполнено(Арт) Тогда
Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Арт);
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) Тогда
СсылкаПоГуид = СсылкаПоUUID(Справочники.Номенклатура, СтрТ.НоменклатураИдентификатор);
Если ЗначениеЗаполнено(СсылкаПоГуид) И ОбщегоНазначения.СсылкаСуществует(СсылкаПоГуид) Тогда
Ном = СсылкаПоГуид;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(КодНом) Тогда
Ном = Справочники.Номенклатура.НайтиПоКоду(КодНом);
КонецЕсли;
Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(ИмяНом) Тогда
Ном = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНом, Истина);
КонецЕсли;
Если ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(ИмяНом) Тогда
Если СокрЛП(Ном.Наименование) <> ИмяНом Тогда
СтрТ.КомментарийСопоставления = "Номенклатура не совпала по имени: " + ИмяНом + " → " + Ном.Наименование;
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
Возврат Ном;
КонецФункции
Функция НайтиСкладСтроки(СтрТ)
СкладЦель = СсылкаПоUUID(Справочники.Склады, СтрТ.СкладИдентификатор);
Если ЗначениеЗаполнено(СкладЦель) И ОбщегоНазначения.СсылкаСуществует(СкладЦель) Тогда
Возврат СкладЦель;
КонецЕсли;
ИмяСкл = СокрЛП(СтрТ.СкладНаименование);
Если ЗначениеЗаполнено(ИмяСкл) Тогда
Возврат Справочники.Склады.НайтиПоНаименованию(ИмяСкл, Истина);
КонецЕсли;
Возврат Справочники.Склады.ПустаяСсылка();
КонецФункции
Функция НайтиИлиСоздатьХарактеристику(СтрТ, Ном, РежимТест, Результат)
Хар = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
ИмяХар = СокрЛП(СтрТ.ХарактеристикаНаименование);
ВидНом = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры");
ИспХар = Ложь;
Попытка
ИспХар = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры.ИспользоватьХарактеристики") = Истина;
Исключение
Попытка
ИспХар = ВидНом.ИспользоватьХарактеристики;
Исключение
КонецПопытки;
КонецПопытки;
Если ЗначениеЗаполнено(ИмяХар) Тогда
Хар = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ИмяХар, Истина, , Ном);
Если Не ЗначениеЗаполнено(Хар) Тогда
Хар = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ИмяХар, Истина, , ВидНом);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Хар) Тогда
СсылкаПоГуид = СсылкаПоUUID(Справочники.ХарактеристикиНоменклатуры, СтрТ.ХарактеристикаИдентификатор);
Если ЗначениеЗаполнено(СсылкаПоГуид) И ОбщегоНазначения.СсылкаСуществует(СсылкаПоГуид) Тогда
ВладХар = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаПоГуид, "Владелец");
Если ВладХар = Ном Или ВладХар = ВидНом Тогда
Хар = СсылкаПоГуид;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Хар) И ИспХар И ЗначениеЗаполнено(ИмяХар) И Не РежимТест Тогда
Попытка
НовХар = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
НовХар.Владелец = ВидНом;
НовХар.Наименование = ИмяХар;
НовХар.Записать();
Хар = НовХар.Ссылка;
Результат.СозданоХарактеристик = Результат.СозданоХарактеристик + 1;
Исключение
СтрТ.КомментарийСопоставления = "Ошибка создания характеристики: " + ИмяХар;
КонецПопытки;
КонецЕсли;
Если Не ИспХар Тогда
Хар = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
Возврат Хар;
КонецФункции
Функция НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия)
КлючТребСер = Строка(Ном.УникальныйИдентификатор());
ТребуетсяСерия = КэшТребуетсяСерия.Получить(КлючТребСер);
Если ТребуетсяСерия <> Неопределено Тогда
Возврат ТребуетсяСерия;
КонецЕсли;
ТребуетсяСерия = Ложь;
Попытка
ТребуетсяСерия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры.ИспользоватьСерии") = Истина;
Исключение
Попытка
ТребуетсяСерия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры").ИспользоватьСерии;
Исключение
КонецПопытки;
КонецПопытки;
КэшТребуетсяСерия.Вставить(КлючТребСер, ТребуетсяСерия);
Возврат ТребуетсяСерия;
КонецФункции
Процедура ЗаполнитьНомерГТДСтроки(СтрТ)
Если Не ЗначениеЗаполнено(СтрТ.ГТД) Тогда
Возврат;
КонецЕсли;
КодГТД = СокрЛП(СтрТ.ГТД);
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоКоду(КодГТД);
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоРеквизиту("РегистрационныйНомер", КодГТД);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СтрТ.НомерГТДСсылка = Справочники.НомераГТД.НайтиПоНаименованию(КодГТД, Истина);
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрТ.НомерГТДСсылка) Тогда
СсылкаГТД = СсылкаПоUUID(Справочники.НомераГТД, СтрТ.ГТДИдентификатор);
Если ЗначениеЗаполнено(СсылкаГТД) И ОбщегоНазначения.СсылкаСуществует(СсылкаГТД) Тогда
СтрТ.НомерГТДСсылка = СсылкаГТД;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НайтиСоглашениеСтроки(СтрТ)
Согл = СсылкаПоUUID(Справочники.СоглашенияСКлиентами, СтрТ.СоглашениеИдентификатор);
Если ЗначениеЗаполнено(Согл) И ОбщегоНазначения.СсылкаСуществует(Согл) Тогда
Возврат Согл;
КонецЕсли;
ИмяСогл = СокрЛП(СтрТ.СоглашениеНаименование);
Если ЗначениеЗаполнено(ИмяСогл) Тогда
Возврат Справочники.СоглашенияСКлиентами.НайтиПоНаименованию(ИмяСогл, Истина);
КонецЕсли;
Возврат Справочники.СоглашенияСКлиентами.ПустаяСсылка();
КонецФункции
Процедура ЗаполнитьПартнераКонтрагентаДоговорСтроки(СтрТ, Соглашение)
Партнер = СсылкаПоUUID(Справочники.Партнеры, СтрТ.ПартнерИдентификатор);
Если Не (ЗначениеЗаполнено(Партнер) И ОбщегоНазначения.СсылкаСуществует(Партнер)) Тогда
Партнер = Справочники.Партнеры.ПустаяСсылка();
ИмяПарт = СокрЛП(СтрТ.ПартнерНаименование);
Если ЗначениеЗаполнено(ИмяПарт) Тогда
Партнер = Справочники.Партнеры.НайтиПоНаименованию(ИмяПарт, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Партнер) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Партнер");
Исключение
КонецПопытки;
КонецЕсли;
СтрТ.Партнер = Партнер;
Контр = СсылкаПоUUID(Справочники.Контрагенты, СтрТ.КонтрагентИдентификатор);
Если Не (ЗначениеЗаполнено(Контр) И ОбщегоНазначения.СсылкаСуществует(Контр)) Тогда
Контр = Справочники.Контрагенты.ПустаяСсылка();
ИмяКонтр = СокрЛП(СтрТ.КонтрагентНаименование);
Если ЗначениеЗаполнено(ИмяКонтр) Тогда
Контр = Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтр, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Контр = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Контрагент");
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Партнер) Тогда
Попытка
Контр = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер);
Исключение
КонецПопытки;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контр) И ЗначениеЗаполнено(Партнер) Тогда
ЗапросК = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| К.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК К
|ГДЕ
| К.Партнер = &Партнер
| И НЕ К.ПометкаУдаления");
ЗапросК.УстановитьПараметр("Партнер", Партнер);
ВыбК = ЗапросК.Выполнить().Выбрать();
Если ВыбК.Следующий() Тогда
Контр = ВыбК.Ссылка;
КонецЕсли;
КонецЕсли;
СтрТ.Контрагент = Контр;
Договор = СсылкаПоUUID(Справочники.ДоговорыКонтрагентов, СтрТ.ДоговорИдентификатор);
Если Не (ЗначениеЗаполнено(Договор) И ОбщегоНазначения.СсылкаСуществует(Договор)) Тогда
Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
ИмяДог = СокрЛП(СтрТ.ДоговорНаименование);
Если ЗначениеЗаполнено(ИмяДог) Тогда
Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(ИмяДог, Истина);
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Договор) И ЗначениеЗаполнено(Соглашение) Тогда
Попытка
Договор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "Договор");
Исключение
КонецПопытки;
КонецЕсли;
СтрТ.Договор = Договор;
КонецПроцедуры
Функция НайтиИлиСоздатьСерию(СтрТ, Ном, СкладЦель, СуффиксДатыСер, РежимТест,
КэшТребуетсяСерия, КэшСерий, Результат)
Сер = Справочники.СерииНоменклатуры.ПустаяСсылка();
ВидНом = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры");
ТребуетсяСерия = НоменклатураИспользуетСерии(Ном, КэшТребуетсяСерия);
ИмяСерии = СокрЛП(СтрТ.Серия);
НомерСерии = СокрЛП(СтрТ.СерияНомер);
ЭтоЗаглушка = Ложь;
Если Не ЗначениеЗаполнено(ИмяСерии) И Не ЗначениеЗаполнено(НомерСерии) Тогда
Если Не ТребуетсяСерия Тогда
Возврат Сер;
КонецЕсли;
Если Не СоздаватьЗаглушкиСерий Тогда
СтрТ.КомментарийСопоставления = "Серия обязательна, в источнике пустая (заглушки выключены)";
Возврат Сер;
КонецЕсли;
КодСклЗагл = "КОМ";
Если ЗначениеЗаполнено(СкладЦель) Тогда
Попытка
КодСклЗагл = СокрЛП(Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СкладЦель, "Код")));
Исключение
КодСклЗагл = "";
КонецПопытки;
Если ПустаяСтрока(КодСклЗагл) Тогда
КодСклЗагл = Лев(СтрЗаменить(Строка(СкладЦель.УникальныйИдентификатор()), "-", ""), 8);
КонецЕсли;
КонецЕсли;
ИмяСерии = "Перенос_" + КодСклЗагл + "_" + СуффиксДатыСер;
СтрТ.Серия = ИмяСерии;
ЭтоЗаглушка = Истина;
КонецЕсли;
СсылкаПоГуид = СсылкаПоUUID(Справочники.СерииНоменклатуры, СтрТ.СерияИдентификатор);
Если ЗначениеЗаполнено(СсылкаПоГуид) И ОбщегоНазначения.СсылкаСуществует(СсылкаПоГуид) Тогда
Возврат СсылкаПоГуид;
КонецЕсли;
ВидСер = Неопределено;
ИспНомерСерии = Истина;
Попытка
НастрСер = Справочники.ВидыНоменклатуры.НастройкиИспользованияСерий(ВидНом, СкладЦель);
ВидСер = НастрСер.ВладелецСерий;
ИспНомерСерии = НастрСер.ИспользоватьНомерСерии;
Исключение
ВидСер = ВидНом;
КонецПопытки;
Если Не ЗначениеЗаполнено(ВидСер) Тогда
ВидСер = ВидНом;
КонецЕсли;
КлючПоискаНомера = ?(ЗначениеЗаполнено(НомерСерии), НомерСерии, ИмяСерии);
КлючКэшСер = Строка(ВидСер.УникальныйИдентификатор()) + "|" + ИмяСерии + "|" + КлючПоискаНомера;
СерИзКэш = КэшСерий.Получить(КлючКэшСер);
Если СерИзКэш <> Неопределено Тогда
Возврат СерИзКэш;
КонецЕсли;
Если ИспНомерСерии И ЗначениеЗаполнено(КлючПоискаНомера) Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоРеквизиту("Номер", КлючПоискаНомера, , ВидСер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И ЗначениеЗаполнено(ИмяСерии) Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(ИмяСерии, Истина, , ВидСер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И ЗначениеЗаполнено(НомерСерии) И НомерСерии <> ИмяСерии Тогда
Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(НомерСерии, Истина, , ВидСер);
КонецЕсли;
МожноСоздать = Не РежимТест И ЗначениеЗаполнено(ИмяСерии);
Если ЭтоЗаглушка Тогда
МожноСоздать = МожноСоздать И СоздаватьЗаглушкиСерий;
КонецЕсли;
Если Не ЗначениеЗаполнено(Сер) И МожноСоздать Тогда
Попытка
ОбСер = Справочники.СерииНоменклатуры.ПустойОбъект(ВидСер);
Если ИспНомерСерии Тогда
НомерСер = КлючПоискаНомера;
Если ЭтоЗаглушка И СтрНачинаетсяС(ИмяСерии, "Перенос_") Тогда
НомерСер = Сред(ИмяСерии, СтрДлина("Перенос_") + 1);
КонецЕсли;
ОбСер.Номер = НомерСер;
Иначе
Попытка
ОбСер.Наименование = ИмяСерии;
Исключение
КонецПопытки;
КонецЕсли;
ОбСер.Записать();
Сер = ОбСер.Ссылка;
Результат.СозданоСерий = Результат.СозданоСерий + 1;
Исключение
СтрТ.КомментарийСопоставления = "Ошибка создания серии: " + ИмяСерии;
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено(Сер) Тогда
КэшСерий.Вставить(КлючКэшСер, Сер);
ИначеЕсли ТребуетсяСерия Тогда
Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Или СтрТ.КомментарийСопоставления = "OK" Тогда
СтрТ.КомментарийСопоставления = "Серия не найдена" + ?(РежимТест, " (тест)", "");
КонецЕсли;
КонецЕсли;
Возврат Сер;
КонецФункции
Функция СсылкаПоUUID(Менеджер, Идентификатор)
Если Не ЗначениеЗаполнено(Идентификатор) Тогда
Возврат Менеджер.ПустаяСсылка();
КонецЕсли;
Попытка
Возврат Менеджер.ПолучитьСсылку(Идентификатор);
Исключение
Возврат Менеджер.ПустаяСсылка();
КонецПопытки;
КонецФункции
Функция UUIDИзСтроки(Значение)
Текст = НРег(СокрЛП(Строка(Значение)));
Если ПустаяСтрока(Текст) Или Текст = "00000000-0000-0000-0000-000000000000" Тогда
Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
КонецЕсли;
Попытка
Возврат Новый УникальныйИдентификатор(Текст);
Исключение
Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
КонецПопытки;
КонецФункции
Функция ЗначениеСвойства(Источник, Имя, ПоУмолчанию)
Если Источник = Неопределено Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Структура") Или ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда
Если Источник.Свойство(Имя) Тогда
Возврат Источник[Имя];
КонецЕсли;
Возврат ПоУмолчанию;
КонецЕсли;
Если ТипЗнч(Источник) = Тип("Соответствие") Или ТипЗнч(Источник) = Тип("ФиксированноеСоответствие") Тогда
Значение = Источник.Получить(Имя);
Если Значение = Неопределено Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Возврат Значение;
КонецЕсли;
Возврат ПоУмолчанию;
КонецФункции
Функция ЧислоИзЗначения(Значение, ПоУмолчанию)
Если Значение = Неопределено Или Значение = Null Тогда
Возврат ПоУмолчанию;
КонецЕсли;
Попытка
Возврат Число(Значение);
Исключение
Возврат ПоУмолчанию;
КонецПопытки;
КонецФункции
Функция КлючАналитикиКомиссионнойСтроки(СтрТ)
Возврат Строка(СтрТ.НоменклатураИдентификатор) + "|"
+ СокрЛП(СтрТ.НоменклатураКод) + "|"
+ СокрЛП(СтрТ.Артикул) + "|"
+ Строка(СтрТ.СоглашениеИдентификатор) + "|"
+ СокрЛП(СтрТ.СоглашениеНаименование) + "|"
+ Строка(СтрТ.ПартнерИдентификатор) + "|"
+ СокрЛП(СтрТ.ПартнерНаименование) + "|"
+ Строка(СтрТ.КонтрагентИдентификатор) + "|"
+ СокрЛП(СтрТ.КонтрагентНаименование) + "|"
+ Строка(СтрТ.ОрганизацияИдентификатор) + "|"
+ Строка(СтрТ.СкладИдентификатор) + "|"
+ Строка(СтрТ.ХарактеристикаИдентификатор) + "|"
+ СокрЛП(СтрТ.ГТД) + "|"
+ СокрЛП(СтрТ.Назначение) + "|"
+ СокрЛП(СтрТ.ВидЗапасов);
КонецФункции
Функция СерияЗаполненаВСтрокеКомиссии(СтрТ)
Если ЗначениеЗаполнено(СтрТ.СерияИдентификатор) Тогда
Возврат Истина;
КонецЕсли;
Если Не ПустаяСтрока(СокрЛП(СтрТ.Серия)) Тогда
Возврат Истина;
КонецЕсли;
Возврат Не ПустаяСтрока(СокрЛП(СтрТ.СерияНомер));
КонецФункции
Функция БулевоИзЗначения(Значение)
Если ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат Значение;
КонецЕсли;
Если Значение = Неопределено Или Значение = Null Тогда
Возврат Ложь;
КонецЕсли;
Стр = НРег(СокрЛП(Строка(Значение)));
Возврат Стр = "true" Или Стр = "1" Или Стр = "да" Или Стр = "истина";
КонецФункции
#КонецОбласти
#КонецЕсли