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 @@
+
+
+
+
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 @@
+
+
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
+