#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда #Область ПрограммныйИнтерфейс // Заполняет ТЧ ВходящиеСобственныеТовары строками остатков 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" Или Стр = "да" Или Стр = "истина"; КонецФункции #КонецОбласти #КонецЕсли