11 Commits

Author SHA1 Message Date
mihailkudravcev 0ef87a322c Обмен — приоритетный ВидНоменклатуры из ра_ВидНоменклатурыCRM326 (1.3.0.46).
При получении номенклатуры из Рабочая CRM3 сопоставляет вид по наименованию
из AdditionalInfo.РК_ВидНоменклатурыCRM326; без значения — прежний механизм.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 13:13:09 +03:00
mihailkudravcev 94f793b614 Обмен — ВидЦены строк из AdditionalInfo вместо соглашения (1.3.0.45, Д1.3).
Разбор AdditionalInfo.РК_ВидыЦенСтрок при получении; пустые виды цен
сохраняются как в источнике. Дозаполнение из соглашения убрано.

Refs: crm3-migration/-#10
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 14:25:00 +03:00
mihailkudravcev 0ebd01d0ba Обмен — дозаполнение ВидЦены в строках ТЧ при получении (1.3.0.44, Д1.3).
ED 1.8 не передаёт ВидЦены/ВидЦеныПоставщика в XDTO; после отложенной обработки
дозаполняем вид цены из соглашения без пересчёта цены и суммы.

Refs: crm3-migration/-#8
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 13:27:35 +03:00
mihailkudravcev 997b7fe110 Обмен серий: учитывать маппинг видов номенклатуры на target (1.3.0.43).
Для ПКО серий добавлен поиск существующей серии по владельцу вида с приоритетом Номер+ГоденДо и fallback по сроку при пустом номере; исключено создание дублей при несовпадении GUID.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 12:17:20 +03:00
mihailkudravcev a83f23d16c Обмен — этапы графика оплаты ЗаказКлиента (Д1.2) 1.3.0.42 2026-07-15 09:35:56 +03:00
mk eb097a8078 Версия 1.3.0.41: TransferAPI перенесён в ws-rhana.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 15:59:40 +03:00
mk 8a1624a47a HTTP Transfer API перенесён в универсальное расширение ws-rhana.
Удалены РК_TransferAPI и связанные объекты; WS — только в ws-rhana (РВС_).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 15:52:42 +03:00
mk 2dfa49b2cf HTTP Transfer API: read-only выгрузка данных для переноса (v0.1).
Добавлены РК_TransferAPI, серверный/клиентский модули, константы ключа и адреса партнёрской ИБ, роль вызова API.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 15:22:07 +03:00
mk 6a61479ba2 Обмен: досоздание объектов расчётов по договорам (1.3.0.40).
Типовой механизм UT 11.5 может не создать ОР при обмене crm3-dev→crm3-26; добавлен fallback через СоздатьЭлемент после отложенной обработки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 19:04:08 +03:00
mk 7a313f254c Документация: README расширения целевой ИБ (обмен, контрагенты, состав).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 16:25:13 +03:00
mk 45b7af871a Контрагенты: уникальность ИНН/КПП без помеченных на удаление (1.3.0.39).
Переопределение ПартнерыИКонтрагентыЛокализация — аналог crm3-dev.rhana v1.0.1.333.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 16:16:57 +03:00
8 changed files with 1152 additions and 34 deletions
+130
View File
@@ -4,6 +4,136 @@
--- ---
## 1.3.0.46 (2026-07-30)
### Обмен — приоритетный ВидНоменклатуры из ра_ВидНоменклатурыCRM326
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
При получении номенклатуры из **Рабочая CRM3**: если в пакете есть `AdditionalInfo.РК_ВидНоменклатурыCRM326`, `ВидНоменклатуры` сопоставляется по наименованию в целевой ИБ (перебивает защиту учётных реквизитов). Если значение не передано — действует прежний механизм обмена.
Пара с `crm3-dev.rhana` 1.0.1.342.
---
## 1.3.0.45 (2026-07-21)
### Обмен — ВидЦены строк из AdditionalInfo (Д1.3 / issue #10)
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
Заменяет дозаполнение из соглашения (1.3.0.44): передаём фактические виды цен из исходной ИБ.
- На отправке (`crm3-dev.rhana` 1.0.1.338): `AdditionalInfo.РК_ВидыЦенСтрок`.
- На приёме: сохранить карту при `*_ПриКонвертацииДанныхXDTO`; применить в `ОтложеннаяОбработка_*` по `ИндексВТЧ` (запасной ключ — `НомерСтроки`).
- Пустой вид цены в источнике остаётся пустым; цена/сумма не пересчитываются.
- Только узел **«Рабочая CRM3»**.
Refs: https://git.p7net.ru/rhana/crm3-migration/-/issues/10
---
## 1.3.0.44 (2026-07-21)
### Обмен — дозаполнение ВидЦены в строках ТЧ (Д1.3, вариант B)
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
ED 1.8 не передаёт `ВидЦены` / `ВидЦеныПоставщика` в строках табличных частей (XDTO-схема не меняется).
- `&После("ВыполнитьПроцедуруМодуляМенеджера")``РК_ВыполнитьПроцедуруМодуляМенеджера_ДозаполнитьВидЦены` для всех процедур `ОтложеннаяОбработка_*`.
- Универсально обходит все ТЧ документа; для пустых `ВидЦены``ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(ПоляЗаполнения = "ВидЦены")`; для `ВидЦеныПоставщика``ЦеныПартнеровЗаполнениеСервер` с тем же ограничением полей.
- Цена и сумма строк **не пересчитываются** (в отличие от `ЗаполнитьУсловияПродажПоСоглашению(Истина)`).
- Только для узла **«Рабочая CRM3»** (`РК_ЭтоОбменС_Crm3Dev`).
---
## 1.3.0.43 (2026-07-21)
### Серии номенклатуры — подбор по владельцу вида и сроку
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
- Для ПКО `Справочник_СерииНоменклатуры` добавлен подбор существующей серии с учетом
владельца серий вида номенклатуры в целевой ИБ:
- `ВладелецВида + Номер + ГоденДо`,
- `ВладелецВида + Номер`,
- при пустом номере: `ВладелецВида + ГоденДо`.
- Поиск теперь опирается на маппинг видов номенклатуры на target (через
`РК_ВладелецСерийДляВидаНоменклатуры`), что снимает конфликт, когда вид в source и target различается.
- При найденной серии с другим GUID создается предупреждение и запись из пакета пропускается
(без создания дубликата).
---
## 1.3.0.42 (2026-07-15)
### Обмен — этапы графика оплаты ЗаказКлиента (Д1.2)
База: **1.3.0.41** (ws-rhana + объекты расчётов 1.3.0.40).
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
- `&После("ОтложеннаяОбработка_ЗаказыПоставщикуКлиента")``РК_ОтложеннаяОбработка_ЗаказыПоставщикуКлиента_ЭтапыОплаты`.
- При «бедных» этапах из XDTO (пустые `ДатаПлатежа` / `ВариантОтсчета`) ТЧ очищается и перезаполняется типовым `ЭтапыОплатыСервер.ПроверитьЗаполнитьЭтапыГрафикаОплаты` по соглашению / графику оплаты / договору.
- При пустых реквизитах шапки из соглашения подставляются `ГрафикОплаты`, `ФормаОплаты`.
- Только для узла **«Рабочая CRM3»** (`РК_ЭтоОбменС_Crm3Dev`).
Данные уже загруженных заказов: `docs/transfer/Код_дозаполнения_этапов_оплаты_заказов_crm3-26.bsl` (монорепозиторий).
---
## 1.3.0.41 (2026-07-09)
### HTTP Transfer API перенесён в ws-rhana
Удалены объекты `РК_TransferAPI` и связанные модули/константы/роль.
Read-only HTTP API — в универсальном расширении [`ws-rhana`](https://git.p7net.ru/1c/ws-rhana.git) (`РВС_TransferAPI`).
---
## 1.3.0.40 (2026-07-08)
### Обмен — объекты расчётов по договорам
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
В UT 11.5 `ОбъектыРасчетов` — отдельный справочник; в XDTO 1.8 не передаётся. Типовой `ВзаиморасчетыСервер.ПередЗаписью` при обмене crm3-dev → crm3-26 может не создать ОР (пустой партнёр на договоре, сбой `СоздатьПоКлючу`).
| Процедура/функция | Назначение |
|-------------------|------------|
| `РК_ПартнерКонтрагентДляДоговора` | партнёр/контрагент из договора, подсказок заказа или последнего заказа |
| `РК_ОбеспечитьОбъектРасчетовПоДоговору` | создание ОР через `СоздатьЭлемент`, если не найден |
| `РК_ПКО_ДоговорыКонтрагентов_ДозаполнитьПартнера` | `&После` ПКО договора — дозаполнение партнёра из контрагента |
| `РК_ОтложеннаяОбработка_ДосоздатьОбъектыРасчетов` | `&После` типовой отложенной обработки — досоздание ОР по договорам из пакета |
Применяется только к узлу «Рабочая CRM3» (`РК_ЭтоОбменС_Crm3Dev`).
---
## 1.3.0.39 (2026-07-06)
### Контрагенты — уникальность ИНН/КПП
Модуль: `ПартнерыИКонтрагентыЛокализация` (заимствован).
В целевой конфигурации (crm3-26) проверка уникальности ИНН/КПП реализована в модуле локализации, а не в `ПартнерыИКонтрагенты` (как в crm3-dev). Функция возвращает структуру `НайденныеСовпадения` / `ДоступноСоздание` и учитывает `ЮрФизЛицо` (различение ИП и физлица).
| Процедура/функция | Изменение |
|-------------------|-----------|
| `ИННКППУжеИспользуетсяВИнформационнойБазе` | при поиске дублей исключаются контрагенты с `ПометкаУдаления = Истина` |
| `ПроверитьКорректностьЗаполненияКонтрагента` | для записываемого контрагента с `ПометкаУдаления` проверка уникальности ИНН/КПП **не выполняется** |
**Поведение** — аналогично `crm3-dev.rhana` v1.0.1.333:
- обычная запись — уникальность среди непомеченных на удаление;
- запись с пометкой удаления — проверка уникальности ИНН/КПП пропускается;
- дубль только у помеченного контрагента не блокирует активную карточку.
**Примечание:** отдельная CRM-функция `CRM_КлиентыСервер.ИННКППУжеИспользуетсяВИнформационнойБазе` (поиск по `Партнеры.CRM_ИНН`) не затронута — она относится к сценариям CRM, не к типовой записи справочника `Контрагенты`.
---
## 1.3.0.38 (2026-07-06) ## 1.3.0.38 (2026-07-06)
### Обмен — фильтр узла «Рабочая CRM3» ### Обмен — фильтр узла «Рабочая CRM3»
+119
View File
@@ -0,0 +1,119 @@
# crm3-26.rhana
Расширение РАНА для целевой конфигурации **crm3-26** (ИБ `crm3`, сервер `1c-srv.rhana.local`).
Текущая версия: см. [`VERSION`](VERSION) и реквизит `Version` в `src/Configuration.xml`.
Префикс новых объектов расширения: **`РК_`**.
## Назначение
Доработки целевой CRM3 редакции 3.1, не входящие в типовую конфигурацию:
- **приём данных** при синхронизации **crm3-dev → crm3-26** (защита учётных настроек целевой ИБ);
- **НСИ и бизнес-логика** РАНА (контрагенты, договоры, реализация, заказы, отладка);
- **совместимость обмена** с исходной базой (EnterpriseData 1.8, ставки НДС 22%).
Парное расширение исходной ИБ: [`crm3-dev.rhana`](../crm3-dev.rhana).
## Документация
| Документ | Содержание |
|----------|------------|
| [`CHANGELOG.md`](CHANGELOG.md) | история версий и описание доработок |
| [`../docs/transfer/Анализ_синхронизации_crm3-dev_crm3-26.md`](../docs/transfer/Анализ_синхронизации_crm3-dev_crm3-26.md) | полный анализ синхронизации (монорепозиторий crm3-26) |
| [`../docs/meta/REPOSITORIES.md`](../docs/meta/REPOSITORIES.md) | связанные git-репозитории конфигураций |
## Синхронизация crm3-dev → crm3-26
### Разделение ответственности
| Сторона | Расширение | Роль |
|---------|------------|------|
| **Исходная** (`crm3_placentapharm`) | `crm3-dev.rhana` | совместимость **отправки** (XDTO 1.8, валюта банк.счетов, фильтр узла CRM3-26) |
| **Целевая** (`crm3`) | `crm3-26.rhana` | защита **приёма** (учёт номенклатуры, склады, виды, серии) |
Доработки обмена на каждой стороне применяются **только к узлу CRM3**, без влияния на обмен с Бухгалтерией.
### Ключевые функции (целевая ИБ)
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`, область `Синхронизация_crm3_dev_crm3_26`.
| Функция | Назначение |
|---------|------------|
| `РК_УзелCrm3Dev_GUID()` | GUID узла «Рабочая CRM3» (`97cd20ee-bb06-11f0-8dac-0cc47a7d055f`) |
| `РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена)` | Истина только для обмена с исходной CRM |
### Защита при получении (v1.3.0.37+)
| Объект | Поведение |
|--------|-----------|
| **Номенклатура** (существует) | снимок и восстановление учётных реквизитов целевой ИБ после типового `ПередЗаписью` и отложенной обработки |
| **Номенклатура** (новая) | заполнение учёта по виду номенклатуры **целевой** ИБ |
| **Виды номенклатуры** (существует) | пропуск обновления (сопоставление по GUID сохраняется) |
| **Склады** (существует) | пропуск перезаписи реквизитов |
| **Серии номенклатуры** | проверка владельца + подбор по `Номер/ГоденДо` в рамках владельца вида (v1.3.0.43+) |
| **Ставки НДС** | ПКПД: `НДС22`, `НДС22_122` |
Защищаемые реквизиты номенклатуры: `ВидНоменклатуры`, `ОсобенностьУчета`, `ТипНоменклатуры`, `ИспользованиеХарактеристик`, `ВладелецСерий`, `ВладелецХарактеристик`, `ГруппаФинансовогоУчета`, `СкладскаяГруппа`.
## Контрагенты — уникальность ИНН/КПП (v1.3.0.39)
В crm3-26 проверка реализована в **`ПартнерыИКонтрагентыЛокализация`** (не в `ПартнерыИКонтрагенты`, как в crm3-dev).
| Процедура/функция | Изменение |
|-------------------|-----------|
| `ИННКППУжеИспользуетсяВИнформационнойБазе` | дубли ищутся только среди контрагентов **без** пометки удаления |
| `ПроверитьКорректностьЗаполненияКонтрагента` | для контрагента с `ПометкаУдаления` проверка уникальности **не выполняется** |
Поведение согласовано с `crm3-dev.rhana` v1.0.1.333. Отдельная CRM-функция `CRM_КлиентыСервер.ИННКППУжеИспользуетсяВИнформационнойБазе` (поиск по `Партнеры.CRM_ИНН`) не затронута.
## Состав расширения (основное)
### Общие модули
| Модуль | Назначение |
|--------|------------|
| `МенеджерОбменаЧерезУниверсальныйФормат` | синхронизация crm3-dev, защита учёта при получении |
| `ПартнерыИКонтрагентыЛокализация` | уникальность ИНН/КПП контрагентов |
| `РК_ОбщегоНазначения` / `РК_ОбщегоНазначенияВызовСервера` / `РК_ОбщегоНазначенияКлиентСервер` | инфраструктура РАНА (режим отладки и др.) |
| `ОбщегоНазначенияКлиентСервер` | доработки отборов динамических списков |
### Обработки и формы
| Объект | Назначение |
|--------|------------|
| `РК_ОбработкаПарнеровКонтрагентов` | работа с партнёрами и контрагентами |
| `РК_ФормаНастроекРана` | настройки расширения |
| `ЗагрузкаДанныхИзФайла` | доработки загрузки НСИ |
### Подсистемы
- `РК_РАНА` — общие доработки РАНА
- `РК_РАНА326` — доработки, специфичные для целевой конфигурации
## Репозиторий
```text
https://git.p7net.ru/1c/crm3_26.rhana.git
```
Каталог в монорепозитории: `crm3-26.rhana/`.
## Обновление из конфигуратора
После выгрузки из 1С EDT / конфигуратора:
```bash
scripts/normalize_1c_export.sh crm3-26.rhana # из корня crm3-26
cd crm3-26.rhana && git add -A && git status
```
Синхронизация `.gitattributes` / `.editorconfig`: `scripts/sync_git_1c_config.sh` (см. [`tools/git_1c/README.md`](../tools/git_1c/README.md)).
## Связанные конфигурации
| Сторона | Конфигурация | ИБ | Расширение |
|---------|--------------|-----|------------|
| Исходная | `crm3-dev` | `crm3_placentapharm` | `crm3-dev.rhana` |
| Целевая | `crm3-26` | `crm3` | **`crm3-26.rhana`** |
+1 -1
View File
@@ -1 +1 @@
1.3.0.38 1.3.0.46
@@ -1,4 +1,4 @@
#Область СлужебныйПрограммныйИнтерфейс #Область СлужебныйПрограммныйИнтерфейс
#Область ПКПД #Область ПКПД
// &После ЗаполнитьПравилаКонвертацииПредопределенныхДанных. // &После ЗаполнитьПравилаКонвертацииПредопределенныхДанных.
// Дополняет правило ПКПД «Перечисление_СтавкиНДС» значениями НДС22 и НДС22_122 // Дополняет правило ПКПД «Перечисление_СтавкиНДС» значениями НДС22 и НДС22_122
@@ -170,14 +170,13 @@
Если ЗначениеЗаполнено(ПолученныеДанные.ВидНоменклатуры) Тогда Если ЗначениеЗаполнено(ПолученныеДанные.ВидНоменклатуры) Тогда
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(ПолученныеДанные); Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(ПолученныеДанные);
КонецЕсли; КонецЕсли;
Возврат; Иначе
Если ПолученныеДанные.ДополнительныеСвойства.Свойство("РК_СнимокУчетаНоменклатуры") Тогда
ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные.ДополнительныеСвойства.РК_СнимокУчетаНоменклатуры);
КонецЕсли;
КонецЕсли; КонецЕсли;
Если Не ПолученныеДанные.ДополнительныеСвойства.Свойство("РК_СнимокУчетаНоменклатуры") Тогда РК_ПрименитьВидНоменклатурыCRM326ИзДополнительныхСвойств(ПолученныеДанные, ДанныеИБ);
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные.ДополнительныеСвойства.РК_СнимокУчетаНоменклатуры);
КонецПроцедуры КонецПроцедуры
@@ -329,6 +328,85 @@
КонецФункции КонецФункции
// Подбор существующей серии в целевой ИБ по владельцу вида номенклатуры.
// Приоритет:
// 1) Вид + Номер + СрокГодности (если номер и срок заполнены)
// 2) Вид + Номер (если номер заполнен)
// 3) Вид + СрокГодности (если номер пустой и срок заполнен)
//
// Параметры:
// ВладелецСерий - СправочникСсылка.ВидыНоменклатуры
// НомерСерии - Строка
// СрокГодности - Дата, Неопределено
//
// Возвращаемое значение:
// СправочникСсылка.СерииНоменклатуры, Неопределено
//
Функция РК_НайтиСериюПоВладельцуНомерСроку(ВладелецСерий, НомерСерии, СрокГодности)
Если Не ЗначениеЗаполнено(ВладелецСерий) Тогда
Возврат Неопределено;
КонецЕсли;
НомерСерии = СокрЛП(Строка(НомерСерии));
СрокЗаполнен = ЗначениеЗаполнено(СрокГодности) И СрокГодности <> '00010101';
Если Не ПустаяСтрока(НомерСерии) Тогда
Запрос = Новый Запрос;
Если СрокЗаполнен Тогда
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Срок", СрокГодности);
Иначе
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер";
КонецЕсли;
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Номер", НомерСерии);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Если СрокЗаполнен Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Срок", СрокГодности);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// &После ДобавитьПКО_Справочник_СерииНоменклатуры. // &После ДобавитьПКО_Справочник_СерииНоменклатуры.
// Подключает обработчик проверки владельца серии при получении из пакета обмена. // Подключает обработчик проверки владельца серии при получении из пакета обмена.
// //
@@ -377,6 +455,8 @@
КонецЕсли; КонецЕсли;
СсылкаДляЖурнала = ?(ДанныеИБ = Неопределено, ПолученныеДанные.ПолучитьСсылкуНового(), ДанныеИБ.Ссылка); СсылкаДляЖурнала = ?(ДанныеИБ = Неопределено, ПолученныеДанные.ПолучитьСсылкуНового(), ДанныеИБ.Ссылка);
НомерСерии = СокрЛП(Строка(ПолученныеДанные.Номер));
СрокГодности = ПолученныеДанные.ГоденДо;
Если ДанныеИБ <> Неопределено Тогда Если ДанныеИБ <> Неопределено Тогда
@@ -406,33 +486,16 @@
Иначе Иначе
ПолученныеДанные.ВидНоменклатуры = КорректныйВладелец; ПолученныеДанные.ВидНоменклатуры = КорректныйВладелец;
СуществующаяСерия = РК_НайтиСериюПоВладельцуНомерСроку(КорректныйВладелец, НомерСерии, СрокГодности);
Запрос = Новый Запрос; Если ЗначениеЗаполнено(СуществующаяСерия)
Запрос.Текст = И СуществующаяСерия <> СсылкаДляЖурнала Тогда
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И (Серии.Наименование = &Наименование
| ИЛИ Серии.Номер = &Номер
| И &НомерЗаполнен)";
Запрос.УстановитьПараметр("Владелец", КорректныйВладелец);
Запрос.УстановитьПараметр("Наименование", ПолученныеДанные.Наименование);
Запрос.УстановитьПараметр("Номер", ПолученныеДанные.Номер);
Запрос.УстановитьПараметр("НомерЗаполнен", ЗначениеЗаполнено(ПолученныеДанные.Номер));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий()
И Выборка.Ссылка <> СсылкаДляЖурнала Тогда
ТекстОшибки = СтрШаблон( ТекстОшибки = СтрШаблон(
"Серия с наименованием ""%1"" уже существует у владельца %2 (%3), GUID отличается от пакета.", "Серия уже существует у владельца %1 (%2), GUID отличается от пакета. Номер=""%3"", годен до=""%4"".",
ПолученныеДанные.Наименование,
КорректныйВладелец, КорректныйВладелец,
Выборка.Ссылка); СуществующаяСерия,
НомерСерии,
?(ЗначениеЗаполнено(СрокГодности), Формат(СрокГодности, "ДФ=yyyy-MM-dd"), ""));
ЗаписатьОшибкуВЖурналРегистрации(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена, ЗаписатьОшибкуВЖурналРегистрации(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена,
НСтр("ru = 'создать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение); НСтр("ru = 'создать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение);
ПолученныеДанные = Неопределено; ПолученныеДанные = Неопределено;
@@ -443,4 +506,609 @@
КонецПроцедуры КонецПроцедуры
// --- Объекты расчётов (crm3-dev → crm3-26) ---
// В UT 11.5 ОбъектыРасчетов — отдельный справочник; в XDTO 1.8 не передаётся.
// Типовой ВзаиморасчетыСервер.ПередЗаписью может не создать ОР (СоздатьПоКлючу, пустой партнёр).
// См. docs/transfer/План_синхронизации_2026-07-06_Учет.md (У1.1), Код_создания_объектов_расчетов_договоров.bsl.
// Возвращает партнёра и контрагента для договора: из договора, подсказок или последнего заказа.
//
// Параметры:
// ДоговорСсылка - СправочникСсылка.ДоговорыКонтрагентов.
// ПартнерПодсказка - СправочникСсылка.Партнеры, Неопределено.
// КонтрагентПодсказка - СправочникСсылка.Контрагенты, Неопределено.
//
// Возвращаемое значение:
// Структура - Партнер, Контрагент (могут остаться пустыми).
//
Функция РК_ПартнерКонтрагентДляДоговора(ДоговорСсылка, ПартнерПодсказка = Неопределено, КонтрагентПодсказка = Неопределено)
Результат = Новый Структура("Партнер, Контрагент");
Если Не ЗначениеЗаполнено(ДоговорСсылка) Тогда
Возврат Результат;
КонецЕсли;
РеквизитыДоговора = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДоговорСсылка, "Партнер, Контрагент");
Партнер = РеквизитыДоговора.Партнер;
Контрагент = РеквизитыДоговора.Контрагент;
Если ЗначениеЗаполнено(ПартнерПодсказка) Тогда
Партнер = ПартнерПодсказка;
КонецЕсли;
Если ЗначениеЗаполнено(КонтрагентПодсказка) Тогда
Контрагент = КонтрагентПодсказка;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контрагент) И ЗначениеЗаполнено(Партнер) Тогда
Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер);
КонецЕсли;
Если Не ЗначениеЗаполнено(Партнер) И ЗначениеЗаполнено(Контрагент) Тогда
Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "Партнер");
КонецЕсли;
Если Не ЗначениеЗаполнено(Партнер) ИЛИ Не ЗначениеЗаполнено(Контрагент) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Зак.Партнер КАК Партнер,
| Зак.Контрагент КАК Контрагент
|ИЗ
| Документ.ЗаказКлиента КАК Зак
|ГДЕ
| Зак.Договор = &Договор
| И НЕ Зак.ПометкаУдаления
|УПОРЯДОЧИТЬ ПО
| Зак.Дата УБЫВ";
Запрос.УстановитьПараметр("Договор", ДоговорСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Не ЗначениеЗаполнено(Партнер) Тогда
Партнер = Выборка.Партнер;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контрагент) Тогда
Контрагент = Выборка.Контрагент;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ЗначениеЗаполнено(Контрагент) И ЗначениеЗаполнено(Партнер) Тогда
Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(Партнер);
КонецЕсли;
Результат.Партнер = Партнер;
Результат.Контрагент = Контрагент;
Возврат Результат;
КонецФункции
// Создаёт элемент справочника ОбъектыРасчетов для договора, если его ещё нет.
// Использует СоздатьЭлемент (не СоздатьПоКлючу — падает на договорах из обмена).
//
// Параметры:
// ДоговорСсылка - СправочникСсылка.ДоговорыКонтрагентов.
// Партнер - СправочникСсылка.Партнеры.
// Контрагент - СправочникСсылка.Контрагенты.
// КомпонентыОбмена - Структура - контекст обмена (для журнала).
//
// Возвращаемое значение:
// СправочникСсылка.ОбъектыРасчетов - созданный или найденный ОР; пустая ссылка при ошибке.
//
Функция РК_ОбеспечитьОбъектРасчетовПоДоговору(ДоговорСсылка, Партнер, Контрагент, КомпонентыОбмена)
ПустаяСсылкаОР = Справочники.ОбъектыРасчетов.ПустаяСсылка();
Если Не ЗначениеЗаполнено(ДоговорСсылка) Или Не ОбщегоНазначения.СсылкаСуществует(ДоговорСсылка) Тогда
Возврат ПустаяСсылкаОР;
КонецЕсли;
Если Не ЗначениеЗаполнено(Партнер) Или Не ЗначениеЗаполнено(Контрагент) Тогда
Возврат ПустаяСсылкаОР;
КонецЕсли;
Организация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДоговорСсылка, "Организация");
Если Не ЗначениеЗаполнено(Организация) Тогда
Возврат ПустаяСсылкаОР;
КонецЕсли;
Валюта = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДоговорСсылка, "ВалютаВзаиморасчетов");
Если Не ЗначениеЗаполнено(Валюта) Тогда
Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КонецЕсли;
КритерииОР = ОбъектыРасчетовСервер.ДополнительныеКритерииПоиска();
КритерииОР.Партнер = Партнер;
КритерииОР.Контрагент = Контрагент;
КритерииОР.ВалютаВзаиморасчетов = Валюта;
КритерииОР.ВернутьПервый = Истина;
СсылкаОР = ОбъектыРасчетовСервер.ПолучитьОбъектРасчетовПоСсылке(
ДоговорСсылка,
Организация,
Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом,
КритерииОР);
Если ЗначениеЗаполнено(СсылкаОР) Тогда
Возврат СсылкаОР;
КонецЕсли;
Попытка
НовыйОР = Справочники.ОбъектыРасчетов.СоздатьЭлемент();
НовыйОР.Объект = ДоговорСсылка;
НовыйОР.Организация = Организация;
НовыйОР.Контрагент = Контрагент;
НовыйОР.Партнер = Партнер;
НовыйОР.ТипРасчетов = Перечисления.ТипыРасчетовСПартнерами.РасчетыСКлиентом;
НовыйОР.ВалютаВзаиморасчетов = Валюта;
НовыйОР.Договор = ДоговорСсылка;
НовыйОР.Записать();
Возврат НовыйОР.Ссылка;
Исключение
ТекстОшибки = СтрШаблон(
"Не удалось создать объект расчётов для договора %1: %2",
ДоговорСсылка,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗаписатьОшибкуВЖурналРегистрации(ДоговорСсылка, ТекстОшибки, КомпонентыОбмена,
НСтр("ru = 'создать объект расчётов по договору'"), УровеньЖурналаРегистрации.Предупреждение);
Возврат ПустаяСсылкаОР;
КонецПопытки;
КонецФункции
// &После ПКО_Справочник_ДоговорыКонтрагентов_Получение_ПередЗаписьюПолученныхДанных.
// Дозаполняет партнёра на договоре из контрагента до записи в ИБ.
//
&После("ПКО_Справочник_ДоговорыКонтрагентов_Получение_ПередЗаписьюПолученныхДанных")
Процедура РК_ПКО_ДоговорыКонтрагентов_ДозаполнитьПартнера(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ПолученныеДанные.Партнер) И ЗначениеЗаполнено(ПолученныеДанные.Контрагент) Тогда
ПолученныеДанные.Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПолученныеДанные.Контрагент, "Партнер");
КонецЕсли;
Если Не ЗначениеЗаполнено(ПолученныеДанные.Контрагент) И ЗначениеЗаполнено(ПолученныеДанные.Партнер) Тогда
ПолученныеДанные.Контрагент = ПартнерыИКонтрагенты.ПолучитьКонтрагентаПартнераПоУмолчанию(ПолученныеДанные.Партнер);
КонецЕсли;
КонецПроцедуры
// &После ОтложеннаяОбработка_СоздатьОбновитьОбъектыРасчетов.
// Досоздаёт объекты расчётов по договорам из пакета обмена, если типовой механизм их пропустил.
//
&После("ОтложеннаяОбработка_СоздатьОбновитьОбъектыРасчетов")
Процедура РК_ОтложеннаяОбработка_ДосоздатьОбъектыРасчетов(КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
ДоговорыКОбработке = Новый Соответствие;
Для Каждого ЗагруженныйОбъект Из КомпонентыОбмена.ЗагруженныеОбъекты Цикл
СсылкаНаОбъект = ЗагруженныйОбъект.СсылкаНаОбъект;
ТипСсылки = ТипЗнч(СсылкаНаОбъект);
Если ТипСсылки = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
ДоговорыКОбработке.Вставить(СсылкаНаОбъект, Новый Структура("Партнер, Контрагент"));
ИначеЕсли ТипСсылки = Тип("ДокументСсылка.ЗаказКлиента") Тогда
РеквизитыЗаказа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаОбъект, "Договор, Партнер, Контрагент");
Если ЗначениеЗаполнено(РеквизитыЗаказа.Договор) Тогда
Подсказки = Новый Структура("Партнер, Контрагент", РеквизитыЗаказа.Партнер, РеквизитыЗаказа.Контрагент);
ДоговорыКОбработке.Вставить(РеквизитыЗаказа.Договор, Подсказки);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого КлючИЗначение Из ДоговорыКОбработке Цикл
ДоговорСсылка = КлючИЗначение.Ключ;
Подсказки = КлючИЗначение.Значение;
Участники = РК_ПартнерКонтрагентДляДоговора(
ДоговорСсылка,
Подсказки.Партнер,
Подсказки.Контрагент);
РК_ОбеспечитьОбъектРасчетовПоДоговору(
ДоговорСсылка,
Участники.Партнер,
Участники.Контрагент,
КомпонентыОбмена);
КонецЦикла;
КонецПроцедуры
// Д1.2: этапы графика оплаты из соглашения/договора при загрузке ЗаказКлиента.
// XDTO 1.8 не передаёт ВариантОтсчета; ДатаПлатежа часто пустая.
// Типовой ОтложеннаяОбработка_ЗаказыПоставщикуКлиента вызывает
// ЭтапыОплатыСервер.ПроверитьЗаполнитьЭтапыГрафикаОплаты только при пустой ТЧ —
// при «бедных» строках из пакета пересчёт не выполняется.
//
&После("ОтложеннаяОбработка_ЗаказыПоставщикуКлиента")
Процедура РК_ОтложеннаяОбработка_ЗаказыПоставщикуКлиента_ЭтапыОплаты(Объект, КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
РК_ДозаполнитьЭтапыГрафикаОплатыПоСоглашению(Объект);
КонецПроцедуры
// Перезаполняет ТЧ ЭтапыГрафикаОплаты, если есть строки без ДатаПлатежа / ВариантОтсчета.
// Иначе вызывает типовое заполнение из соглашения / графика оплаты / договора.
//
Процедура РК_ДозаполнитьЭтапыГрафикаОплатыПоСоглашению(Объект) Экспорт
Если Объект = Неопределено Тогда
Возврат;
КонецЕсли;
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.ТабличныеЧасти.Найти("ЭтапыГрафикаОплаты") = Неопределено Тогда
Возврат;
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено Тогда
Возврат;
КонецЕсли;
НужноПерезаполнить = Ложь;
Если Объект.ЭтапыГрафикаОплаты.Количество() = 0 Тогда
НужноПерезаполнить = ЗначениеЗаполнено(Объект.Соглашение)
Или (МетаОбъекта.Реквизиты.Найти("ГрафикОплаты") <> Неопределено
И ЗначениеЗаполнено(Объект.ГрафикОплаты))
Или (МетаОбъекта.Реквизиты.Найти("Договор") <> Неопределено
И ЗначениеЗаполнено(Объект.Договор));
Иначе
Для Каждого СтрокаЭтапа Из Объект.ЭтапыГрафикаОплаты Цикл
Если Не ЗначениеЗаполнено(СтрокаЭтапа.ДатаПлатежа)
Или Не ЗначениеЗаполнено(СтрокаЭтапа.ВариантОтсчета) Тогда
НужноПерезаполнить = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Не НужноПерезаполнить Тогда
Возврат;
КонецЕсли;
// Условия из соглашения (как при перевыборе на форме): график и форма оплаты.
Если ЗначениеЗаполнено(Объект.Соглашение)
И ТипЗнч(Объект.Соглашение) = Тип("СправочникСсылка.СоглашенияСКлиентами") Тогда
РеквизитыСоглашения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект.Соглашение,
"ГрафикОплаты,ФормаОплаты");
Если МетаОбъекта.Реквизиты.Найти("ГрафикОплаты") <> Неопределено
И Не ЗначениеЗаполнено(Объект.ГрафикОплаты)
И ЗначениеЗаполнено(РеквизитыСоглашения.ГрафикОплаты) Тогда
Объект.ГрафикОплаты = РеквизитыСоглашения.ГрафикОплаты;
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("ФормаОплаты") <> Неопределено
И Не ЗначениеЗаполнено(Объект.ФормаОплаты)
И ЗначениеЗаполнено(РеквизитыСоглашения.ФормаОплаты) Тогда
Объект.ФормаОплаты = РеквизитыСоглашения.ФормаОплаты;
КонецЕсли;
КонецЕсли;
Объект.ЭтапыГрафикаОплаты.Очистить();
ЭтапыОплатыСервер.ПроверитьЗаполнитьЭтапыГрафикаОплаты(Объект);
КонецПроцедуры
// Д1.3 / issue #10: ВидЦены строк из AdditionalInfo.РК_ВидыЦенСтрок (не из соглашения).
// 1) ПриКонвертацииДанныхXDTO — сохранить карту в ДополнительныеСвойства и ПараметрыКонвертации.
// 2) ОтложеннаяОбработка_* — применить к ТЧ документа (пустые в источнике остаются пустыми).
//
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура РК_ВыполнитьПроцедуруМодуляМенеджера_ВидыЦенИзAdditionalInfo(ИмяПроцедуры, Параметры)
Если Параметры = Неопределено Тогда
Возврат;
КонецЕсли;
КомпонентыОбмена = Неопределено;
Параметры.Свойство("КомпонентыОбмена", КомпонентыОбмена);
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если СтрЗаканчиваетсяНа(ИмяПроцедуры, "_ПриКонвертацииДанныхXDTO") Тогда
ДанныеXDTO = Неопределено;
ПолученныеДанные = Неопределено;
Параметры.Свойство("ДанныеXDTO", ДанныеXDTO);
Параметры.Свойство("ПолученныеДанные", ПолученныеДанные);
РК_СохранитьВидыЦенСтрокИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена);
РК_СохранитьВидНоменклатурыCRM326ИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные);
ИначеЕсли СтрНачинаетсяС(ИмяПроцедуры, "ОтложеннаяОбработка_") Тогда
Объект = Неопределено;
Если Не Параметры.Свойство("Объект", Объект) Или Объект = Неопределено Тогда
Возврат;
КонецЕсли;
РК_ПрименитьВидыЦенСтрокИзДополнительныхСвойств(Объект, КомпонентыОбмена);
КонецЕсли;
КонецПроцедуры
Процедура РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена)
Если КомпонентыОбмена = Неопределено Или Не КомпонентыОбмена.Свойство("ПараметрыКонвертации") Тогда
Возврат;
КонецЕсли;
Если Не КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
КомпонентыОбмена.ПараметрыКонвертации.Вставить("РК_ВидыЦенСтрокПоОбъектам", Новый Соответствие);
КонецЕсли;
КонецПроцедуры
Функция РК_КлючКешаВидовЦенСтрок(Объект)
Попытка
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Возврат НРег(XMLСтрока(Объект.Ссылка.УникальныйИдентификатор()));
КонецЕсли;
Исключение
КонецПопытки;
Попытка
СсылкаНового = Объект.ПолучитьСсылкуНового();
Если ЗначениеЗаполнено(СсылкаНового) Тогда
Возврат НРег(XMLСтрока(СсылкаНового.УникальныйИдентификатор()));
КонецЕсли;
Исключение
КонецПопытки;
Возврат "";
КонецФункции
// Копирует РК_ВидыЦенСтрок из AdditionalInfo пакета в ДополнительныеСвойства и кеш сессии обмена.
//
Процедура РК_СохранитьВидыЦенСтрокИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
Если ДанныеXDTO = Неопределено Или ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ДанныеXDTO.Свойство("AdditionalInfo")
Или ТипЗнч(ДанныеXDTO.AdditionalInfo) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
ВидыЦенСтрок = Неопределено;
Если Не ДанныеXDTO.AdditionalInfo.Свойство("РК_ВидыЦенСтрок", ВидыЦенСтрок)
Или ВидыЦенСтрок = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
ПолученныеДанные.ДополнительныеСвойства.Вставить("РК_ВидыЦенСтрок", ВидыЦенСтрок);
Исключение
// ПолученныеДанные может быть структурой без ДополнительныеСвойства.
КонецПопытки;
РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена);
Ключ = РК_КлючКешаВидовЦенСтрок(ПолученныеДанные);
Если ЗначениеЗаполнено(Ключ)
И КомпонентыОбмена <> Неопределено
И КомпонентыОбмена.Свойство("ПараметрыКонвертации")
И КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
КомпонентыОбмена.ПараметрыКонвертации.РК_ВидыЦенСтрокПоОбъектам.Вставить(Ключ, ВидыЦенСтрок);
КонецЕсли;
КонецПроцедуры
// Проставляет ВидЦены / ВидЦеныПоставщика в строках ТЧ по карте из AdditionalInfo.
//
Процедура РК_ПрименитьВидыЦенСтрокИзДополнительныхСвойств(Объект, КомпонентыОбмена = Неопределено) Экспорт
Если Объект = Неопределено Тогда
Возврат;
КонецЕсли;
ВидыЦенСтрок = Неопределено;
Попытка
Объект.ДополнительныеСвойства.Свойство("РК_ВидыЦенСтрок", ВидыЦенСтрок);
Исключение
ВидыЦенСтрок = Неопределено;
КонецПопытки;
Если ВидыЦенСтрок = Неопределено И КомпонентыОбмена <> Неопределено Тогда
РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена);
Ключ = РК_КлючКешаВидовЦенСтрок(Объект);
Если ЗначениеЗаполнено(Ключ)
И КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
ВидыЦенСтрок = КомпонентыОбмена.ПараметрыКонвертации.РК_ВидыЦенСтрокПоОбъектам.Получить(Ключ);
КонецЕсли;
КонецЕсли;
Если ВидыЦенСтрок = Неопределено Тогда
Возврат;
КонецЕсли;
МетаОбъекта = Объект.Метаданные();
Для Каждого ОписаниеСтроки Из ВидыЦенСтрок Цикл
Если ТипЗнч(ОписаниеСтроки) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
ИмяТЧ = Неопределено;
НомерСтроки = Неопределено;
ОписаниеСтроки.Свойство("ТЧ", ИмяТЧ);
ОписаниеСтроки.Свойство("НомерСтроки", НомерСтроки);
Если Не ЗначениеЗаполнено(ИмяТЧ) Или Не ЗначениеЗаполнено(НомерСтроки) Тогда
Продолжить;
КонецЕсли;
МетаТЧ = МетаОбъекта.ТабличныеЧасти.Найти(ИмяТЧ);
Если МетаТЧ = Неопределено Тогда
Продолжить;
КонецЕсли;
ТабличнаяЧасть = Объект[ИмяТЧ];
СтрокаТЧ = Неопределено;
ИндексВТЧ = Неопределено;
Если ОписаниеСтроки.Свойство("ИндексВТЧ", ИндексВТЧ)
И ТипЗнч(ИндексВТЧ) = Тип("Число")
И ИндексВТЧ >= 0
И ИндексВТЧ < ТабличнаяЧасть.Количество() Тогда
СтрокаТЧ = ТабличнаяЧасть[ИндексВТЧ];
КонецЕсли;
Если СтрокаТЧ = Неопределено Тогда
СтрокаТЧ = ТабличнаяЧасть.Найти(НомерСтроки, "НомерСтроки");
КонецЕсли;
Если СтрокаТЧ = Неопределено Тогда
Продолжить;
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦены") <> Неопределено
И ОписаниеСтроки.Свойство("ВидЦены") Тогда
СтрокаТЧ.ВидЦены = РК_НайтиВидЦеныПоОписанию(
ОписаниеСтроки, "ВидЦены", "ВидЦеныИмя", Ложь);
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦеныПоставщика") <> Неопределено
И ОписаниеСтроки.Свойство("ВидЦеныПоставщика") Тогда
СтрокаТЧ.ВидЦеныПоставщика = РК_НайтиВидЦеныПоОписанию(
ОписаниеСтроки, "ВидЦеныПоставщика", "ВидЦеныПоставщикаИмя", Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Разрешает ссылку вида цены: GUID (если объект есть в ИБ), иначе наименование; пусто → пустая ссылка.
//
Функция РК_НайтиВидЦеныПоОписанию(ОписаниеСтроки, ИмяGUID, ИмяНаименования, ЭтоПоставщика)
Если ЭтоПоставщика Тогда
МенеджерВидовЦен = Справочники.ВидыЦенПоставщиков;
Иначе
МенеджерВидовЦен = Справочники.ВидыЦен;
КонецЕсли;
GUIDСтрока = "";
Наименование = "";
ОписаниеСтроки.Свойство(ИмяGUID, GUIDСтрока);
ОписаниеСтроки.Свойство(ИмяНаименования, Наименование);
Если ЗначениеЗаполнено(GUIDСтрока) Тогда
Попытка
СсылкаПоGUID = МенеджерВидовЦен.ПолучитьСсылку(Новый УникальныйИдентификатор(GUIDСтрока));
Если ОбщегоНазначения.СсылкаСуществует(СсылкаПоGUID) Тогда
Возврат СсылкаПоGUID;
КонецЕсли;
Исключение
// Некорректный GUID — пробуем наименование.
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
СсылкаПоИмени = МенеджерВидовЦен.НайтиПоНаименованию(Наименование, Истина);
Если ЗначениеЗаполнено(СсылкаПоИмени) Тогда
Возврат СсылкаПоИмени;
КонецЕсли;
КонецЕсли;
Возврат МенеджерВидовЦен.ПустаяСсылка();
КонецФункции
// Ключ AdditionalInfo для вида номенклатуры CRM3-26 (доп. реквизит ра_ВидНоменклатурыCRM326 в исходной ИБ).
//
Функция РК_КлючAdditionalInfoВидНоменклатурыCRM326()
Возврат "РК_ВидНоменклатурыCRM326";
КонецФункции
// Сохраняет наименование вида номенклатуры из AdditionalInfo пакета в ДополнительныеСвойства номенклатуры.
//
Процедура РК_СохранитьВидНоменклатурыCRM326ИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные)
Если ДанныеXDTO = Неопределено Или ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ДанныеXDTO.Свойство("AdditionalInfo")
Или ТипЗнч(ДанныеXDTO.AdditionalInfo) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
НаименованиеВида = "";
Если Не ДанныеXDTO.AdditionalInfo.Свойство(РК_КлючAdditionalInfoВидНоменклатурыCRM326(), НаименованиеВида)
Или Не ЗначениеЗаполнено(НаименованиеВида) Тогда
Возврат;
КонецЕсли;
Попытка
ПолученныеДанные.ДополнительныеСвойства.Вставить(РК_КлючAdditionalInfoВидНоменклатурыCRM326(), СокрЛП(Строка(НаименованиеВида)));
Исключение
// ПолученныеДанные может быть структурой без ДополнительныеСвойства.
КонецПопытки;
КонецПроцедуры
// Приоритетно сопоставляет ВидНоменклатуры целевой ИБ по наименованию из ра_ВидНоменклатурыCRM326.
// Если значение не передано — остаётся текущий механизм обмена (в т.ч. защита учётных реквизитов).
//
Процедура РК_ПрименитьВидНоменклатурыCRM326ИзДополнительныхСвойств(ПолученныеДанные, ДанныеИБ)
Если ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
НаименованиеВида = "";
Попытка
Если Не ПолученныеДанные.ДополнительныеСвойства.Свойство(РК_КлючAdditionalInfoВидНоменклатурыCRM326(), НаименованиеВида)
Или Не ЗначениеЗаполнено(НаименованиеВида) Тогда
Возврат;
КонецЕсли;
Исключение
Возврат;
КонецПопытки;
ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(СокрЛП(Строка(НаименованиеВида)), Истина);
Если Не ЗначениеЗаполнено(ВидНоменклатуры) Тогда
Возврат;
КонецЕсли;
ПолученныеДанные.ВидНоменклатуры = ВидНоменклатуры;
Если ДанныеИБ <> Неопределено Тогда
ДанныеИБ.ВидНоменклатуры = ВидНоменклатуры;
Иначе
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(ПолученныеДанные);
КонецЕсли;
КонецПроцедуры
#КонецОбласти #КонецОбласти
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<CommonModule uuid="204641bf-09d1-470a-9d72-3eb46439556d">
<InternalInfo>
<xr:PropertyState>
<xr:Property>Module</xr:Property>
<xr:State>Extended</xr:State>
</xr:PropertyState>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ПартнерыИКонтрагентыЛокализация</Name>
<Comment/>
<ExtendedConfigurationObject>c7ca240a-541d-4f86-8e30-0e63aafcd5fa</ExtendedConfigurationObject>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
</Properties>
</CommonModule>
</MetaDataObject>
@@ -0,0 +1,175 @@
&ИзменениеИКонтроль("ИННКППУжеИспользуетсяВИнформационнойБазе")
Функция РК_ИННКППУжеИспользуетсяВИнформационнойБазе(ИНН, КПП, ИсключаяСсылку = Неопределено, ЮрФизЛицо = Неопределено) Экспорт
РезультатПоиска = Новый Структура;
РезультатПоиска.Вставить("НайденныеСовпадения", Новый Массив);
РезультатПоиска.Вставить("ДоступноСоздание", Истина);
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
#Удаление
Запрос.Текст = "
|ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
| Партнеры.Ссылка КАК Партнер,
| Партнеры.Код КАК Код,
| ПРЕДСТАВЛЕНИЕ(Партнеры.ОсновнойМенеджер) КАК ОсновнойМенеджер
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
| ПО Контрагенты.Партнер = Партнеры.Ссылка
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП
| И Контрагенты.Ссылка <> &Ссылка";
#КонецУдаления
#Вставка
// {{ [+] (фрагмент ДОБАВЛЕН), уникальность ИНН/КПП только среди непомеченных на удаление контрагентов
Запрос.Текст = "
|ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.ЮрФизЛицо КАК ЮрФизЛицо,
| Партнеры.Ссылка КАК Партнер,
| Партнеры.Код КАК Код,
| ПРЕДСТАВЛЕНИЕ(Партнеры.ОсновнойМенеджер) КАК ОсновнойМенеджер
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
| ПО Контрагенты.Партнер = Партнеры.Ссылка
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП
| И Контрагенты.Ссылка <> &Ссылка
| И НЕ Контрагенты.ПометкаУдаления";
// }}
#КонецВставки
Запрос.УстановитьПараметр("ИНН",ИНН);
Запрос.УстановитьПараметр("КПП",КПП);
Запрос.УстановитьПараметр("Ссылка",ИсключаяСсылку);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 1 Тогда
Выборка.Следующий();
Если ЗначениеЗаполнено(ИсключаяСсылку)
И Выборка.Ссылка = ИсключаяСсылку Тогда
Возврат РезультатПоиска;
ИначеЕсли ЗначениеЗаполнено(ЮрФизЛицо) Тогда
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель
И Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения);
ИначеЕсли ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо
И Выборка.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель Тогда
ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения);
Иначе
ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения);
РезультатПоиска.ДоступноСоздание = Ложь;
КонецЕсли;
Иначе
ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения);
РезультатПоиска.ДоступноСоздание = Ложь;
КонецЕсли;
ИначеЕсли Выборка.Количество() > 1 Тогда
РезультатПоиска.ДоступноСоздание = Ложь;
Пока Выборка.Следующий() Цикл
ДобавитьДанныеНайденногоКонтрагента(Выборка, РезультатПоиска.НайденныеСовпадения);
КонецЦикла;
КонецЕсли;
Возврат РезультатПоиска;
КонецФункции
&ИзменениеИКонтроль("ПроверитьКорректностьЗаполненияКонтрагента")
Процедура РК_ПроверитьКорректностьЗаполненияКонтрагента(Объект, Контрагент, Отказ) Экспорт
//++ Локализация
КлючДанных = ?(ТипЗнч(Объект) = Тип("ФормаКлиентскогоПриложения"), Неопределено, Объект);
Если Объект.ОбособленноеПодразделение И ЗначениеЗаполнено(Объект.ГоловнойКонтрагент) Тогда
Если Объект.ГоловнойКонтрагент <> Контрагент Тогда
СвойстваГоловногоКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
Объект.ГоловнойКонтрагент, "Наименование, ИНН");
Если ЗначениеЗаполнено(СвойстваГоловногоКонтрагента.ИНН) И СвойстваГоловногоКонтрагента.ИНН <> Объект.ИНН Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'ИНН контрагента не равен указанному в головном подразделении'"),
СвойстваГоловногоКонтрагента.Наименование);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, КлючДанных, "ИНН", , Отказ);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Объект.ИНН) Тогда
#Вставка
// {{ [+] (фрагмент ДОБАВЛЕН), для помеченных на удаление уникальность ИНН/КПП не проверяется
Если НЕ Объект.ПометкаУдаления Тогда
// }}
#КонецВставки
РезультатПоиска = ИННКППУжеИспользуетсяВИнформационнойБазе(Объект.ИНН, Объект.КПП, Контрагент, Объект.ЮрФизЛицо) ;
Если Не РезультатПоиска.ДоступноСоздание Тогда
ДанныеКонтрагента = РезультатПоиска.НайденныеСовпадения[0];
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Данные ИНН и КПП уже указаны для другого контрагента, ответственный - %1.'"),
ДанныеКонтрагента.ОсновнойМенеджер),
КлючДанных,
"ИНН",
,
Отказ);
КонецЕсли;
#Вставка
КонецЕсли;
// }}
#КонецВставки
Иначе
Если НЕ ПартнерыИКонтрагенты.УпрощенныйВводДоступен() Тогда
Если (Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ИндивидуальныйПредприниматель
ИЛИ Объект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Не указан ИНН'"),
КлючДанных,
"ИНН",
,
Отказ);
КонецЕсли;
КонецЕсли;
КонецЕсли;
//-- Локализация
КонецПроцедуры
+2
View File
@@ -9,6 +9,8 @@
<Metadata name="CommonForm.РК_ФормаНастроекРана.Form" id="5688e1b9-1552-45cc-b539-1f4cc3765e8a.0" configVersion="ea9a4ab0f585a6af14dc4941cc5fd2e48f221b6a"/> <Metadata name="CommonForm.РК_ФормаНастроекРана.Form" id="5688e1b9-1552-45cc-b539-1f4cc3765e8a.0" configVersion="ea9a4ab0f585a6af14dc4941cc5fd2e48f221b6a"/>
<Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат" id="46adff34-2644-4eb3-99a7-e969dbdf8496" configVersion="0e38e0f4d63c0c4783d0c8935de492efee1e4863"/> <Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат" id="46adff34-2644-4eb3-99a7-e969dbdf8496" configVersion="0e38e0f4d63c0c4783d0c8935de492efee1e4863"/>
<Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат.Module" id="46adff34-2644-4eb3-99a7-e969dbdf8496.0" configVersion="89e8efb209d7477a14ca8b50b3aa0065918e53b7"/> <Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат.Module" id="46adff34-2644-4eb3-99a7-e969dbdf8496.0" configVersion="89e8efb209d7477a14ca8b50b3aa0065918e53b7"/>
<Metadata name="CommonModule.ПартнерыИКонтрагентыЛокализация" id="204641bf-09d1-470a-9d72-3eb46439556d" configVersion="4d92732dfb20d7aac1e4e8e85d854a56b78cb8ae"/>
<Metadata name="CommonModule.ПартнерыИКонтрагентыЛокализация.Module" id="204641bf-09d1-470a-9d72-3eb46439556d.0" configVersion="126cf53fde7bdeb39ba2495d14b179dc815a8331"/>
<Metadata name="CommonModule.ОбщегоНазначенияКлиентСервер" id="1afe1653-696f-47e3-9bea-df7b84bd077c" configVersion="a3b2d57b152d8cd275a412ddf1479ac90b35402d"/> <Metadata name="CommonModule.ОбщегоНазначенияКлиентСервер" id="1afe1653-696f-47e3-9bea-df7b84bd077c" configVersion="a3b2d57b152d8cd275a412ddf1479ac90b35402d"/>
<Metadata name="CommonModule.ОбщегоНазначенияКлиентСервер.Module" id="1afe1653-696f-47e3-9bea-df7b84bd077c.0" configVersion="74e1779aaae2e2e61a3957d284da0d61b1e34d41"/> <Metadata name="CommonModule.ОбщегоНазначенияКлиентСервер.Module" id="1afe1653-696f-47e3-9bea-df7b84bd077c.0" configVersion="74e1779aaae2e2e61a3957d284da0d61b1e34d41"/>
<Metadata name="CommonModule.РК_ОбщегоНазначения" id="6bfc7b15-6995-43ad-96c6-a97569f2d5a4" configVersion="c11a335f853a42165758cfe7995f2ee06a9010f7"/> <Metadata name="CommonModule.РК_ОбщегоНазначения" id="6bfc7b15-6995-43ad-96c6-a97569f2d5a4" configVersion="c11a335f853a42165758cfe7995f2ee06a9010f7"/>
+3 -2
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20"> <MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<Configuration uuid="ef31d55b-3788-4972-affb-b7aefd3838aa"> <Configuration uuid="ef31d55b-3788-4972-affb-b7aefd3838aa">
<InternalInfo> <InternalInfo>
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item> <xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles> </DefaultRoles>
<Vendor/> <Vendor/>
<Version>1.3.0.38</Version> <Version>1.3.0.46</Version>
<DefaultStyle/> <DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/> <BriefInformation/>
@@ -97,6 +97,7 @@
<CommonModule>РК_ОбщегоНазначенияВызовСервера</CommonModule> <CommonModule>РК_ОбщегоНазначенияВызовСервера</CommonModule>
<CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule> <CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule>
<CommonModule>МенеджерОбменаЧерезУниверсальныйФормат</CommonModule> <CommonModule>МенеджерОбменаЧерезУниверсальныйФормат</CommonModule>
<CommonModule>ПартнерыИКонтрагентыЛокализация</CommonModule>
<XDTOPackage>EnterpriseData_1_8_7</XDTOPackage> <XDTOPackage>EnterpriseData_1_8_7</XDTOPackage>
<XDTOPackage>EnterpriseData_1_8_6</XDTOPackage> <XDTOPackage>EnterpriseData_1_8_6</XDTOPackage>
<FunctionalOption>РК_ФункциональнаяОпцияРежимаОтладки</FunctionalOption> <FunctionalOption>РК_ФункциональнаяОпцияРежимаОтладки</FunctionalOption>