Как в 1С передать «КредитныйЛимит» без изменения конфигурации?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в 1С передать «КредитныйЛимит» без изменения конфигурации?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38826
      Фото аватараOdineski
      Участник

        доработать правила обмена Справочника Контрагенты через универсальный формат обмена между двумя базами 1С. В справочник Контрагенты добавлен реквизит КредитныйЛимит (тип число).Доработать обмен чтобы КредитныйЛимит передавался при обмене, использовать расширение формата обмена. обмен доработать без использования конфигурации КД3.1. доработку выполнить в расширении конфигурации. основную конфигурацию изменять запрещено

      • #38827
        bot_avaOdin — Одинэсник
        Участник

          Да, такую доработку можно выполнить без изменения основной конфигурации и без использования КД3.1.

          Для этого в обеих базах нужно создать расширение конфигурации, в котором:

          1. Добавить реквизит КредитныйЛимит в справочник Контрагенты.
          2. Расширить правила формирования EnterpriseData.
          3. При выгрузке помещать значение в дополнительную область универсального формата.
          4. При загрузке извлекать значение и записывать его в реквизит контрагента.
          5. Подключить одинаковую версию расширения формата в обеих базах.

          Для одного дополнительного реквизита не требуется изменять стандартную XDTO-схему EnterpriseData. Оптимальный вариант, предусмотренный архитектурой универсального формата, это передавать значение через AdditionalInfo, то есть через дополнительные сведения объекта. Это и есть расширение передаваемых данных без изменения основной конфигурации и стандартного формата.

          ## 1. Что должно быть в обеих базах

          В источнике и приемнике должны быть одинаково созданы:

          — реквизит справочника Контрагенты.КредитныйЛимит;
          — тип реквизита, например:
          — число, длина 15;
          — точность 2;
          — неотрицательное значение;
          — расширение конфигурации с одинаковым идентификатором расширения;
          — обработчики обмена;
          — ключ дополнительного свойства, например КредитныйЛимит.

          Если реквизит уже добавлен в обе основные конфигурации, повторно добавлять его в расширение не нужно. В расширении потребуется только доработка обмена.

          ## 2. Почему не нужно менять стандартную схему EnterpriseData

          Стандартный формат EnterpriseData не следует изменять напрямую.

          Если добавить новый элемент непосредственно в типовой XDTO-пакет EnterpriseData, то возникнут проблемы:

          — конфигурация будет снята с поддержки;
          — при обновлении типовой конфигурации изменения могут быть потеряны;
          — другая база может не распознать измененную схему;
          — потребуется синхронно обновлять структуру формата в обеих базах;
          — стандартный менеджер обмена может игнорировать новый узел.

          Для пользовательских реквизитов в EnterpriseData обычно используется дополнительная информация объекта. В ней можно передать реквизит, которого нет в типовом формате.

          В XML обмена логика будет примерно следующая:

          Конкретное XML-представление зависит от версии EnterpriseData и реализации менеджера обмена в конкретной конфигурации. Вручную изменять XML-файл обмена не нужно.

          ## 3. Структура расширения

          В расширении рекомендуется создать общий модуль, например:

          Настройки общего модуля:

          — Сервер: Да;
          — Вызов сервера: Да;
          — Клиент: при необходимости;
          — Глобальный: обычно Нет;
          — Экспорт: только для процедур, которые вызываются механизмом обмена.

          Также в расширении нужно расширить общий модуль, который отвечает за обмен через универсальный формат. Его имя зависит от конфигурации и версии формата. В типовых конфигурациях это может быть общий модуль с наименованием, содержащим:

          или модуль, имя которого определяется процедурой:

          Сначала в конфигураторе нужно найти общий модуль, соответствующий используемой версии EnterpriseData.

          ## 4. Вариант передачи через AdditionalInfo

          Нужно использовать отдельное имя свойства, например:

          Лучше добавить префикс организации, чтобы не пересечься с будущими типовыми свойствами:

          Например:

          Значение необходимо передавать в числовом виде, а не в локализованной строке. Нельзя формировать значение так:

          В зависимости от региональных настроек это может дать:

          или:

          При разборе в другой базе такая строка может быть обработана неправильно.

          Лучше использовать тип значения, поддерживаемый механизмом дополнительных свойств EnterpriseData, либо выполнять преобразование в число с учетом формата, принятого в конкретной версии менеджера обмена.

          ## 5. Обработка выгрузки

          При формировании объекта Контрагент нужно добавить в его дополнительные сведения значение реквизита КредитныйЛимит.

          Логика должна быть следующей:

          Процедура ДобавитьДополнительноеСвойство в приведенном примере является условной. В реальном расширении ее нужно заменить на процедуру, структуру или метод, используемый конкретным менеджером универсального формата.

          В некоторых конфигурациях дополнительные свойства представлены не структурой, а массивом или таблицей значений. Тогда логика будет выглядеть так:

          Либо:

          Точный вариант зависит от того, как в данной конфигурации реализована работа с AdditionalInfo.

          ## 6. Обработка загрузки

          При загрузке данных из EnterpriseData нужно:

          1. определить, что загружается объект Контрагент;
          2. найти дополнительное свойство MyCompany.КредитныйЛимит;
          3. проверить его тип и значение;
          4. записать значение в ОбъектПриемник.КредитныйЛимит.

          Общая логика:

          Также необходимо ограничить значение точностью реквизита:

          Если по бизнес-логике 0 означает отсутствие кредитного лимита, можно записывать ноль. Если нужно различать «лимит не задан» и «лимит равен нулю», реквизит должен допускать такую логику отдельно, поскольку числовой реквизит сам по себе не хранит Неопределено как обычное значение базы.

          ## 7. Где размещать обработчики в расширении

          Есть два варианта.

          ### Вариант 1. Расширение общего модуля

          Если используемая конфигурация позволяет расширять процедуры менеджера обмена, в расширении создается расширение общего модуля типового менеджера обмена.

          В нем подключаются обработчики к процедурам типового модуля через аннотации расширения:

          Для загрузки:

          Названия ИмяТиповойПроцедуры и ИмяТиповойПроцедурыЗагрузки здесь условные. Их нельзя переносить в конфигурацию буквально. Нужно открыть общий модуль конкретной конфигурации и выбрать фактические процедуры, вызываемые:

          — перед формированием объекта EnterpriseData;
          — после формирования объекта EnterpriseData;
          — перед записью объекта в информационную базу;
          — после разбора входящего объекта.

          ### Вариант 2. Собственный менеджер обмена в расширении

          Если типовой менеджер обмена не имеет подходящих точек расширения, в расширении можно создать собственный внешний менеджер обмена.

          Типовая конфигурация БП и другие конфигурации на БСП обычно позволяют указать менеджер обмена через универсальный формат во внешней обработке. Тогда:

          1. В расширении создается общий модуль с логикой обмена.
          2. Его код помещается во внешнюю обработку.
          3. В настройке синхронизации в поле менеджера обмена указывается эта обработка.
          4. Основная конфигурация при этом не изменяется.

          В некоторых конфигурациях вкладка с путем к менеджеру обмена скрыта. Ее можно включить через:

          После этого указывается путь к внешнему менеджеру обмена.

          Однако этот вариант нужно применять только в том случае, если расширение типового общего модуля не позволяет перехватить нужные этапы обмена.

          ## 8. Как определить реальные точки расширения

          В конфигураторе нужно выполнить следующие действия.

          ### В источнике

          Найти общий модуль менеджера универсального формата и определить процедуру, которая формирует объект Контрагент.

          Нужно искать код, где встречаются:

          ### В приемнике

          Найти процедуру, которая получает объект формата и создает или изменяет объект:

          Именно в этот момент следует заполнить:

          Нельзя просто добавить реквизит в структуру соответствия. Если типовой менеджер не знает этот реквизит, он его проигнорирует. Значение должно быть явно включено в формируемые дополнительные данные и явно обработано при загрузке.

          ## 9. Если требуется именно отдельная XDTO-структура

          Если под «расширением формата» требуется не AdditionalInfo, а отдельный XML-элемент с собственной XDTO-схемой, тогда используется другой вариант.

          В расширении создается собственный XDTO-пакет, например:

          Для него задается уникальное пространство имен:

          В пакете описывается тип:

          с элементом:

          Тип элемента:

          После этого в расширении необходимо:

          1. Добавить XDTO-пакет.
          2. Определить тип CounterpartyExtension.
          3. Добавить CreditLimit с числовым типом.
          4. В обработчике выгрузки создавать объект XDTO этого типа.
          5. Добавлять его в расширенную часть данных контрагента.
          6. В обработчике загрузки получать этот объект.
          7. Преобразовывать CreditLimit в число.
          8. Записывать значение в Контрагенты.КредитныйЛимит.

          Но такой вариант зависит от конкретной версии EnterpriseData и от того, предоставляет ли текущая конфигурация расширяемую точку для добавления пользовательского XDTO-объекта. Одного добавления XDTO-пакета в расширение недостаточно. Типовой менеджер обмена не начнет автоматически его выгружать и загружать.

          Поэтому для одного реквизита КредитныйЛимит правильнее использовать AdditionalInfo. Если же необходимо, чтобы сторонние системы видели отдельный XML-элемент, тогда потребуется полноценное расширение схемы и ручное расширение менеджера обмена.

          ## 10. Регистрация изменений

          Чтобы изменение КредитныйЛимит инициировало обмен, недостаточно только передавать реквизит при выгрузке.

          Нужно проверить план обмена:

          или другой план, используемый конкретной конфигурацией.

          В состав плана обмена уже должен входить справочник:

          Если изменение реквизита не регистрируется, возможна ситуация:

          — контрагент был изменен только по КредитныйЛимит;
          — объект не попал в очередь изменений;
          — обмен не выгрузил контрагента;
          — в приемнике старое значение.

          Для типовых планов обмена обычно достаточно того, что объект Контрагенты включен в состав плана. Если в конфигурации используется выборочная регистрация реквизитов, нужно добавить КредитныйЛимит в логику регистрации изменений.

          Проверить это можно следующим образом:

          1. Изменить КредитныйЛимит у контрагента.
          2. Записать элемент.
          3. Открыть записи регистрации изменений.
          4. Убедиться, что контрагент зарегистрирован для нужного узла обмена.
          5. Выполнить выгрузку.
          6. Проверить, что объект попал в пакет обмена.

          Если контрагент не зарегистрирован, нужно расширять правила регистрации изменений в расширении.

          ## 11. Обработка при повторной загрузке

          При загрузке следует учитывать несколько случаев:

          — свойство отсутствует в старом файле обмена;
          — свойство передано пустым;
          — передан ноль;
          — передано отрицательное значение;
          — значение имеет больше знаков после запятой;
          — значение невозможно преобразовать в число.

          Безопасный вариант:

          Если свойство отсутствует, старое значение лучше не затирать:

          Это важно для совместимости со старыми пакетами обмена, которые были сформированы до установки расширения.

          ## 12. Что необходимо сделать в каждой базе

          ### В базе-источнике

          1. Установить расширение.
          2. Проверить наличие реквизита КредитныйЛимит.
          3. Подключить обработчик выгрузки.
          4. Добавить КредитныйЛимит в AdditionalInfo.
          5. Проверить регистрацию изменения контрагента.
          6. Выполнить тестовую выгрузку.
          7. Проверить наличие дополнительного свойства в пакете обмена.

          ### В базе-приемнике

          1. Установить такое же расширение.
          2. Проверить наличие реквизита КредитныйЛимит.
          3. Подключить обработчик загрузки.
          4. Найти в AdditionalInfo свойство MyCompany.КредитныйЛимит.
          5. Преобразовать значение в число.
          6. Записать его в объект Контрагенты.
          7. Выполнить загрузку.
          8. Проверить значение реквизита в карточке контрагента.

          ## 13. Тестовый сценарий

          Проверять лучше на отдельном контрагенте.

          ### Тест 1. Положительное значение

          В базе-источнике установить:

          После обмена в приемнике должно быть:

          ### Тест 2. Нулевое значение

          В источнике установить:

          После обмена в приемнике должен быть именно ноль.

          ### Тест 3. Изменение только лимита

          Изменить только КредитныйЛимит, не меняя наименование и ИНН.

          Проверить, что:

          — контрагент зарегистрирован к обмену;
          — сформирован пакет;
          — значение передано;
          — в приемнике лимит изменился.

          ### Тест 4. Старый пакет без свойства

          Загрузить пакет, сформированный до доработки.

          В этом случае:

          — ошибка возникать не должна;
          — существующее значение в приемнике желательно не изменять.

          ### Тест 5. Две стороны

          Если обмен двусторонний, необходимо отдельно проверить:

          — источник изменил лимит и передал приемнику;
          — приемник изменил лимит и передал источнику;
          — нет циклического затирания значения;
          — при конфликте изменений используется предусмотренное типовое правило разрешения конфликтов.

          ## 14. Важное ограничение

          Расширение должно быть установлено в обеих базах. Если расширение будет только в базе-источнике, значение попадет в пакет, но база-приемник может его проигнорировать. Если расширение будет только в приемнике, оно сможет загрузить значение только в том случае, если источник уже его передает.

          Для надежной работы должны совпадать:

          — имя дополнительного свойства;
          — формат значения;
          — правила обработки пустых значений;
          — версия расширения;
          — логика выгрузки и загрузки.

          Практически для задачи с одним реквизитом решение следует строить так:

          При этом основная конфигурация не изменяется, КД3.1 не используется, а вся логика располагается в расширении конфигурации и подключается к менеджеру обмена через точки расширения.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С