15 Commits

Author SHA1 Message Date
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
mk 6b3696417e Документация: CHANGELOG для обмена crm3-dev→crm3-26 (1.3.0.36–1.3.0.38).
Версия расширения не изменена.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 15:49:07 +03:00
mk 93ef9e904f VERSION: синхронизация с Configuration.xml (1.3.0.38).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 12:43:36 +03:00
mk e00eab1028 Обмен crm3-dev→crm3-26: фильтр узла для доработок получения (1.3.0.38).
Защита учёта номенклатуры, складов и серий применяется только к узлу «Рабочая CRM3».

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 12:16:16 +03:00
mk e6082bbcf9 Обмен crm3-dev→crm3-26: номенклатура, склады, серии, НДС22 (1.3.0.37).
Защита учётных реквизитов номенклатуры, пропуск обновления видов и складов,
нормализация серий, ПКПД НДС22/НДС22_122.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 10:49:22 +03:00
mk 15d8020064 Git: LF для выгрузок 1С (.gitattributes, .editorconfig, renormalize).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:04:10 +03:00
mk 3eb3c023e1 Синхронизация: защита учёта номенклатуры и складов при получении (1.3.0.36).
Сохраняем учётные реквизиты номенклатуры целевой ИБ при обновлении из crm3-dev;
существующие склады не перезаписываются данными из пакета обмена.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 16:35:35 +03:00
70 changed files with 1543 additions and 86 deletions
+19
View File
@@ -0,0 +1,19 @@
# Единые правила редактора для репозиториев выгрузки 1С.
# Согласовано с tools/git_1c/.gitattributes (LF в репозитории).
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{bsl,os}]
indent_style = tab
[*.xml]
indent_style = tab
[VERSION]
insert_final_newline = true
+13 -10
View File
@@ -1,31 +1,34 @@
# €¢â®®¯à¥¤¥«¥­¨¥ ¤«ï ⥪á⮢ëå ä ©«®¢
# Единые правила для репозиториев выгрузки 1С (Configurator / EDT).
# Канонический формат в git: UTF-8, LF. См. tools/git_1c/README.md
* text=auto
# ” ©«ë 1‘ - ¢á¥£¤  LF ¤«ï ᮢ¬¥á⨬®á⨠á Linux
# Текстовые файлы выгрузки 1С
*.bsl text eol=lf
*.os text eol=lf
*.xml text eol=lf
*.txt text eol=lf
*.md text eol=lf
*.json text eol=lf
*.xml text eol=lf
*.ini text eol=lf
*.conf text eol=lf
VERSION text eol=lf
# ¨­ à­ë¥ ä ©«ë 1‘ - ­¥ âண âì
# Бинарные артефакты 1С
*.cf binary
*.cfe binary
*.epf binary
*.erf binary
*.ef binary
*.bin binary
*.cf.binary binary
*.mxl binary
# ” ©«ë á¯à ¢ª¨ 1‘ - ¡¨­ à­ë¥
# Справка и графика
*.html binary
*.htm binary
# ƒà ä¨ç¥áª¨¥ ä ©«ë - ¡¨­ à­ë¥
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
# ” ©«ë ä®à¬ ¨ ¬ ª¥â®¢ 1‘
*.bin binary
+179
View File
@@ -0,0 +1,179 @@
# История изменений crm3-26.rhana
Формат версии: `1.3.0.NNN` (синхронизируется с `VERSION` и `Configuration.xml`).
---
## 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)
### Обмен — фильтр узла «Рабочая CRM3»
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
| Функция | Назначение |
|---------|------------|
| `РК_УзелCrm3Dev_GUID()` | GUID узла исходной ИБ в целевой (`97cd20ee-bb06-11f0-8dac-0cc47a7d055f`) |
| `РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена)` | Истина только для обмена crm3-dev ↔ crm3-26 |
**Поведение:** доработки получения (защита учёта номенклатуры, пропуск обновления видов и складов, нормализация серий) применяются **только** к узлу **«Рабочая CRM3»**. Обмен с **Бухгалтерией** не затрагивается.
---
## 1.3.0.37 (2026-07-06)
### Обмен crm3-dev → crm3-26 — приём данных
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
#### Номенклатура
| Обработчик | Изменение |
|------------|-----------|
| `&Перед` / `&После` `ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных` | для существующей номенклатуры — снимок и восстановление учётных реквизитов целевой ИБ; для новой — заполнение по виду целевой ИБ |
| `&После` `ОтложеннаяОбработка_ЗаполнитьНоменклатуру` | повторное восстановление учёта после типовой отложенной обработки |
Защищаемые реквизиты: `ВидНоменклатуры`, `ОсобенностьУчета`, `ТипНоменклатуры`, `ИспользованиеХарактеристик`, `ВладелецСерий`, `ВладелецХарактеристик`, `ГруппаФинансовогоУчета`, `СкладскаяГруппа`.
#### Виды номенклатуры и склады
| Обработчик | Изменение |
|------------|-----------|
| `&ИзменениеИКонтроль` `ПКО_Справочник_ВидыНоменклатуры_ПередЗаписьюПолученныхДанных` | существующие виды не обновляются (сопоставление по GUID сохраняется) |
| `&ИзменениеИКонтроль` `ПКО_Справочник_Склады_Получение_ПередЗаписьюПолученныхДанных` | существующие склады не перезаписываются |
#### Серии номенклатуры
| Обработчик | Изменение |
|------------|-----------|
| `&После` `ДобавитьПКО_Справочник_СерииНоменклатуры` | подключение `РК_ПКО_Справочник_СерииНоменклатуры_ПередЗаписьюПолученныхДанных` |
| `РК_ПКО_Справочник_СерииНоменклатуры_ПередЗаписьюПолученныхДанных` | нормализация владельца серии по настройкам вида в целевой ИБ; пропуск при конфликте |
#### Ставки НДС 22%
| Обработчик | Изменение |
|------------|-----------|
| `&После` `ЗаполнитьПравилаКонвертацииПредопределенныхДанных` | ПКПД `Перечисление_СтавкиНДС`: значения `НДС22`, `НДС22_122` |
**Контекст:** политика защиты учётных настроек целевой ИБ при синхронизации с crm3-dev. Подробнее: `docs/transfer/Анализ_синхронизации_crm3-dev_crm3-26.md` в монорепозитории crm3-26.
---
## 1.3.0.36 (2026-07-01)
### Синхронизация — первичная защита учёта при получении
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
- Сохранение учётных реквизитов номенклатуры целевой ИБ при обновлении из crm3-dev.
- Существующие склады не перезаписываются данными из пакета обмена.
*Доработка развита в 1.3.0.37 (виды, серии, отложенная обработка, НДС22) и ограничена узлом CRM3 в 1.3.0.38.*
---
## Связанные объекты расширения (обмен)
| Модуль | Роль |
|--------|------|
| `МенеджерОбменаЧерезУниверсальныйФормат` | защита учёта при получении, фильтр узла, ПКПД НДС22 |
+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.35
1.3.0.44
@@ -1,10 +1,13 @@
#Область СлужебныйПрограммныйИнтерфейс
#Область СлужебныйПрограммныйИнтерфейс
#Область ПКПД
// Заполняет таблицу правил конвертации предопределенных данных.
// &После ЗаполнитьПравилаКонвертацииПредопределенныхДанных.
// Дополняет правило ПКПД «Перечисление_СтавкиНДС» значениями НДС22 и НДС22_122
// для обмена crm3-dev → crm3-26 (EnterpriseData 1.8+).
//
// Параметры:
// НаправлениеОбмена - Строка - "Отправка" либо "Получение".
// ПравилаКонвертации - ТаблицаЗначений - таблица значений, в которую будут добавлены правила.
// ПравилаКонвертации - ТаблицаЗначений - таблица правил конвертации предопределённых данных.
//
&После("ЗаполнитьПравилаКонвертацииПредопределенныхДанных")
Процедура РК_ЗаполнитьПравилаКонвертацииПредопределенныхДанных(НаправлениеОбмена, ПравилаКонвертации)
ПоискПравилКонвертации = ПравилаКонвертации.НайтиСтроки(
@@ -36,3 +39,936 @@
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область Синхронизация_crm3_dev_crm3_26
// Ограничения обмена номенклатурой и видами номенклатуры (crm3-dev → crm3-26).
// Существующие элементы: не перезаписывать складской/финансовый учёт из источника.
// Новые элементы: применить настройки учёта вида номенклатуры целевой ИБ.
// См. docs/transfer/Анализ_синхронизации_crm3-dev_crm3-26.md, §3.2.
// Доработки применяются только к узлу «Рабочая CRM3» (исходная ИБ), не к Бухгалтерии.
// GUID узла плана обмена «Рабочая CRM3» в целевой ИБ (crm3).
//
// Возвращаемое значение:
// Строка - GUID узла корреспондента в нижнем регистре.
//
Функция РК_УзелCrm3Dev_GUID()
Возврат "97cd20ee-bb06-11f0-8dac-0cc47a7d055f";
КонецФункции
// Истина, если текущая сессия обмена — с исходной CRM (crm3_placentapharm), а не с Бухгалтерией.
//
// Параметры:
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
// Возвращаемое значение:
// Булево - Истина для обмена crm3-dev ↔ crm3-26.
//
Функция РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена)
Если КомпонентыОбмена = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Узел = Неопределено;
Если КомпонентыОбмена.Свойство("УзелКорреспондента") Тогда
Узел = КомпонентыОбмена.УзелКорреспондента;
ИначеЕсли КомпонентыОбмена.Свойство("УзелОбмена") Тогда
Узел = КомпонентыОбмена.УзелОбмена;
КонецЕсли;
Если Не ЗначениеЗаполнено(Узел) Тогда
Возврат Ложь;
КонецЕсли;
Возврат НРег(XMLСтрока(Узел.УникальныйИдентификатор())) = РК_УзелCrm3Dev_GUID();
КонецФункции
// Возвращает список реквизитов номенклатуры, подлежащих защите от перезаписи при обмене.
//
// Возвращаемое значение:
// Строка - имена реквизитов через запятую для конструктора Структура.
//
Функция РК_УчетныеРеквизитыНоменклатурыДляЗащиты()
Возврат "ВидНоменклатуры, ОсобенностьУчета, ТипНоменклатуры, ИспользованиеХарактеристик,"
+ "ВладелецСерий, ВладелецХарактеристик, ГруппаФинансовогоУчета, СкладскаяГруппа";
КонецФункции
// Создаёт в параметрах конвертации соответствие для хранения снимков учётных реквизитов номенклатуры.
//
// Параметры:
// КомпонентыОбмена - Структура - контекст текущей сессии обмена (ПараметрыКонвертации).
//
Процедура РК_ИнициализироватьСнимкиУчетаНоменклатуры(КомпонентыОбмена)
Если Не КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_СнимкиУчетаНоменклатуры") Тогда
КомпонентыОбмена.ПараметрыКонвертации.Вставить("РК_СнимкиУчетаНоменклатуры", Новый Соответствие);
КонецЕсли;
КонецПроцедуры
// Сохраняет снимок учётных реквизитов номенклатуры для последующего восстановления
// после типовой обработки и отложенного заполнения.
//
// Параметры:
// СсылкаНоменклатуры - СправочникСсылка.Номенклатура - элемент целевой ИБ.
// СнимокУчета - Структура - значения защищаемых реквизитов.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
Процедура РК_СохранитьСнимокУчетаНоменклатуры(СсылкаНоменклатуры, СнимокУчета, КомпонентыОбмена)
РК_ИнициализироватьСнимкиУчетаНоменклатуры(КомпонентыОбмена);
КомпонентыОбмена.ПараметрыКонвертации.РК_СнимкиУчетаНоменклатуры.Вставить(СсылкаНоменклатуры, СнимокУчета);
КонецПроцедуры
// &Перед ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных.
// Для существующей в целевой ИБ номенклатуры сохраняет снимок учётных реквизитов
// до выполнения типового обработчика получения.
//
// Параметры:
// ПолученныеДанные - СправочникОбъект.Номенклатура - данные из пакета обмена.
// ДанныеИБ - СправочникОбъект.Номенклатура - существующий объект целевой ИБ; Неопределено для нового.
// КонвертацияСвойств - ТаблицаЗначений - правила конвертации свойств ПКО.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
&Перед("ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных")
Процедура РК_ПКО_Справочник_Номенклатура_Получение_ПередЗаписью_СохранитьУчет(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ДанныеИБ = Неопределено Тогда
Возврат;
КонецЕсли;
СнимокУчета = Новый Структура(РК_УчетныеРеквизитыНоменклатурыДляЗащиты());
ЗаполнитьЗначенияСвойств(СнимокУчета, ДанныеИБ);
ПолученныеДанные.ДополнительныеСвойства.Вставить("РК_СнимокУчетаНоменклатуры", СнимокУчета);
РК_СохранитьСнимокУчетаНоменклатуры(ДанныеИБ.Ссылка, СнимокУчета, КомпонентыОбмена);
КонецПроцедуры
// &После ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных.
// Для существующей номенклатуры восстанавливает учётные реквизиты целевой ИБ из снимка.
// Для новой номенклатуры заполняет складской и финансовый учёт по виду номенклатуры целевой ИБ.
//
// Параметры:
// ПолученныеДанные - СправочникОбъект.Номенклатура - данные из пакета обмена.
// ДанныеИБ - СправочникОбъект.Номенклатура - существующий объект целевой ИБ; Неопределено для нового.
// КонвертацияСвойств - ТаблицаЗначений - правила конвертации свойств ПКО.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
&После("ПКО_Справочник_Номенклатура_Получение_ПередЗаписьюПолученныхДанных")
Процедура РК_ПКО_Справочник_Номенклатура_Получение_ПередЗаписью_УчетПослеБазы(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ДанныеИБ = Неопределено Тогда
// Новая номенклатура: настройки складского и финансового учёта — из вида целевой ИБ.
Если ЗначениеЗаполнено(ПолученныеДанные.ВидНоменклатуры) Тогда
Справочники.Номенклатура.ЗаполнитьРеквизитыПоВидуНоменклатуры(ПолученныеДанные);
КонецЕсли;
Возврат;
КонецЕсли;
Если Не ПолученныеДанные.ДополнительныеСвойства.Свойство("РК_СнимокУчетаНоменклатуры") Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные.ДополнительныеСвойства.РК_СнимокУчетаНоменклатуры);
КонецПроцедуры
// &ИзменениеИКонтроль ПКО_Справочник_ВидыНоменклатуры_ПередЗаписьюПолученныхДанных.
// Пропускает обновление видов номенклатуры, уже существующих в целевой ИБ
// (сопоставление по GUID сохраняется, учётные настройки целевой ИБ не меняются).
//
// Параметры:
// ПолученныеДанные - СправочникОбъект.ВидыНоменклатуры - данные из пакета обмена.
// ДанныеИБ - СправочникОбъект.ВидыНоменклатуры - существующий объект целевой ИБ; Неопределено для нового.
// КонвертацияСвойств - ТаблицаЗначений - правила конвертации свойств ПКО.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
&ИзменениеИКонтроль("ПКО_Справочник_ВидыНоменклатуры_ПередЗаписьюПолученныхДанных")
Процедура РК_ПКО_Справочник_ВидыНоменклатуры_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
#Вставка
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ДанныеИБ <> Неопределено Тогда
ПолученныеДанные = Неопределено;
Возврат;
КонецЕсли;
#КонецВставки
ДанныеДляЗаписиВИБ = ?(ДанныеИБ = Неопределено, ПолученныеДанные, ДанныеИБ);
Если НЕ ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.ВариантОформленияПродажи) Тогда
ДанныеДляЗаписиВИБ.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.ИспользованиеХарактеристик) Тогда
ДанныеДляЗаписиВИБ.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоНоменклатуре) Тогда
ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоНоменклатуре = Перечисления.ВариантОтбораДляКлючаЦен.Использовать;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоХарактеристике) Тогда
ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоХарактеристике = Перечисления.ВариантОтбораДляКлючаЦен.НеИспользовать;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоСерии) Тогда
ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоСерии = Перечисления.ВариантОтбораДляКлючаЦен.НеИспользовать;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоУпаковке) Тогда
ДанныеДляЗаписиВИБ.НастройкиКлючаЦенПоУпаковке = Перечисления.ВариантОтбораДляКлючаЦен.НеИспользовать;
КонецЕсли;
Если Не ПолученныеДанные.ИспользоватьСерии = Истина Тогда
ПолученныеДанные.ИспользоватьСерии = ДанныеДляЗаписиВИБ.ИспользоватьСерии;
КонецЕсли;
КонецПроцедуры
// &ИзменениеИКонтроль ПКО_Справочник_Склады_Получение_ПередЗаписьюПолученныхДанных.
// Пропускает обновление складов, уже существующих в целевой ИБ
// (сопоставление по GUID сохраняется, реквизиты целевого склада не меняются).
//
// Параметры:
// ПолученныеДанные - СправочникОбъект.Склады - данные из пакета обмена.
// ДанныеИБ - СправочникОбъект.Склады - существующий объект целевой ИБ; Неопределено для нового.
// КонвертацияСвойств - ТаблицаЗначений - правила конвертации свойств ПКО.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
&ИзменениеИКонтроль("ПКО_Справочник_Склады_Получение_ПередЗаписьюПолученныхДанных")
Процедура РК_ПКО_Справочник_Склады_Получение_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
#Вставка
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ДанныеИБ <> Неопределено Тогда
ПолученныеДанные = Неопределено;
Возврат;
КонецЕсли;
#КонецВставки
ЗагрузитьДополнительныеСведения(?(ДанныеИБ = Неопределено, ПолученныеДанные.ПолучитьСсылкуНового(), ДанныеИБ.Ссылка),
ПолученныеДанные.ДополнительныеСвойства, КомпонентыОбмена);
КонецПроцедуры
// &После ОтложеннаяОбработка_ЗаполнитьНоменклатуру.
// Восстанавливает учётные реквизиты номенклатуры из снимков после типовой отложенной обработки,
// которая перезаписывает ИспользованиеХарактеристик значением из вида номенклатуры.
//
// Параметры:
// КомпонентыОбмена - Структура - контекст текущей сессии обмена (ПараметрыКонвертации.РК_СнимкиУчетаНоменклатуры).
//
&После("ОтложеннаяОбработка_ЗаполнитьНоменклатуру")
Процедура РК_ОтложеннаяОбработка_ВосстановитьУчетНоменклатуры(КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если Не КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_СнимкиУчетаНоменклатуры") Тогда
Возврат;
КонецЕсли;
Снимки = КомпонентыОбмена.ПараметрыКонвертации.РК_СнимкиУчетаНоменклатуры;
Если Снимки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого КлючИЗначение Из Снимки Цикл
НоменклатураСсылка = КлючИЗначение.Ключ;
СнимокУчета = КлючИЗначение.Значение;
Если Не ОбщегоНазначения.СсылкаСуществует(НоменклатураСсылка) Тогда
Продолжить;
КонецЕсли;
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
ЗаполнитьЗначенияСвойств(НоменклатураОбъект, СнимокУчета);
НоменклатураОбъект.ОбменДанными.Загрузка = Истина;
Попытка
НоменклатураОбъект.Записать();
Исключение
ЗаписатьОшибкуВЖурналРегистрации(НоменклатураСсылка,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), КомпонентыОбмена);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Возвращает владельца серий для вида номенклатуры в целевой ИБ
// (с учётом НастройкиСерийБерутсяИзДругогоВидаНоменклатуры).
//
// Параметры:
// ВидНоменклатуры - СправочникСсылка.ВидыНоменклатуры - вид из пакета обмена или номенклатуры.
//
// Возвращаемое значение:
// СправочникСсылка.ВидыНоменклатуры - вид-владелец для справочника СерииНоменклатуры.
//
Функция РК_ВладелецСерийДляВидаНоменклатуры(ВидНоменклатуры)
Если Не ЗначениеЗаполнено(ВидНоменклатуры) Тогда
Возврат Справочники.ВидыНоменклатуры.ПустаяСсылка();
КонецЕсли;
НастройкиСерий = Справочники.ВидыНоменклатуры.НастройкиИспользованияСерий(ВидНоменклатуры);
ВладелецСерий = НастройкиСерий.ВладелецСерий;
Если Не ЗначениеЗаполнено(ВладелецСерий) Тогда
ВладелецСерий = ВидНоменклатуры;
КонецЕсли;
Возврат ВладелецСерий;
КонецФункции
// Подбор существующей серии в целевой ИБ по владельцу вида номенклатуры.
// Приоритет:
// 1) Вид + Номер + СрокГодности (если номер и срок заполнены)
// 2) Вид + Номер (если номер заполнен)
// 3) Вид + СрокГодности (если номер пустой и срок заполнен)
//
// Параметры:
// ВладелецСерий - СправочникСсылка.ВидыНоменклатуры
// НомерСерии - Строка
// СрокГодности - Дата, Неопределено
//
// Возвращаемое значение:
// СправочникСсылка.СерииНоменклатуры, Неопределено
//
Функция РК_НайтиСериюПоВладельцуНомерСроку(ВладелецСерий, НомерСерии, СрокГодности)
Если Не ЗначениеЗаполнено(ВладелецСерий) Тогда
Возврат Неопределено;
КонецЕсли;
НомерСерии = СокрЛП(Строка(НомерСерии));
СрокЗаполнен = ЗначениеЗаполнено(СрокГодности) И СрокГодности <> '00010101';
Если Не ПустаяСтрока(НомерСерии) Тогда
Запрос = Новый Запрос;
Если СрокЗаполнен Тогда
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Срок", СрокГодности);
Иначе
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.Номер = &Номер";
КонецЕсли;
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Номер", НомерСерии);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Если СрокЗаполнен Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Серии.Ссылка КАК Ссылка
|ИЗ
| Справочник.СерииНоменклатуры КАК Серии
|ГДЕ
| Серии.ВидНоменклатуры = &Владелец
| И НЕ Серии.ПометкаУдаления
| И Серии.ГоденДо = &Срок";
Запрос.УстановитьПараметр("Владелец", ВладелецСерий);
Запрос.УстановитьПараметр("Срок", СрокГодности);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
// &После ДобавитьПКО_Справочник_СерииНоменклатуры.
// Подключает обработчик проверки владельца серии при получении из пакета обмена.
//
// Параметры:
// ПравилаКонвертации - ТаблицаЗначений - таблица правил конвертации объектов.
//
&После("ДобавитьПКО_Справочник_СерииНоменклатуры")
Процедура РК_ДобавитьПКО_Справочник_СерииНоменклатуры_УстановитьПередЗаписью(ПравилаКонвертации)
СтрокиПКО = ПравилаКонвертации.НайтиСтроки(Новый Структура("ИмяПКО", "Справочник_СерииНоменклатуры"));
Если СтрокиПКО.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СтрокиПКО[0].ПередЗаписьюПолученныхДанных = "РК_ПКО_Справочник_СерииНоменклатуры_ПередЗаписьюПолученныхДанных";
КонецПроцедуры
// ПКО Справочник_СерииНоменклатуры — ПередЗаписьюПолученныхДанных.
// Проверяет и нормализует привязку серии к виду-владельцу в целевой ИБ.
// При несовпадении владельца у сопоставленной по полям поиска серии — пропуск записи.
//
// Параметры:
// ПолученныеДанные - СправочникОбъект.СерииНоменклатуры - данные из пакета обмена.
// ДанныеИБ - СправочникОбъект.СерииНоменклатуры - существующий объект; Неопределено для нового.
// КонвертацияСвойств - ТаблицаЗначений - правила конвертации свойств ПКО.
// КомпонентыОбмена - Структура - контекст текущей сессии обмена.
//
Процедура РК_ПКО_Справочник_СерииНоменклатуры_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
Если ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ПолученныеДанные.ВидНоменклатуры) Тогда
Возврат;
КонецЕсли;
КорректныйВладелец = РК_ВладелецСерийДляВидаНоменклатуры(ПолученныеДанные.ВидНоменклатуры);
Если Не ЗначениеЗаполнено(КорректныйВладелец) Тогда
Возврат;
КонецЕсли;
СсылкаДляЖурнала = ?(ДанныеИБ = Неопределено, ПолученныеДанные.ПолучитьСсылкуНового(), ДанныеИБ.Ссылка);
НомерСерии = СокрЛП(Строка(ПолученныеДанные.Номер));
СрокГодности = ПолученныеДанные.ГоденДо;
Если ДанныеИБ <> Неопределено Тогда
Если ЗначениеЗаполнено(ДанныеИБ.ВидНоменклатуры)
И ДанныеИБ.ВидНоменклатуры <> КорректныйВладелец
И ПолученныеДанные.ВидНоменклатуры <> ДанныеИБ.ВидНоменклатуры Тогда
ТекстОшибки = СтрШаблон(
"Неверная привязка серии по владельцу: в ИБ %1, из пакета (норм.) %2, наименование ""%3"", номер ""%4"".",
ДанныеИБ.ВидНоменклатуры,
КорректныйВладелец,
ПолученныеДанные.Наименование,
ПолученныеДанные.Номер);
ЗаписатьОшибкуВЖурналРегистрации(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена,
НСтр("ru = 'записать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение);
ПолученныеДанные = Неопределено;
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеИБ.ВидНоменклатуры) Тогда
ПолученныеДанные.ВидНоменклатуры = ДанныеИБ.ВидНоменклатуры;
Иначе
ПолученныеДанные.ВидНоменклатуры = КорректныйВладелец;
КонецЕсли;
Иначе
ПолученныеДанные.ВидНоменклатуры = КорректныйВладелец;
СуществующаяСерия = РК_НайтиСериюПоВладельцуНомерСроку(КорректныйВладелец, НомерСерии, СрокГодности);
Если ЗначениеЗаполнено(СуществующаяСерия)
И СуществующаяСерия <> СсылкаДляЖурнала Тогда
ТекстОшибки = СтрШаблон(
"Серия уже существует у владельца %1 (%2), GUID отличается от пакета. Номер=""%3"", годен до=""%4"".",
КорректныйВладелец,
СуществующаяСерия,
НомерСерии,
?(ЗначениеЗаполнено(СрокГодности), Формат(СрокГодности, "ДФ=yyyy-MM-dd"), ""));
ЗаписатьОшибкуВЖурналРегистрации(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена,
НСтр("ru = 'создать серию номенклатуры'"), УровеньЖурналаРегистрации.Предупреждение);
ПолученныеДанные = Неопределено;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// --- Объекты расчётов (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: ED 1.8 не передаёт ВидЦены / ВидЦеныПоставщика в строках ТЧ (XDTO не меняем).
// После типовой отложенной обработки дозаполняем вид цены из соглашения
// без пересчёта Цена/Сумма (ПоляЗаполнения только вид цены).
//
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура РК_ВыполнитьПроцедуруМодуляМенеджера_ДозаполнитьВидЦены(ИмяПроцедуры, Параметры)
Если Не СтрНачинаетсяС(ИмяПроцедуры, "ОтложеннаяОбработка_") Тогда
Возврат;
КонецЕсли;
Если Параметры = Неопределено Тогда
Возврат;
КонецЕсли;
Объект = Неопределено;
Если Не Параметры.Свойство("Объект", Объект) Или Объект = Неопределено Тогда
Возврат;
КонецЕсли;
КомпонентыОбмена = Неопределено;
Параметры.Свойство("КомпонентыОбмена", КомпонентыОбмена);
Если Не РК_ЭтоОбменС_Crm3Dev(КомпонентыОбмена) Тогда
Возврат;
КонецЕсли;
РК_ДозаполнитьВидЦеныВДокументе(Объект);
КонецПроцедуры
// Обходит все ТЧ документа; для реквизитов ВидЦены и ВидЦеныПоставщика вызывает дозаполнение.
//
// Параметры:
// Объект - ДокументОбъект - загружаемый документ после отложенной обработки обмена.
//
Процедура РК_ДозаполнитьВидЦеныВДокументе(Объект) Экспорт
Если Объект = Неопределено Тогда
Возврат;
КонецЕсли;
МетаОбъекта = Объект.Метаданные();
Для Каждого МетаТЧ Из МетаОбъекта.ТабличныеЧасти Цикл
Если МетаТЧ.Реквизиты.Найти("ВидЦены") <> Неопределено Тогда
РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, МетаТЧ.Имя, "ВидЦены");
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦеныПоставщика") <> Неопределено Тогда
РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, МетаТЧ.Имя, "ВидЦеныПоставщика");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Дозаполняет пустой вид цены в одной табличной части, если есть строки без значения.
//
Процедура РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, ИмяТЧ, ИмяПоляВидЦены)
ТабличнаяЧасть = Объект[ИмяТЧ];
Если ТабличнаяЧасть.Количество() = 0 Тогда
Возврат;
КонецЕсли;
НужноЗаполнить = Ложь;
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ[ИмяПоляВидЦены]) Тогда
НужноЗаполнить = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не НужноЗаполнить Тогда
Возврат;
КонецЕсли;
Если ИмяПоляВидЦены = "ВидЦены" Тогда
РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть);
ИначеЕсли ИмяПоляВидЦены = "ВидЦеныПоставщика" Тогда
РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть);
КонецЕсли;
КонецПроцедуры
Процедура РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
Возврат;
КонецЕсли;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦены");
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Истина);
Попытка
ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(
ТабличнаяЧасть,, ПараметрыЗаполнения, Новый Структура);
Исключение
// Не блокируем загрузку пакета из-за вида цены.
КонецПопытки;
КонецПроцедуры
Процедура РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
Возврат;
КонецЕсли;
ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦеныПоставщика");
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Ложь);
Попытка
ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
ТабличнаяЧасть, Неопределено, ПараметрыЗаполнения, Новый Структура);
Исключение
// Не блокируем загрузку пакета из-за вида цены.
КонецПопытки;
КонецПроцедуры
// Общие параметры для ЦеныПредприятияЗаполнениеСервер / ЦеныПартнеровЗаполнениеСервер.
//
Процедура РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, ЭтоПродажа)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Дата") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Организация") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Организация", Объект.Организация);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Валюта") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Соглашение") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("НалогообложениеНДС") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
КонецЕсли;
Если ЭтоПродажа Тогда
Если МетаОбъекта.Реквизиты.Найти("ВернутьМногооборотнуюТару") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("ВозвращатьМногооборотнуюТару", Объект.ВернутьМногооборотнуюТару);
КонецЕсли;
ПараметрыЗаполнения.Вставить("РассчитыватьНаборы", Истина);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
@@ -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 = 'Не указан ИНН'"),
КлючДанных,
"ИНН",
,
Отказ);
КонецЕсли;
КонецЕсли;
КонецЕсли;
//-- Локализация
КонецПроцедуры
+5 -3
View File
@@ -7,8 +7,10 @@
<Metadata name="ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения" id="e8b79bd5-f8ca-47e3-bcfd-1d84a4a64ee2" configVersion="3cadb32ee44e159e252e947f116f05b8f99ae1c4"/>
<Metadata name="CommonForm.РК_ФормаНастроекРана" id="5688e1b9-1552-45cc-b539-1f4cc3765e8a" configVersion="8ac3163937f01f9604c7a57e9dc814b6d466b5ac"/>
<Metadata name="CommonForm.РК_ФормаНастроекРана.Form" id="5688e1b9-1552-45cc-b539-1f4cc3765e8a.0" configVersion="ea9a4ab0f585a6af14dc4941cc5fd2e48f221b6a"/>
<Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат" id="46adff34-2644-4eb3-99a7-e969dbdf8496" configVersion="07b90dd15d056182292ae6260cadd6aec5c3567b"/>
<Metadata name="CommonModule.МенеджерОбменаЧерезУниверсальныйФормат.Module" id="46adff34-2644-4eb3-99a7-e969dbdf8496.0" configVersion="edb6107ec1cdb48f26f4b589d8f53646b44e7351"/>
<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.ПартнерыИКонтрагентыЛокализация" 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.ОбщегоНазначенияКлиентСервер.Module" id="1afe1653-696f-47e3-9bea-df7b84bd077c.0" configVersion="74e1779aaae2e2e61a3957d284da0d61b1e34d41"/>
<Metadata name="CommonModule.РК_ОбщегоНазначения" id="6bfc7b15-6995-43ad-96c6-a97569f2d5a4" configVersion="c11a335f853a42165758cfe7995f2ee06a9010f7"/>
@@ -26,7 +28,7 @@
<Metadata name="CommonPicture.ПодписанЗашифрованСостояния" id="a0bd1007-a115-4d79-8160-d4f59cd57ffb" configVersion="08ed86b1653fc955004b703d7dce5d947956fdda"/>
<Metadata name="CommonPicture.СерииНоменклатурыКолонкаСтатусов" id="f2badc5e-4af7-4c05-be31-b4d5b7642ab5" configVersion="d070fbc999630568abec9d83770ed805666a24d9"/>
<Metadata name="CommonPicture.СтатусыУказанияСерий" id="cc5cab6d-e293-4890-a422-6e8cd2fb58bb" configVersion="17b11a4c6ec74254745177f7c136d38af0214bdf"/>
<Metadata name="Configuration.crm326RHANA" id="ef31d55b-3788-4972-affb-b7aefd3838aa" configVersion="1f13c87c612c4f51bf2f028c914b958f76b6121c"/>
<Metadata name="Configuration.crm326RHANA" id="ef31d55b-3788-4972-affb-b7aefd3838aa" configVersion="2910b5ccbb9d930f0716a494a2b44068db7db4d4"/>
<Metadata name="Configuration.crm326RHANA.CommandInterface" id="39a8728d-cfaf-46d0-959f-980e396b5018.a" configVersion="fdaec039eea90396e8275a4185f01ff2ce9f09af"/>
<Metadata name="Configuration.crm326RHANA.MainSectionCommandInterface" id="39a8728d-cfaf-46d0-959f-980e396b5018.9" configVersion="fdaec039eea90396e8275a4185f01ff2ce9f09af"/>
<Metadata name="Constant.РК_РежимОтладкиРана" id="32d682cc-7aeb-45c8-abc6-68fef7f36011" configVersion="a12fe879a2594e605228c43059bb3a72d30fa471"/>
+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">
<Configuration uuid="ef31d55b-3788-4972-affb-b7aefd3838aa">
<InternalInfo>
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles>
<Vendor/>
<Version>1.3.0.35</Version>
<Version>1.3.0.44</Version>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/>
@@ -97,6 +97,7 @@
<CommonModule>РК_ОбщегоНазначенияВызовСервера</CommonModule>
<CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule>
<CommonModule>МенеджерОбменаЧерезУниверсальныйФормат</CommonModule>
<CommonModule>ПартнерыИКонтрагентыЛокализация</CommonModule>
<XDTOPackage>EnterpriseData_1_8_7</XDTOPackage>
<XDTOPackage>EnterpriseData_1_8_6</XDTOPackage>
<FunctionalOption>РК_ФункциональнаяОпцияРежимаОтладки</FunctionalOption>