From b07b7c96d6c3a6ab6e698eb1a06054887fab5954 Mon Sep 17 00:00:00 2001 From: mihailkudravcev Date: Thu, 20 Aug 2026 14:35:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=9A=5F=D0=97=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=D0=A6=D0=B5=D0=BD=201.3.1.99:=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=B0=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=86=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=98=D0=91=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обработка в crm3-26.rhana вызывает Transfer API исходной базы, сопоставляет виды цен и номенклатуру и создаёт УстановкаЦенНоменклатуры. Канон: rhana/crm3-migration#20. Co-authored-by: Cursor --- CHANGELOG.md | 9 + VERSION | 2 +- src/Catalogs/ВидыЦен.xml | 34 + .../РК_ОбменСВнешнейБазой/Ext/Module.bsl | 24 + src/ConfigDumpInfo.xml | 61 +- src/Configuration.xml | 4 +- src/DataProcessors/РК_ЗагрузкаЦен.xml | 1815 +++++++++++++++++ .../РК_ЗагрузкаЦен/Ext/ObjectModule.bsl | 584 ++++++ .../РК_ЗагрузкаЦен/Forms/Форма.xml | 22 + .../РК_ЗагрузкаЦен/Forms/Форма/Ext/Form.xml | 539 +++++ .../Forms/Форма/Ext/Form/Module.bsl | 327 +++ .../РК_ОбщаяРольРасширения/Ext/Rights.xml | 11 + .../Subsystems/РК_ОбменСВнешнейБазой.xml | 1 + 13 files changed, 3427 insertions(+), 6 deletions(-) create mode 100644 src/Catalogs/ВидыЦен.xml create mode 100644 src/DataProcessors/РК_ЗагрузкаЦен.xml create mode 100644 src/DataProcessors/РК_ЗагрузкаЦен/Ext/ObjectModule.bsl create mode 100644 src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма.xml create mode 100644 src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form.xml create mode 100644 src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form/Module.bsl diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e681cb..f9b647c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ --- +## 1.3.1.99 (2026-08-20) + +### РК_ЗагрузкаЦен — актуальные цены из исходной ИБ (#18) + +- Обработка `РК_ЗагрузкаЦен` в подсистеме «Обмен с внешней базой»: срез цен на дату через Transfer API (`POST /v1/prices/types`, `POST /v1/prices/slice`, нужен **ws-rhana ≥ 0.0.0.44** на исходной ИБ). +- Сопоставление и при необходимости создание видов цен; сопоставление номенклатуры (артикул → GUID → код → наименование). +- Документы `УстановкаЦенНоменклатуры` (ТЧ `Товары2_5` при ЦО 2.5, `СерияЦО` пустая — в источнике цены без серии). +- В таблице входящих цен — признаки посерийного складского учёта и ключа цен по серии в цели, текущая цена цели. + ## 1.3.1.98 (2026-08-20) ### РК_ПроверкаСерий — доработка объединения дублей (#15) diff --git a/VERSION b/VERSION index c1651cf..247872d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.1.98 +1.3.1.99 diff --git a/src/Catalogs/ВидыЦен.xml b/src/Catalogs/ВидыЦен.xml new file mode 100644 index 0000000..0b438c5 --- /dev/null +++ b/src/Catalogs/ВидыЦен.xml @@ -0,0 +1,34 @@ + + + + + + 9a696966-094f-42de-bdb8-e4577aa66fee + d3515b4e-7ae1-4825-b128-a4aafbf1aad0 + + + 5eeef668-b52a-4624-a9c2-8ac6327dbc51 + b9e564d6-9e64-4c33-9554-7887c144c9f1 + + + 0bb6746f-657e-4104-804e-f44488df01ce + 0d3afe13-6130-479c-a693-d5ee1de1d0c5 + + + a8c751e5-432f-4f85-99ca-51f5f01ada3a + a3050df9-e7b8-470f-8e2f-405389f1e8af + + + 75255bcb-6fb9-4f14-9abf-4788d1c78551 + 04959214-e939-4a2c-90d1-bba4b8e92881 + + + + Adopted + ВидыЦен + + 1a6593e1-d0c4-428d-af64-b1161601c46b + + + + diff --git a/src/CommonModules/РК_ОбменСВнешнейБазой/Ext/Module.bsl b/src/CommonModules/РК_ОбменСВнешнейБазой/Ext/Module.bsl index e491f7a..9f9b119 100644 --- a/src/CommonModules/РК_ОбменСВнешнейБазой/Ext/Module.bsl +++ b/src/CommonModules/РК_ОбменСВнешнейБазой/Ext/Module.bsl @@ -131,6 +131,30 @@ КонецФункции +// POST /v1/prices/types на исходной ИБ. +// +Функция ВидыЦенВнешнейБазы(Подключение, ПараметрыЗапроса = Неопределено) Экспорт + + Если ПараметрыЗапроса = Неопределено Тогда + ПараметрыЗапроса = Новый Структура; + КонецЕсли; + Настройки = НастройкиПодключения(Подключение); + Возврат ВыполнитьPOST(Настройки, "v1/prices/types", ПараметрыЗапроса); + +КонецФункции + +// POST /v1/prices/slice на исходной ИБ. +// +Функция ЦеныВнешнейБазы(Подключение, ПараметрыЗапроса) Экспорт + + Если ПараметрыЗапроса = Неопределено Тогда + ПараметрыЗапроса = Новый Структура; + КонецЕсли; + Настройки = НастройкиПодключения(Подключение); + Возврат ВыполнитьPOST(Настройки, "v1/prices/slice", ПараметрыЗапроса); + +КонецФункции + // Универсальный GET к Transfer API. // Функция ВыполнитьGET(НастройкиПодключения, ОтносительныйПуть) Экспорт diff --git a/src/ConfigDumpInfo.xml b/src/ConfigDumpInfo.xml index 90da7f1..53c5163 100644 --- a/src/ConfigDumpInfo.xml +++ b/src/ConfigDumpInfo.xml @@ -2,6 +2,7 @@ + @@ -33,7 +34,7 @@ - + @@ -49,7 +50,7 @@ - + @@ -201,6 +202,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -299,7 +352,7 @@ - + @@ -308,7 +361,7 @@ - + diff --git a/src/Configuration.xml b/src/Configuration.xml index bbf55c8..96258fe 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.1.98 + 1.3.1.99 Language.Русский @@ -113,6 +113,7 @@ СерииНоменклатуры Номенклатура ВидыНоменклатуры + ВидыЦен РеализацияТоваровУслуг ЗаказКлиента РасходныйОрдерНаТовары @@ -127,6 +128,7 @@ ЗагрузкаДанныхИзФайла РК_ОбработкаПарнеровКонтрагентов РК_ЗагрузкаОстатков + РК_ЗагрузкаЦен РК_ПроверкаСерий ДополнительныеРеквизитыИСведения diff --git a/src/DataProcessors/РК_ЗагрузкаЦен.xml b/src/DataProcessors/РК_ЗагрузкаЦен.xml new file mode 100644 index 0000000..51dee94 --- /dev/null +++ b/src/DataProcessors/РК_ЗагрузкаЦен.xml @@ -0,0 +1,1815 @@ + + + + + + a18e1801-18e0-4000-8000-000000000011 + a18e1801-18e0-4000-8000-000000000012 + + + a18e1801-18e0-4000-8000-000000000013 + a18e1801-18e0-4000-8000-000000000014 + + + + РК_ЗагрузкаЦен + + + ru + Загрузка цен + + + Актуальные цены продаж из исходной ИБ (crm3-old) через Transfer API + true + DataProcessor.РК_ЗагрузкаЦен.Form.Форма + + false + + + + + + + ПодключениеКСтороннейБазе + + + ru + Подключение к сторонней базе + + + + + cfg:CatalogRef.РК_НастройкиПодключенияКВнешнейБазе + + false + + + + false + + false + false + + + ShowError + Items + + + Auto + Auto + + + Auto + + + + + ДатаЦен + + + ru + Дата цен + + + + + xs:dateTime + + DateTime + + + false + + + + false + + false + false + + + ShowError + Items + + + Auto + Auto + + + Auto + + + + + ДатаДокументов + + + ru + Дата документов установки + + + + + xs:dateTime + + DateTime + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + СоздаватьОтсутствующиеВидыЦен + + + ru + Создавать отсутствующие виды цен + + + + + xs:boolean + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + КомментарийДокументов + + + ru + Комментарий документов + + + + + xs:string + + 200 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + a18e1801-18e0-4001-8000-00000000012d + a18e1801-18e0-4002-8000-00000000012d + + + a18e1801-18e0-4003-8000-00000000012d + a18e1801-18e0-4004-8000-00000000012d + + + + ВидыЦенИсточника + + + ru + Виды цен источника + + + + + DontCheck + + + + + Отметка + + + ru + Отметка + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Идентификатор + + + ru + GUID источника + + + + + xs:string + + 36 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Наименование + + + ru + Наименование + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВалютаКод + + + ru + Валюта + + + + + xs:string + + 10 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ЦенаВключаетНДС + + + ru + Цена включает НДС + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + СпособЗаданияЦены + + + ru + Способ задания + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + БазовыйВидЦеныНаименование + + + ru + Базовый вид + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Наценка + + + ru + Наценка + + + + + xs:decimal + + 10 + 2 + Any + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИспользоватьПриПродаже + + + ru + Использовать при продаже + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ПометкаУдаления + + + ru + Пометка удаления + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВидЦены + + + ru + Вид цены (цель) + + + + + cfg:CatalogRef.ВидыЦен + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + СтатусСопоставления + + + ru + Статус + + + + + xs:string + + 50 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Комментарий + + + ru + Комментарий + + + + + xs:string + + 500 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + + + a18e1801-18e0-4001-8000-00000000012e + a18e1801-18e0-4002-8000-00000000012e + + + a18e1801-18e0-4003-8000-00000000012e + a18e1801-18e0-4004-8000-00000000012e + + + + ВходящиеЦены + + + ru + Входящие цены + + + + + DontCheck + + + + + Период + + + ru + Период источника + + + + + xs:dateTime + + DateTime + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + НоменклатураИдентификатор + + + ru + GUID номенклатуры + + + + + xs:string + + 36 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Артикул + + + ru + Артикул + + + + + xs:string + + 50 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + НоменклатураКод + + + ru + Код + + + + + xs:string + + 20 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + НоменклатураНаименование + + + ru + Номенклатура (источник) + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ХарактеристикаИдентификатор + + + ru + GUID характеристики + + + + + xs:string + + 36 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ХарактеристикаНаименование + + + ru + Характеристика + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВидЦеныИдентификатор + + + ru + GUID вида цены + + + + + xs:string + + 36 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВидЦеныНаименование + + + ru + Вид цены (источник) + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Цена + + + ru + Цена + + + + + xs:decimal + + 15 + 2 + Any + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВалютаКод + + + ru + Валюта + + + + + xs:string + + 10 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + УпаковкаНаименование + + + ru + Упаковка + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Номенклатура + + + ru + Номенклатура + + + + + cfg:CatalogRef.Номенклатура + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВидЦены + + + ru + Вид цены + + + + + cfg:CatalogRef.ВидыЦен + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Сопоставлено + + + ru + Сопоставлено + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + КомментарийСопоставления + + + ru + Комментарий сопоставления + + + + + xs:string + + 500 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИспользоватьСерииСклад + + + ru + Серии склад (цель) + + + + + xs:string + + 50 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + КлючЦенПоСерии + + + ru + Ключ цен по серии + + + + + xs:string + + 80 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + РазрывДетализации + + + ru + Разрыв детализации + + + + + xs:string + + 250 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ТекущаяЦенаЦель + + + ru + Текущая цена (цель) + + + + + xs:decimal + + 15 + 2 + Any + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ДокументПредставление + + + ru + Документ + + + + + xs:string + + 200 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ЗагруженоВДокумент + + + ru + Загружено + + + + + xs:boolean + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + + + a18e1801-18e0-4001-8000-00000000012f + a18e1801-18e0-4002-8000-00000000012f + + + a18e1801-18e0-4003-8000-00000000012f + a18e1801-18e0-4004-8000-00000000012f + + + + СозданныеДокументы + + + ru + Созданные документы + + + + + DontCheck + + + + + ДокументПредставление + + + ru + Документ + + + + + xs:string + + 200 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВидЦены + + + ru + Вид цены + + + + + cfg:CatalogRef.ВидыЦен + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + КоличествоСтрок + + + ru + Строк + + + + + xs:decimal + + 10 + 0 + Any + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Комментарий + + + ru + Комментарий + + + + + xs:string + + 500 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + +
Форма
+
+
+
diff --git a/src/DataProcessors/РК_ЗагрузкаЦен/Ext/ObjectModule.bsl b/src/DataProcessors/РК_ЗагрузкаЦен/Ext/ObjectModule.bsl new file mode 100644 index 0000000..3d6451b --- /dev/null +++ b/src/DataProcessors/РК_ЗагрузкаЦен/Ext/ObjectModule.bsl @@ -0,0 +1,584 @@ +//////////////////////////////////////////////////////////////////////////////// +// Загрузка актуальных цен продаж из исходной ИБ через Transfer API. +// https://git.p7net.ru/1c/crm3_26.rhana/issues/18 +//////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +Процедура ЗаполнитьВидыЦенИзОтветаAPI(Ответ, Очищать = Истина) Экспорт + + Если Очищать Тогда + ВидыЦенИсточника.Очистить(); + КонецЕсли; + + Строки = ЗначениеСвойства(Ответ, "rows", Неопределено); + Если ТипЗнч(Строки) <> Тип("Массив") Тогда + Возврат; + КонецЕсли; + + Для Каждого СтрокаAPI Из Строки Цикл + НовСтр = ВидыЦенИсточника.Добавить(); + НовСтр.Отметка = Истина; + НовСтр.Идентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "guid", ""))); + НовСтр.Наименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "name", ""))); + НовСтр.ВалютаКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_code", ""))); + НовСтр.ЦенаВключаетНДС = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "vat_included", Ложь)); + НовСтр.СпособЗаданияЦены = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "method", ""))); + НовСтр.БазовыйВидЦеныНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "base_type_name", ""))); + НовСтр.Наценка = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "markup", 0), 0); + НовСтр.ИспользоватьПриПродаже = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "use_for_sale", Истина)); + НовСтр.ПометкаУдаления = БулевоИзЗначения(ЗначениеСвойства(СтрокаAPI, "deletion_mark", Ложь)); + НовСтр.СтатусСопоставления = ""; + НовСтр.Комментарий = ""; + КонецЦикла; + +КонецПроцедуры + +Функция СопоставитьВидыЦен(РежимТест) Экспорт + + Найдено = 0; + Создано = 0; + НеНайдено = 0; + + Для Каждого СтрТ Из ВидыЦенИсточника Цикл + ВЦ = НайтиВидЦеныСтроки(СтрТ); + Если ЗначениеЗаполнено(ВЦ) Тогда + СтрТ.ВидЦены = ВЦ; + СтрТ.СтатусСопоставления = "Найден"; + СтрТ.Комментарий = ""; + Найдено = Найдено + 1; + Продолжить; + КонецЕсли; + + Если СоздаватьОтсутствующиеВидыЦен И СтрТ.Отметка Тогда + Если РежимТест Тогда + СтрТ.СтатусСопоставления = "К созданию"; + СтрТ.Комментарий = "Будет создан вид цен «" + СтрТ.Наименование + "»"; + Создано = Создано + 1; + Иначе + ВЦ = СоздатьВидЦеныСтроки(СтрТ); + Если ЗначениеЗаполнено(ВЦ) Тогда + СтрТ.ВидЦены = ВЦ; + СтрТ.СтатусСопоставления = "Создан"; + СтрТ.Комментарий = ""; + Создано = Создано + 1; + Иначе + СтрТ.СтатусСопоставления = "Ошибка создания"; + НеНайдено = НеНайдено + 1; + КонецЕсли; + КонецЕсли; + Иначе + СтрТ.ВидЦены = Справочники.ВидыЦен.ПустаяСсылка(); + СтрТ.СтатусСопоставления = "Не найден"; + СтрТ.Комментарий = "Нет вида цен с наименованием «" + СтрТ.Наименование + "»"; + НеНайдено = НеНайдено + 1; + КонецЕсли; + КонецЦикла; + + Возврат "Видов цен: найдено " + Формат(Найдено, "ЧН=0; ЧГ=0") + + ", создано/к созданию " + Формат(Создано, "ЧН=0; ЧГ=0") + + ", не найдено " + Формат(НеНайдено, "ЧН=0; ЧГ=0"); + +КонецФункции + +Процедура ЗаполнитьВходящиеЦеныИзОтветаAPI(Ответ, Очищать = Истина) Экспорт + + Если Очищать Тогда + ВходящиеЦены.Очистить(); + КонецЕсли; + + Строки = ЗначениеСвойства(Ответ, "rows", Неопределено); + Если ТипЗнч(Строки) <> Тип("Массив") Тогда + Возврат; + КонецЕсли; + + Для Каждого СтрокаAPI Из Строки Цикл + НовСтр = ВходящиеЦены.Добавить(); + ПериодТекст = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "period", ""))); + Если ЗначениеЗаполнено(ПериодТекст) Тогда + Попытка + НовСтр.Период = XMLЗначение(Тип("Дата"), ПериодТекст); + Исключение + КонецПопытки; + КонецЕсли; + НовСтр.НоменклатураИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_guid", ""))); + НовСтр.Артикул = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_article", ""))); + НовСтр.НоменклатураКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_code", ""))); + НовСтр.НоменклатураНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "nomenclature_name", ""))); + НовСтр.ХарактеристикаИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristic_guid", ""))); + НовСтр.ХарактеристикаНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "characteristic_name", ""))); + НовСтр.ВидЦеныИдентификатор = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "price_type_guid", ""))); + НовСтр.ВидЦеныНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "price_type_name", ""))); + НовСтр.Цена = ЧислоИзЗначения(ЗначениеСвойства(СтрокаAPI, "price", 0), 0); + НовСтр.ВалютаКод = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "currency_code", ""))); + НовСтр.УпаковкаНаименование = СокрЛП(Строка(ЗначениеСвойства(СтрокаAPI, "package_name", ""))); + НовСтр.Сопоставлено = Ложь; + НовСтр.ЗагруженоВДокумент = Ложь; + КонецЦикла; + +КонецПроцедуры + +Функция СопоставитьВходящиеЦены() Экспорт + + Сопоставлено = 0; + Пропущено = 0; + СРазрывом = 0; + КартаВидов = КартаВидовЦенИсточника(); + + Для Каждого СтрТ Из ВходящиеЦены Цикл + СтрТ.КомментарийСопоставления = ""; + СтрТ.РазрывДетализации = ""; + СтрТ.ИспользоватьСерииСклад = ""; + СтрТ.КлючЦенПоСерии = ""; + СтрТ.ТекущаяЦенаЦель = 0; + + Ном = НайтиНоменклатуруСтроки(СтрТ); + СтрТ.Номенклатура = Ном; + Если Не ЗначениеЗаполнено(Ном) Тогда + СтрТ.Сопоставлено = Ложь; + Если ПустаяСтрока(СтрТ.КомментарийСопоставления) Тогда + СтрТ.КомментарийСопоставления = "Номенклатура не найдена"; + КонецЕсли; + Пропущено = Пропущено + 1; + Продолжить; + КонецЕсли; + + ВЦ = Неопределено; + КлючВЦ = НРег(СокрЛП(СтрТ.ВидЦеныИдентификатор)); + Если ЗначениеЗаполнено(КлючВЦ) Тогда + ВЦ = КартаВидов.Получить(КлючВЦ); + КонецЕсли; + Если Не ЗначениеЗаполнено(ВЦ) Тогда + ВЦ = Справочники.ВидыЦен.НайтиПоНаименованию(СокрЛП(СтрТ.ВидЦеныНаименование), Истина); + КонецЕсли; + СтрТ.ВидЦены = ВЦ; + Если Не ЗначениеЗаполнено(ВЦ) Тогда + СтрТ.Сопоставлено = Ложь; + СтрТ.КомментарийСопоставления = "Вид цены не найден: " + СтрТ.ВидЦеныНаименование; + Пропущено = Пропущено + 1; + Продолжить; + КонецЕсли; + + ЗаполнитьПолитикуСерийСтроки(СтрТ, Ном); + СтрТ.ТекущаяЦенаЦель = ТекущаяЦенаЦелевойИБ(Ном, ВЦ); + СтрТ.Сопоставлено = Истина; + Сопоставлено = Сопоставлено + 1; + Если ЗначениеЗаполнено(СтрТ.РазрывДетализации) Тогда + СРазрывом = СРазрывом + 1; + КонецЕсли; + КонецЦикла; + + Возврат "Сопоставлено " + Формат(Сопоставлено, "ЧН=0; ЧГ=0") + + ", пропущено " + Формат(Пропущено, "ЧН=0; ЧГ=0") + + ", с разрывом серий/ключа цен " + Формат(СРазрывом, "ЧН=0; ЧГ=0"); + +КонецФункции + +Функция СоздатьДокументыУстановкиЦен(РежимТест) Экспорт + + ИспЦО25 = Ложь; + Попытка + ИспЦО25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(); + Исключение + ИспЦО25 = Ложь; + КонецПопытки; + + ДатаУстановки = ДатаДокументов; + Если Не ЗначениеЗаполнено(ДатаУстановки) Тогда + ДатаУстановки = ТекущаяДатаСеанса(); + КонецЕсли; + КомментарийБаза = СокрЛП(КомментарийДокументов); + Если ПустаяСтрока(КомментарийБаза) Тогда + КомментарийБаза = "Перенос цен из crm3-dev"; + КонецЕсли; + + Группы = Новый Соответствие; + ПорядокГрупп = Новый Массив; + Для Каждого СтрТ Из ВходящиеЦены Цикл + Если Не СтрТ.Сопоставлено Или СтрТ.ЗагруженоВДокумент Тогда + Продолжить; + КонецЕсли; + Если Не ЗначениеЗаполнено(СтрТ.Номенклатура) Или Не ЗначениеЗаполнено(СтрТ.ВидЦены) Тогда + Продолжить; + КонецЕсли; + КлючГр = Строка(СтрТ.ВидЦены); + Список = Группы.Получить(КлючГр); + Если Список = Неопределено Тогда + Список = Новый Массив; + Группы.Вставить(КлючГр, Список); + ПорядокГрупп.Добавить(СтрТ.ВидЦены); + КонецЕсли; + Список.Добавить(СтрТ); + КонецЦикла; + + СозданоДок = 0; + ПропущеноСтрок = 0; + Ошибок = 0; + МаксСтрок = 500; + + Если Не РежимТест Тогда + СозданныеДокументы.Очистить(); + КонецЕсли; + + Для Каждого ВидЦеныГр Из ПорядокГрупп Цикл + СтрокиГр = Группы.Получить(Строка(ВидЦеныГр)); + Если СтрокиГр = Неопределено Или СтрокиГр.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + Индекс = 0; + НомерПакета = 0; + Пока Индекс < СтрокиГр.Количество() Цикл + НомерПакета = НомерПакета + 1; + КонецПакета = Мин(Индекс + МаксСтрок, СтрокиГр.Количество()); + Пакет = Новый Массив; + Для Инд = Индекс По КонецПакета - 1 Цикл + Пакет.Добавить(СтрокиГр[Инд]); + КонецЦикла; + Индекс = КонецПакета; + + Если РежимТест Тогда + СозданоДок = СозданоДок + 1; + Продолжить; + КонецЕсли; + + Попытка + Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент(); + Док.Дата = ДатаУстановки + (НомерПакета - 1); + Док.Комментарий = КомментарийБаза + " / " + Строка(ВидЦеныГр); + Док.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован; + Док.Согласован = Истина; + Док.Ответственный = Пользователи.ТекущийПользователь(); + СтрВЦ = Док.ВидыЦен.Добавить(); + СтрВЦ.ВидЦены = ВидЦеныГр; + + КлючиВДок = Новый Соответствие; + Для Каждого СтрТ Из Пакет Цикл + КлючСтр = НРег(XMLСтрока(СтрТ.Номенклатура.УникальныйИдентификатор())) + "|" + + НРег(СокрЛП(СтрТ.ХарактеристикаНаименование)) + "|" + + НРег(XMLСтрока(СтрТ.ВидЦены.УникальныйИдентификатор())); + Если КлючиВДок.Получить(КлючСтр) <> Неопределено Тогда + ПропущеноСтрок = ПропущеноСтрок + 1; + Продолжить; + КонецЕсли; + КлючиВДок.Вставить(КлючСтр, Истина); + + ВалютаСсылка = Справочники.Валюты.ПустаяСсылка(); + Если ЗначениеЗаполнено(СтрТ.ВалютаКод) Тогда + ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(СокрЛП(СтрТ.ВалютаКод)); + КонецЕсли; + Упак = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка(); + Если ЗначениеЗаполнено(СтрТ.УпаковкаНаименование) Тогда + Упак = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(СокрЛП(СтрТ.УпаковкаНаименование), Истина); + КонецЕсли; + + Если ИспЦО25 Тогда + НовСтр = Док.Товары2_5.Добавить(); + НовСтр.Номенклатура = СтрТ.Номенклатура; + НовСтр.ХарактеристикаЦО = Справочники.ХарактеристикиНоменклатурыДляЦенообразования.ПустаяСсылка(); + НовСтр.СерияЦО = Справочники.СерииНоменклатурыДляЦенообразования.ПустаяСсылка(); + НовСтр.УпаковкаЦО = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка(); + НовСтр.Упаковка = Упак; + НовСтр.ВидЦены = СтрТ.ВидЦены; + НовСтр.Цена = СтрТ.Цена; + НовСтр.Валюта = ВалютаСсылка; + НовСтр.ЦенаИзмененаВручную = Истина; + Иначе + НовСтр = Док.Товары.Добавить(); + НовСтр.Номенклатура = СтрТ.Номенклатура; + НовСтр.Упаковка = Упак; + НовСтр.ВидЦены = СтрТ.ВидЦены; + НовСтр.Цена = СтрТ.Цена; + НовСтр.Валюта = ВалютаСсылка; + НовСтр.ЦенаИзмененаВручную = Истина; + Если ЗначениеЗаполнено(СтрТ.ХарактеристикаНаименование) Тогда + Хар = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию( + СокрЛП(СтрТ.ХарактеристикаНаименование), Истина, , СтрТ.Номенклатура); + Если ЗначениеЗаполнено(Хар) Тогда + НовСтр.Характеристика = Хар; + КонецЕсли; + КонецЕсли; + КонецЕсли; + СтрТ.ЗагруженоВДокумент = Истина; + КонецЦикла; + + Если (Док.Товары.Количество() + Док.Товары2_5.Количество()) = 0 Тогда + Продолжить; + КонецЕсли; + Док.Записать(РежимЗаписиДокумента.Проведение); + СозданоДок = СозданоДок + 1; + СтрДок = СозданныеДокументы.Добавить(); + СтрДок.ДокументПредставление = Строка(Док); + СтрДок.ВидЦены = ВидЦеныГр; + СтрДок.КоличествоСтрок = Док.Товары.Количество() + Док.Товары2_5.Количество(); + СтрДок.Комментарий = Док.Комментарий; + Для Каждого СтрТ Из Пакет Цикл + Если СтрТ.ЗагруженоВДокумент Тогда + СтрТ.ДокументПредставление = Строка(Док); + КонецЕсли; + КонецЦикла; + Исключение + Ошибок = Ошибок + 1; + ТекстОш = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Для Каждого СтрТ Из Пакет Цикл + СтрТ.ЗагруженоВДокумент = Ложь; + СтрТ.КомментарийСопоставления = СокрЛП(СтрТ.КомментарийСопоставления + " " + ТекстОш); + КонецЦикла; + КонецПопытки; + КонецЦикла; + КонецЦикла; + + Возврат "Документов=" + Формат(СозданоДок, "ЧН=0; ЧГ=0") + + ", пропущено строк=" + Формат(ПропущеноСтрок, "ЧН=0; ЧГ=0") + + ", ошибок=" + Формат(Ошибок, "ЧН=0; ЧГ=0") + + ", ЦО 2.5=" + ?(ИспЦО25, "Да", "Нет") + + ?(РежимТест, " (тест)", ""); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция КартаВидовЦенИсточника() + + Карта = Новый Соответствие; + Для Каждого СтрТ Из ВидыЦенИсточника Цикл + Если ЗначениеЗаполнено(СтрТ.ВидЦены) И ЗначениеЗаполнено(СтрТ.Идентификатор) Тогда + Карта.Вставить(НРег(СокрЛП(СтрТ.Идентификатор)), СтрТ.ВидЦены); + КонецЕсли; + КонецЦикла; + Возврат Карта; + +КонецФункции + +Функция НайтиВидЦеныСтроки(СтрТ) + + Имя = СокрЛП(СтрТ.Наименование); + Если Не ЗначениеЗаполнено(Имя) Тогда + Возврат Справочники.ВидыЦен.ПустаяСсылка(); + КонецЕсли; + ВЦ = Справочники.ВидыЦен.НайтиПоНаименованию(Имя, Истина); + Если ЗначениеЗаполнено(ВЦ) Тогда + Возврат ВЦ; + КонецЕсли; + Возврат Справочники.ВидыЦен.ПустаяСсылка(); + +КонецФункции + +Функция СоздатьВидЦеныСтроки(СтрТ) + + Попытка + ОбъектВЦ = Справочники.ВидыЦен.СоздатьЭлемент(); + ОбъектВЦ.Наименование = СокрЛП(СтрТ.Наименование); + Если ЗначениеЗаполнено(СтрТ.ВалютаКод) Тогда + ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(СокрЛП(СтрТ.ВалютаКод)); + Если ЗначениеЗаполнено(ВалютаСсылка) Тогда + ОбъектВЦ.ВалютаЦены = ВалютаСсылка; + КонецЕсли; + КонецЕсли; + Если ЗначениеЗаполнено(СтрТ.СпособЗаданияЦены) Тогда + Попытка + ОбъектВЦ.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен[СтрТ.СпособЗаданияЦены]; + Исключение + КонецПопытки; + КонецЕсли; + Если Не ЗначениеЗаполнено(ОбъектВЦ.СпособЗаданияЦены) Тогда + Попытка + ОбъектВЦ.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен.РучноеНазначение; + Исключение + КонецПопытки; + КонецЕсли; + Если ЗначениеЗаполнено(СтрТ.БазовыйВидЦеныНаименование) Тогда + Базовый = Справочники.ВидыЦен.НайтиПоНаименованию(СокрЛП(СтрТ.БазовыйВидЦеныНаименование), Истина); + Если ЗначениеЗаполнено(Базовый) Тогда + ОбъектВЦ.БазовыйВидЦены = Базовый; + КонецЕсли; + КонецЕсли; + ОбъектВЦ.Наценка = СтрТ.Наценка; + ОбъектВЦ.ЦенаВключаетНДС = СтрТ.ЦенаВключаетНДС; + ОбъектВЦ.ИспользоватьПриПродаже = СтрТ.ИспользоватьПриПродаже; + Попытка + ОбъектВЦ.Статус = Перечисления.СтатусыДействияВидовЦен.Действует; + Исключение + КонецПопытки; + ОбъектВЦ.Записать(); + Возврат ОбъектВЦ.Ссылка; + Исключение + СтрТ.Комментарий = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Справочники.ВидыЦен.ПустаяСсылка(); + КонецПопытки; + +КонецФункции + +Функция НайтиНоменклатуруСтроки(СтрТ) + + Ном = Справочники.Номенклатура.ПустаяСсылка(); + Арт = СокрЛП(СтрТ.Артикул); + ИмяНом = СокрЛП(СтрТ.НоменклатураНаименование); + КодНом = СокрЛП(СтрТ.НоменклатураКод); + + Если ЗначениеЗаполнено(Арт) Тогда + Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Арт); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(СтрТ.НоменклатураИдентификатор) Тогда + Попытка + СсылкаПоГуид = Справочники.Номенклатура.ПолучитьСсылку( + Новый УникальныйИдентификатор(СтрТ.НоменклатураИдентификатор)); + Если ОбщегоНазначения.СсылкаСуществует(СсылкаПоГуид) Тогда + Ном = СсылкаПоГуид; + КонецЕсли; + Исключение + КонецПопытки; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(КодНом) Тогда + Ном = Справочники.Номенклатура.НайтиПоКоду(КодНом); + КонецЕсли; + + Если Не ЗначениеЗаполнено(Ном) И ЗначениеЗаполнено(ИмяНом) Тогда + Ном = Справочники.Номенклатура.НайтиПоНаименованию(ИмяНом, Истина); + КонецЕсли; + + Возврат Ном; + +КонецФункции + +Процедура ЗаполнитьПолитикуСерийСтроки(СтрТ, Ном) + + ВидНом = Неопределено; + Попытка + ВидНом = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ном, "ВидНоменклатуры"); + Исключение + Возврат; + КонецПопытки; + Если Не ЗначениеЗаполнено(ВидНом) Тогда + Возврат; + КонецЕсли; + + ИспСерии = Ложь; + Попытка + ИспСерии = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНом, "ИспользоватьСерии") = Истина; + Исключение + КонецПопытки; + СтрТ.ИспользоватьСерииСклад = ?(ИспСерии, "Да", "Нет"); + + КлючСерии = ""; + Попытка + ЗначениеКлюча = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНом, "НастройкиКлючаЦенПоСерии"); + Если ЗначениеЗаполнено(ЗначениеКлюча) Тогда + КлючСерии = Строка(ЗначениеКлюча); + КонецЕсли; + Исключение + КонецПопытки; + СтрТ.КлючЦенПоСерии = КлючСерии; + + Части = Новый Массив; + Если ИспСерии Тогда + Части.Добавить("в цели посерийный складской учёт, в источнике цена без серии"); + КонецЕсли; + Если ЗначениеЗаполнено(КлючСерии) И НРег(КлючСерии) <> "не использовать" Тогда + Части.Добавить("ключ цен по серии=" + КлючСерии + "; цена будет общей (СерияЦО пустая)"); + КонецЕсли; + СтрТ.РазрывДетализации = СтрСоединить(Части, "; "); + +КонецПроцедуры + +Функция ТекущаяЦенаЦелевойИБ(Ном, ВидЦены) + + ДатаСреза = ДатаЦен; + Если Не ЗначениеЗаполнено(ДатаСреза) Тогда + ДатаСреза = ТекущаяДатаСеанса(); + КонецЕсли; + + ИспЦО25 = Ложь; + Попытка + ИспЦО25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(); + Исключение + ИспЦО25 = Ложь; + КонецПопытки; + + Запрос = Новый Запрос; + Если ИспЦО25 Тогда + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Цены.Цена КАК Цена + |ИЗ + | РегистрСведений.ЦеныНоменклатуры25.СрезПоследних( + | &Дата, + | Номенклатура = &Номенклатура + | И ВидЦены = &ВидЦены) КАК Цены + | + |УПОРЯДОЧИТЬ ПО + | Цены.Период УБЫВ"; + Иначе + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | Цены.Цена КАК Цена + |ИЗ + | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( + | &Дата, + | Номенклатура = &Номенклатура + | И ВидЦены = &ВидЦены) КАК Цены"; + КонецЕсли; + Запрос.УстановитьПараметр("Дата", ДатаСреза); + Запрос.УстановитьПараметр("Номенклатура", Ном); + Запрос.УстановитьПараметр("ВидЦены", ВидЦены); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() И ТипЗнч(Выборка.Цена) = Тип("Число") Тогда + Возврат Выборка.Цена; + КонецЕсли; + Возврат 0; + +КонецФункции + +Функция ЗначениеСвойства(Источник, Имя, ПоУмолчанию) + + Если Источник = Неопределено Тогда + Возврат ПоУмолчанию; + КонецЕсли; + Если ТипЗнч(Источник) = Тип("Структура") Или ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда + Если Источник.Свойство(Имя) Тогда + Возврат Источник[Имя]; + КонецЕсли; + Возврат ПоУмолчанию; + КонецЕсли; + Если ТипЗнч(Источник) = Тип("Соответствие") Или ТипЗнч(Источник) = Тип("ФиксированноеСоответствие") Тогда + Значение = Источник.Получить(Имя); + Если Значение = Неопределено Тогда + Возврат ПоУмолчанию; + КонецЕсли; + Возврат Значение; + КонецЕсли; + Возврат ПоУмолчанию; + +КонецФункции + +Функция ЧислоИзЗначения(Значение, ПоУмолчанию) + + Если Значение = Неопределено Или Значение = Null Тогда + Возврат ПоУмолчанию; + КонецЕсли; + Попытка + Возврат Число(Значение); + Исключение + Возврат ПоУмолчанию; + КонецПопытки; + +КонецФункции + +Функция БулевоИзЗначения(Значение) + + Если ТипЗнч(Значение) = Тип("Булево") Тогда + Возврат Значение; + КонецЕсли; + Если Значение = Неопределено Или Значение = Null Тогда + Возврат Ложь; + КонецЕсли; + Стр = НРег(СокрЛП(Строка(Значение))); + Возврат Стр = "true" Или Стр = "1" Или Стр = "да" Или Стр = "истина"; + +КонецФункции + +#КонецОбласти diff --git a/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма.xml b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма.xml new file mode 100644 index 0000000..db3aec8 --- /dev/null +++ b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма.xml @@ -0,0 +1,22 @@ + + +
+ + Форма + + + ru + Форма + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
diff --git a/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form.xml b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form.xml new file mode 100644 index 0000000..511d5bf --- /dev/null +++ b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form.xml @@ -0,0 +1,539 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Загрузка актуальных цен из исходной базы</v8:content> + </v8:item> + + Use + + + ПриСозданииНаСервере + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Параметры</v8:content> + </v8:item> + + AlwaysHorizontal + None + false + + + + Объект.ПодключениеКСтороннейБазе + + + + + Объект.ДатаЦен + + + + + Объект.ДатаДокументов + + + + + Объект.СоздаватьОтсутствующиеВидыЦен + Right + Auto + + + + + Объект.КомментарийДокументов + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Страницы</v8:content> + </v8:item> + + TabsOnTop + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Виды цен</v8:content> + </v8:item> + + + + + List + Объект.ВидыЦенИсточника + + + + + + + + + + + + + + ВидыЦенИсточника + SearchStringRepresentation + + + + + + + ВидыЦенИсточника + ViewStatusRepresentation + + + + + + + ВидыЦенИсточника + SearchControl + + + + + + + Объект.ВидыЦенИсточника.Отметка + EnterOnInput + 8 + Auto + + + + + Объект.ВидыЦенИсточника.Наименование + EnterOnInput + 20 + + + + + Объект.ВидыЦенИсточника.ВалютаКод + EnterOnInput + 8 + + + + + Объект.ВидыЦенИсточника.ЦенаВключаетНДС + EnterOnInput + 10 + Auto + + + + + Объект.ВидыЦенИсточника.СпособЗаданияЦены + EnterOnInput + 16 + + + + + Объект.ВидыЦенИсточника.ВидЦены + EnterOnInput + 20 + + + + + Объект.ВидыЦенИсточника.СтатусСопоставления + EnterOnInput + 14 + + + + + Объект.ВидыЦенИсточника.Комментарий + EnterOnInput + 24 + + + + +
+
+
+ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Входящие цены</v8:content> + </v8:item> + + + + + List + Объект.ВходящиеЦены + + + + + + + + + + + + + ВходящиеЦены + SearchStringRepresentation + + + + + + + ВходящиеЦены + ViewStatusRepresentation + + + + + + + ВходящиеЦены + SearchControl + + + + + + + Объект.ВходящиеЦены.Сопоставлено + EnterOnInput + 8 + Auto + + + + + Объект.ВходящиеЦены.Артикул + EnterOnInput + 12 + + + + + Объект.ВходящиеЦены.НоменклатураНаименование + EnterOnInput + 22 + + + + + Объект.ВходящиеЦены.Номенклатура + EnterOnInput + 20 + + + + + Объект.ВходящиеЦены.ХарактеристикаНаименование + EnterOnInput + 14 + + + + + Объект.ВходящиеЦены.ВидЦеныНаименование + EnterOnInput + 16 + + + + + Объект.ВходящиеЦены.ВидЦены + EnterOnInput + 16 + + + + + Объект.ВходящиеЦены.Цена + EnterOnInput + 10 + + + + + Объект.ВходящиеЦены.ТекущаяЦенаЦель + EnterOnInput + 10 + + + + + Объект.ВходящиеЦены.ВалютаКод + EnterOnInput + 8 + + + + + Объект.ВходящиеЦены.ИспользоватьСерииСклад + EnterOnInput + 12 + + + + + Объект.ВходящиеЦены.КлючЦенПоСерии + EnterOnInput + 14 + + + + + Объект.ВходящиеЦены.РазрывДетализации + EnterOnInput + 24 + + + + + Объект.ВходящиеЦены.КомментарийСопоставления + EnterOnInput + 24 + + + + + Объект.ВходящиеЦены.ЗагруженоВДокумент + EnterOnInput + 8 + Auto + + + + +
+
+
+ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Документы установки</v8:content> + </v8:item> + + + + + List + Объект.СозданныеДокументы + + + + + + + + + + СозданныеДокументы + SearchStringRepresentation + + + + + + + СозданныеДокументы + ViewStatusRepresentation + + + + + + + СозданныеДокументы + SearchControl + + + + + + + Объект.СозданныеДокументы.ДокументПредставление + EnterOnInput + 30 + + + + + Объект.СозданныеДокументы.ВидЦены + EnterOnInput + 20 + + + + + Объект.СозданныеДокументы.КоличествоСтрок + EnterOnInput + 10 + + + + + Объект.СозданныеДокументы.Комментарий + EnterOnInput + 30 + + + + +
+
+
+
+
+
+ + + + cfg:DataProcessorObject.РК_ЗагрузкаЦен + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Подключение предыдущее</v8:content> + </v8:item> + + + cfg:CatalogRef.РК_НастройкиПодключенияКВнешнейБазе + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Загрузить виды цен</v8:content> + </v8:item> + + + ЗагрузитьВидыЦен + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Отметить</v8:content> + </v8:item> + + + ОтметитьВидыЦен + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Снять отметку</v8:content> + </v8:item> + + + СнятьОтметкуВидовЦен + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Создать отсутствующие виды цен</v8:content> + </v8:item> + + + СоздатьОтсутствующиеВидыЦен + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Загрузить цены</v8:content> + </v8:item> + + + ЗагрузитьЦены + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сопоставить</v8:content> + </v8:item> + + + СопоставитьДанные + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Создать документы установки</v8:content> + </v8:item> + + + СоздатьДокументы + Auto + + + diff --git a/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form/Module.bsl b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form/Module.bsl new file mode 100644 index 0000000..6f39b9f --- /dev/null +++ b/src/DataProcessors/РК_ЗагрузкаЦен/Forms/Форма/Ext/Form/Module.bsl @@ -0,0 +1,327 @@ +//////////////////////////////////////////////////////////////////////////////// +// Форма обработки РК_ЗагрузкаЦен. +// https://git.p7net.ru/1c/crm3_26.rhana/issues/18 +//////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда + Попытка + Объект.ПодключениеКСтороннейБазе = Константы.РК_РабочееПодключениеЧерезАПИ.Получить(); + Исключение + КонецПопытки; + КонецЕсли; + ПодключениеКСтороннейБазеПредыдущее = Объект.ПодключениеКСтороннейБазе; + + Если Не ЗначениеЗаполнено(Объект.ДатаЦен) Тогда + Объект.ДатаЦен = ТекущаяДатаСеанса(); + КонецЕсли; + Если Не ЗначениеЗаполнено(Объект.ДатаДокументов) Тогда + Объект.ДатаДокументов = Объект.ДатаЦен; + КонецЕсли; + Если ПустаяСтрока(Объект.КомментарийДокументов) Тогда + Объект.КомментарийДокументов = "Перенос цен из crm3-dev"; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗагрузитьВидыЦен(Команда) + + Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда + ПоказатьПредупреждение(, "Укажите подключение к сторонней базе"); + Возврат; + КонецЕсли; + + Попытка + Текст = ЗагрузитьВидыЦенНаСервере(); + Исключение + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВидыЦен; + ПоказатьОповещениеПользователя("Виды цен", , Текст); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтметитьВидыЦен(Команда) + УстановитьОтметкуВыделенныхСтрок("ВидыЦенИсточника", Истина); +КонецПроцедуры + +&НаКлиенте +Процедура СнятьОтметкуВидовЦен(Команда) + УстановитьОтметкуВыделенныхСтрок("ВидыЦенИсточника", Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьОтсутствующиеВидыЦен(Команда) + + Если Объект.ВидыЦенИсточника.Количество() = 0 Тогда + ПоказатьПредупреждение(, "Сначала загрузите виды цен"); + Возврат; + КонецЕсли; + + Описание = Новый ОписаниеОповещения("СоздатьОтсутствующиеВидыЦенПослеВопроса", ЭтотОбъект); + ПоказатьВопрос(Описание, + "Сопоставить виды цен и создать отсутствующие в целевой ИБ?" + Символы.ПС + + "Да — запись; Нет — только проверка (тест); Отмена — прервать.", + РежимДиалогаВопрос.ДаНетОтмена); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьОтсутствующиеВидыЦенПослеВопроса(РезультатВопроса, ДопПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да); + Попытка + Текст = СопоставитьВидыЦенНаСервере(РежимТест); + Исключение + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + ПоказатьОповещениеПользователя("Виды цен", , Текст); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьЦены(Команда) + + Если Не ЗначениеЗаполнено(Объект.ПодключениеКСтороннейБазе) Тогда + ПоказатьПредупреждение(, "Укажите подключение к сторонней базе"); + Возврат; + КонецЕсли; + Если Не ЗначениеЗаполнено(Объект.ДатаЦен) Тогда + ПоказатьПредупреждение(, "Укажите дату среза цен"); + Возврат; + КонецЕсли; + + Попытка + Текст = ЗагрузитьЦеныНаСервере(); + Исключение + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВходящиеЦены; + ПоказатьОповещениеПользователя("Входящие цены", , Текст); + +КонецПроцедуры + +&НаКлиенте +Процедура СопоставитьДанные(Команда) + + Если Объект.ВходящиеЦены.Количество() = 0 Тогда + ПоказатьПредупреждение(, "Сначала загрузите цены"); + Возврат; + КонецЕсли; + + Попытка + Текст = СопоставитьЦеныНаСервере(); + Исключение + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + ПоказатьОповещениеПользователя("Сопоставление", , Текст); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьДокументы(Команда) + + Если Не ЗначениеЗаполнено(Объект.ДатаДокументов) Тогда + ПоказатьПредупреждение(, "Укажите дату документов установки"); + Возврат; + КонецЕсли; + + Описание = Новый ОписаниеОповещения("СоздатьДокументыПослеВопроса", ЭтотОбъект); + ПоказатьВопрос(Описание, + "Создать и провести документы «Установка цен номенклатуры»?" + Символы.ПС + + "Да — запись; Нет — только подсчёт (тест); Отмена — прервать.", + РежимДиалогаВопрос.ДаНетОтмена); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьДокументыПослеВопроса(РезультатВопроса, ДопПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + РежимТест = (РезультатВопроса <> КодВозвратаДиалога.Да); + Попытка + Текст = СоздатьДокументыНаСервере(РежимТест); + Исключение + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Возврат; + КонецПопытки; + Если Не РежимТест Тогда + Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСозданныеДокументы; + КонецЕсли; + ПоказатьОповещениеПользователя("Документы установки", , Текст); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Процедура УстановитьОтметкуВыделенныхСтрок(ИмяТаблицы, Отметка) + + ТаблицаФормы = Элементы[ИмяТаблицы]; + ДанныеТаблицы = Объект[ИмяТаблицы]; + Выделенные = ТаблицаФормы.ВыделенныеСтроки; + Если Выделенные.Количество() = 0 Тогда + ПоказатьПредупреждение(, "Выделите строки в таблице"); + Возврат; + КонецЕсли; + + Для Каждого ИдентификаторСтроки Из Выделенные Цикл + СтрокаТЗ = ДанныеТаблицы.НайтиПоИдентификатору(ИдентификаторСтроки); + Если СтрокаТЗ <> Неопределено Тогда + СтрокаТЗ.Отметка = Отметка; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ЗагрузитьВидыЦенНаСервере() + + Ответ = РК_ОбменСВнешнейБазой.ВидыЦенВнешнейБазы(Объект.ПодключениеКСтороннейБазе); + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + ОбъектОбработки.ЗаполнитьВидыЦенИзОтветаAPI(Ответ, Истина); + ТекстСопоставления = ОбъектОбработки.СопоставитьВидыЦен(Истина); + ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); + Возврат "Загружено " + Формат(Объект.ВидыЦенИсточника.Количество(), "ЧН=0; ЧГ=0") + + ". " + ТекстСопоставления; + +КонецФункции + +&НаСервере +Функция СопоставитьВидыЦенНаСервере(РежимТест) + + Объект.СоздаватьОтсутствующиеВидыЦен = Не РежимТест; + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + Текст = ОбъектОбработки.СопоставитьВидыЦен(РежимТест); + ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); + Возврат Текст; + +КонецФункции + +&НаСервере +Функция ЗагрузитьЦеныНаСервере() + + ВидыGUID = Новый Массив; + Для Каждого Стр Из Объект.ВидыЦенИсточника Цикл + Если Стр.Отметка И ЗначениеЗаполнено(Стр.Идентификатор) Тогда + ВидыGUID.Добавить(СокрЛП(Стр.Идентификатор)); + КонецЕсли; + КонецЦикла; + + Фильтры = Новый Структура; + Фильтры.Вставить("only_nonzero", Истина); + ПолныйОбход = Истина; + Если ВидыGUID.Количество() > 0 Тогда + Фильтры.Вставить("price_types", ВидыGUID); + ПолныйОбход = Ложь; + КонецЕсли; + + ВсеСтроки = Новый Массив; + Курсор = ""; + Лимит = 2000; + МаксСтраниц = 200; + + Для НомерСтраницы = 1 По МаксСтраниц Цикл + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("as_of", Формат(Объект.ДатаЦен, "ДФ=yyyy-MM-ddTHH:mm:ss")); + ПараметрыЗапроса.Вставить("limit", Лимит); + ПараметрыЗапроса.Вставить("filters", Фильтры); + Если ПолныйОбход Тогда + ПараметрыЗапроса.Вставить("allow_full_scan", Истина); + КонецЕсли; + Если Не ПустаяСтрока(Курсор) Тогда + ПараметрыЗапроса.Вставить("cursor", Курсор); + КонецЕсли; + + Ответ = РК_ОбменСВнешнейБазой.ЦеныВнешнейБазы(Объект.ПодключениеКСтороннейБазе, ПараметрыЗапроса); + Строки = ЗначениеСвойстваОтвета(Ответ, "rows"); + Если ТипЗнч(Строки) <> Тип("Массив") Тогда + ВызватьИсключение "Некорректный ответ /v1/prices/slice"; + КонецЕсли; + Для Каждого СтрAPI Из Строки Цикл + ВсеСтроки.Добавить(СтрAPI); + КонецЦикла; + + Мета = ЗначениеСвойстваОтвета(Ответ, "meta"); + ЕстьЕще = Ложь; + Если ТипЗнч(Мета) = Тип("Структура") Или ТипЗнч(Мета) = Тип("Соответствие") Тогда + ЗначениеЕстьЕще = ЗначениеСвойстваОтвета(Мета, "has_more"); + Если ТипЗнч(ЗначениеЕстьЕще) = Тип("Булево") Тогда + ЕстьЕще = ЗначениеЕстьЕще; + КонецЕсли; + КонецЕсли; + Курсор = СокрЛП(Строка(ЗначениеСвойстваОтвета(Ответ, "cursor"))); + Если Не ЕстьЕще Или ПустаяСтрока(Курсор) Или Строки.Количество() = 0 Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + ОбъектОбработки.ЗаполнитьВходящиеЦеныИзОтветаAPI(Новый Структура("rows", ВсеСтроки), Истина); + ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); + Возврат "Загружено строк: " + Формат(Объект.ВходящиеЦены.Количество(), "ЧН=0; ЧГ=0"); + +КонецФункции + +&НаСервере +Функция СопоставитьЦеныНаСервере() + + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + Текст = ОбъектОбработки.СопоставитьВходящиеЦены(); + ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); + Возврат Текст; + +КонецФункции + +&НаСервере +Функция СоздатьДокументыНаСервере(РежимТест) + + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + Текст = ОбъектОбработки.СоздатьДокументыУстановкиЦен(РежимТест); + ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект"); + Возврат Текст; + +КонецФункции + +&НаСервере +Функция ЗначениеСвойстваОтвета(Источник, Имя) + + Если Источник = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + Если ТипЗнч(Источник) = Тип("Структура") Или ТипЗнч(Источник) = Тип("ФиксированнаяСтруктура") Тогда + Значение = Неопределено; + Если Источник.Свойство(Имя, Значение) Тогда + Возврат Значение; + КонецЕсли; + Возврат Неопределено; + КонецЕсли; + Если ТипЗнч(Источник) = Тип("Соответствие") Или ТипЗнч(Источник) = Тип("ФиксированноеСоответствие") Тогда + Возврат Источник.Получить(Имя); + КонецЕсли; + Возврат Неопределено; + +КонецФункции + +#КонецОбласти diff --git a/src/Roles/РК_ОбщаяРольРасширения/Ext/Rights.xml b/src/Roles/РК_ОбщаяРольРасширения/Ext/Rights.xml index 0554617..d40b80d 100644 --- a/src/Roles/РК_ОбщаяРольРасширения/Ext/Rights.xml +++ b/src/Roles/РК_ОбщаяРольРасширения/Ext/Rights.xml @@ -14,6 +14,17 @@ true + + DataProcessor.РК_ЗагрузкаЦен + + Use + true + + + View + true + + Configuration.crm326RHANA diff --git a/src/Subsystems/РК_РАНА/Subsystems/РК_ОбменСВнешнейБазой.xml b/src/Subsystems/РК_РАНА/Subsystems/РК_ОбменСВнешнейБазой.xml index 013dbf6..6c3793b 100644 --- a/src/Subsystems/РК_РАНА/Subsystems/РК_ОбменСВнешнейБазой.xml +++ b/src/Subsystems/РК_РАНА/Subsystems/РК_ОбменСВнешнейБазой.xml @@ -20,6 +20,7 @@ Constant.РК_РабочееПодключениеЧерезАПИ CommonModule.РК_ОбменСВнешнейБазой DataProcessor.РК_ЗагрузкаОстатков + DataProcessor.РК_ЗагрузкаЦен DataProcessor.РК_ОбработкаПарнеровКонтрагентов