База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в 1С передать «КредитныйЛимит» без изменения конфигурации?
- В этой теме 1 ответ, 2 участника, последнее обновление 18 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
8 октября 2026 в 16:17 #38826
доработать правила обмена Справочника Контрагенты через универсальный формат обмена между двумя базами 1С. В справочник Контрагенты добавлен реквизит КредитныйЛимит (тип число).Доработать обмен чтобы КредитныйЛимит передавался при обмене, использовать расширение формата обмена. обмен доработать без использования конфигурации КД3.1. доработку выполнить в расширении конфигурации. основную конфигурацию изменять запрещено
-
8 октября 2026 в 16:17 #38827
Да, такую доработку можно выполнить без изменения основной конфигурации и без использования КД3.1.
Для этого в обеих базах нужно создать расширение конфигурации, в котором:
1. Добавить реквизит
КредитныйЛимитв справочникКонтрагенты.
2. Расширить правила формирования EnterpriseData.
3. При выгрузке помещать значение в дополнительную область универсального формата.
4. При загрузке извлекать значение и записывать его в реквизит контрагента.
5. Подключить одинаковую версию расширения формата в обеих базах.Для одного дополнительного реквизита не требуется изменять стандартную XDTO-схему EnterpriseData. Оптимальный вариант, предусмотренный архитектурой универсального формата, это передавать значение через
AdditionalInfo, то есть через дополнительные сведения объекта. Это и есть расширение передаваемых данных без изменения основной конфигурации и стандартного формата.## 1. Что должно быть в обеих базах
В источнике и приемнике должны быть одинаково созданы:
— реквизит справочника
Контрагенты.КредитныйЛимит;
— тип реквизита, например:
— число, длина 15;
— точность 2;
— неотрицательное значение;
— расширение конфигурации с одинаковым идентификатором расширения;
— обработчики обмена;
— ключ дополнительного свойства, напримерКредитныйЛимит.Если реквизит уже добавлен в обе основные конфигурации, повторно добавлять его в расширение не нужно. В расширении потребуется только доработка обмена.
## 2. Почему не нужно менять стандартную схему EnterpriseData
Стандартный формат EnterpriseData не следует изменять напрямую.
Если добавить новый элемент непосредственно в типовой XDTO-пакет
EnterpriseData, то возникнут проблемы:— конфигурация будет снята с поддержки;
— при обновлении типовой конфигурации изменения могут быть потеряны;
— другая база может не распознать измененную схему;
— потребуется синхронно обновлять структуру формата в обеих базах;
— стандартный менеджер обмена может игнорировать новый узел.Для пользовательских реквизитов в EnterpriseData обычно используется дополнительная информация объекта. В ней можно передать реквизит, которого нет в типовом формате.
В XML обмена логика будет примерно следующая:
1С (Код)123456<AdditionalInfo><Property><Name>КредитныйЛимит</Name><Value>500000.00</Value></Property></AdditionalInfo>Конкретное XML-представление зависит от версии EnterpriseData и реализации менеджера обмена в конкретной конфигурации. Вручную изменять XML-файл обмена не нужно.
## 3. Структура расширения
В расширении рекомендуется создать общий модуль, например:
1С (Код)1ОбменКонтрагентыРасширениеНастройки общего модуля:
— Сервер: Да;
— Вызов сервера: Да;
— Клиент: при необходимости;
— Глобальный: обычно Нет;
— Экспорт: только для процедур, которые вызываются механизмом обмена.Также в расширении нужно расширить общий модуль, который отвечает за обмен через универсальный формат. Его имя зависит от конфигурации и версии формата. В типовых конфигурациях это может быть общий модуль с наименованием, содержащим:
1С (Код)1МенеджерОбменаЧерезУниверсальныйФорматили модуль, имя которого определяется процедурой:
1С (Код)1ДоступныеВерсииУниверсальногоФорматаСначала в конфигураторе нужно найти общий модуль, соответствующий используемой версии EnterpriseData.
## 4. Вариант передачи через AdditionalInfo
Нужно использовать отдельное имя свойства, например:
1С (Код)1КредитныйЛимитЛучше добавить префикс организации, чтобы не пересечься с будущими типовыми свойствами:
1С (Код)1MyCompany.КредитныйЛимитНапример:
1С (Код)1ИмяСвойства = "MyCompany.КредитныйЛимит";Значение необходимо передавать в числовом виде, а не в локализованной строке. Нельзя формировать значение так:
1С (Код)1Строка(Объект.КредитныйЛимит)В зависимости от региональных настроек это может дать:
1С (Код)1500 000,25или:
1С (Код)1500,000.25При разборе в другой базе такая строка может быть обработана неправильно.
Лучше использовать тип значения, поддерживаемый механизмом дополнительных свойств EnterpriseData, либо выполнять преобразование в число с учетом формата, принятого в конкретной версии менеджера обмена.
## 5. Обработка выгрузки
При формировании объекта
Контрагентнужно добавить в его дополнительные сведения значение реквизитаКредитныйЛимит.Логика должна быть следующей:
1С (Код)123456789101112131415Если ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Контрагенты") ТогдаЗначениеКредитногоЛимита = ОбъектИсточник.КредитныйЛимит;Если ЗначениеКредитногоЛимита <> Неопределено ТогдаДобавитьДополнительноеСвойство(ОбъектEnterpriseData,"MyCompany.КредитныйЛимит",ЗначениеКредитногоЛимита);КонецЕсли;КонецЕсли;Процедура
ДобавитьДополнительноеСвойствов приведенном примере является условной. В реальном расширении ее нужно заменить на процедуру, структуру или метод, используемый конкретным менеджером универсального формата.В некоторых конфигурациях дополнительные свойства представлены не структурой, а массивом или таблицей значений. Тогда логика будет выглядеть так:
1С (Код)1234567НоваяДопИнформация = Новый Структура;НоваяДопИнформация.Вставить("Имя", "MyCompany.КредитныйЛимит");НоваяДопИнформация.Вставить("Значение", ЗначениеКредитногоЛимита);ОбъектEnterpriseData.ДополнительнаяИнформация.Добавить(НоваяДопИнформация);Либо:
1С (Код)12345678910111213ДополнительноеСвойство = Новый Структура;ДополнительноеСвойство.Вставить("Ключ","MyCompany.КредитныйЛимит");ДополнительноеСвойство.Вставить("Значение",ОбъектИсточник.КредитныйЛимит);МассивДополнительнойИнформации.Добавить(ДополнительноеСвойство);Точный вариант зависит от того, как в данной конфигурации реализована работа с
AdditionalInfo.## 6. Обработка загрузки
При загрузке данных из EnterpriseData нужно:
1. определить, что загружается объект
Контрагент;
2. найти дополнительное свойствоMyCompany.КредитныйЛимит;
3. проверить его тип и значение;
4. записать значение вОбъектПриемник.КредитныйЛимит.Общая логика:
1С (Код)1234567891011121314151617181920Если ТипЗнч(ОбъектПриемник) = Тип("СправочникОбъект.Контрагенты") ТогдаЗначениеДополнительногоСвойства =НайтиДополнительноеСвойство(ОбъектEnterpriseData,"MyCompany.КредитныйЛимит");Если ЗначениеДополнительногоСвойства <> Неопределено ТогдаЕсли ЗначениеДополнительногоСвойства = "" ТогдаОбъектПриемник.КредитныйЛимит = 0;ИначеОбъектПриемник.КредитныйЛимит =Число(ЗначениеДополнительногоСвойства);КонецЕсли;КонецЕсли;КонецЕсли;Также необходимо ограничить значение точностью реквизита:
1С (Код)12345678910ЗначениеЛимита = Число(ЗначениеДополнительногоСвойства);Если ЗначениеЛимита < 0 ТогдаЗначениеЛимита = 0;КонецЕсли;ОбъектПриемник.КредитныйЛимит = Окр(ЗначениеЛимита,2);Если по бизнес-логике
0означает отсутствие кредитного лимита, можно записывать ноль. Если нужно различать «лимит не задан» и «лимит равен нулю», реквизит должен допускать такую логику отдельно, поскольку числовой реквизит сам по себе не хранитНеопределенокак обычное значение базы.## 7. Где размещать обработчики в расширении
Есть два варианта.
### Вариант 1. Расширение общего модуля
Если используемая конфигурация позволяет расширять процедуры менеджера обмена, в расширении создается расширение общего модуля типового менеджера обмена.
В нем подключаются обработчики к процедурам типового модуля через аннотации расширения:
1С (Код)123456789&После("ИмяТиповойПроцедуры")Процедура Расширение_ПослеФормированияКонтрагента(СтруктураДанных,ОбъектИсточник)// Добавление КредитногоЛимитаКонецПроцедурыДля загрузки:
1С (Код)123456789&После("ИмяТиповойПроцедурыЗагрузки")Процедура Расширение_ПослеПодготовкиКонтрагента(ОбъектПриемник,СтруктураДанных)// Чтение КредитногоЛимитаКонецПроцедурыНазвания
ИмяТиповойПроцедурыиИмяТиповойПроцедурыЗагрузкиздесь условные. Их нельзя переносить в конфигурацию буквально. Нужно открыть общий модуль конкретной конфигурации и выбрать фактические процедуры, вызываемые:— перед формированием объекта EnterpriseData;
— после формирования объекта EnterpriseData;
— перед записью объекта в информационную базу;
— после разбора входящего объекта.### Вариант 2. Собственный менеджер обмена в расширении
Если типовой менеджер обмена не имеет подходящих точек расширения, в расширении можно создать собственный внешний менеджер обмена.
Типовая конфигурация БП и другие конфигурации на БСП обычно позволяют указать менеджер обмена через универсальный формат во внешней обработке. Тогда:
1. В расширении создается общий модуль с логикой обмена.
2. Его код помещается во внешнюю обработку.
3. В настройке синхронизации в поле менеджера обмена указывается эта обработка.
4. Основная конфигурация при этом не изменяется.В некоторых конфигурациях вкладка с путем к менеджеру обмена скрыта. Ее можно включить через:
1С (Код)1234Настройка синхронизации данных→ Еще→ Изменить форму→ Служебная информацияПосле этого указывается путь к внешнему менеджеру обмена.
Однако этот вариант нужно применять только в том случае, если расширение типового общего модуля не позволяет перехватить нужные этапы обмена.
## 8. Как определить реальные точки расширения
В конфигураторе нужно выполнить следующие действия.
### В источнике
Найти общий модуль менеджера универсального формата и определить процедуру, которая формирует объект
Контрагент.Нужно искать код, где встречаются:
1С (Код)1Контрагент1С (Код)1СправочникСсылка.Контрагенты1С (Код)1СправочникОбъект.Контрагенты1С (Код)1EnterpriseData1С (Код)1ДополнительнаяИнформация1С (Код)1AdditionalInfo### В приемнике
Найти процедуру, которая получает объект формата и создает или изменяет объект:
1С (Код)1СправочникОбъект.КонтрагентыИменно в этот момент следует заполнить:
1С (Код)1ОбъектПриемник.КредитныйЛимитНельзя просто добавить реквизит в структуру соответствия. Если типовой менеджер не знает этот реквизит, он его проигнорирует. Значение должно быть явно включено в формируемые дополнительные данные и явно обработано при загрузке.
## 9. Если требуется именно отдельная XDTO-структура
Если под «расширением формата» требуется не
AdditionalInfo, а отдельный XML-элемент с собственной XDTO-схемой, тогда используется другой вариант.В расширении создается собственный XDTO-пакет, например:
1С (Код)1MyCompanyEnterpriseDataExtensionДля него задается уникальное пространство имен:
1С (Код)1http://mycompany.ru/EnterpriseData/Extension/1.0В пакете описывается тип:
1С (Код)1CounterpartyExtensionс элементом:
1С (Код)1CreditLimitТип элемента:
1С (Код)1decimalПосле этого в расширении необходимо:
1. Добавить XDTO-пакет.
2. Определить типCounterpartyExtension.
3. ДобавитьCreditLimitс числовым типом.
4. В обработчике выгрузки создавать объект XDTO этого типа.
5. Добавлять его в расширенную часть данных контрагента.
6. В обработчике загрузки получать этот объект.
7. ПреобразовыватьCreditLimitв число.
8. Записывать значение вКонтрагенты.КредитныйЛимит.Но такой вариант зависит от конкретной версии EnterpriseData и от того, предоставляет ли текущая конфигурация расширяемую точку для добавления пользовательского XDTO-объекта. Одного добавления XDTO-пакета в расширение недостаточно. Типовой менеджер обмена не начнет автоматически его выгружать и загружать.
Поэтому для одного реквизита
КредитныйЛимитправильнее использоватьAdditionalInfo. Если же необходимо, чтобы сторонние системы видели отдельный XML-элемент, тогда потребуется полноценное расширение схемы и ручное расширение менеджера обмена.## 10. Регистрация изменений
Чтобы изменение
КредитныйЛимитинициировало обмен, недостаточно только передавать реквизит при выгрузке.Нужно проверить план обмена:
1С (Код)1Синхронизация данных через универсальный форматили другой план, используемый конкретной конфигурацией.
В состав плана обмена уже должен входить справочник:
1С (Код)1КонтрагентыЕсли изменение реквизита не регистрируется, возможна ситуация:
— контрагент был изменен только по
КредитныйЛимит;
— объект не попал в очередь изменений;
— обмен не выгрузил контрагента;
— в приемнике старое значение.Для типовых планов обмена обычно достаточно того, что объект
Контрагентывключен в состав плана. Если в конфигурации используется выборочная регистрация реквизитов, нужно добавитьКредитныйЛимитв логику регистрации изменений.Проверить это можно следующим образом:
1. Изменить
КредитныйЛимиту контрагента.
2. Записать элемент.
3. Открыть записи регистрации изменений.
4. Убедиться, что контрагент зарегистрирован для нужного узла обмена.
5. Выполнить выгрузку.
6. Проверить, что объект попал в пакет обмена.Если контрагент не зарегистрирован, нужно расширять правила регистрации изменений в расширении.
## 11. Обработка при повторной загрузке
При загрузке следует учитывать несколько случаев:
— свойство отсутствует в старом файле обмена;
— свойство передано пустым;
— передан ноль;
— передано отрицательное значение;
— значение имеет больше знаков после запятой;
— значение невозможно преобразовать в число.Безопасный вариант:
1С (Код)123456789101112131415Если ЗначениеСвойства <> Неопределено ТогдаПопыткаЛимит = Число(ЗначениеСвойства);ИсключениеЛимит = 0;КонецПопытки;Если Лимит < 0 ТогдаЛимит = 0;КонецЕсли;ОбъектПриемник.КредитныйЛимит = Окр(Лимит, 2);КонецЕсли;Если свойство отсутствует, старое значение лучше не затирать:
1С (Код)123Если СвойствоНайдено ТогдаОбъектПриемник.КредитныйЛимит = НовоеЗначение;КонецЕсли;Это важно для совместимости со старыми пакетами обмена, которые были сформированы до установки расширения.
## 12. Что необходимо сделать в каждой базе
### В базе-источнике
1. Установить расширение.
2. Проверить наличие реквизитаКредитныйЛимит.
3. Подключить обработчик выгрузки.
4. ДобавитьКредитныйЛимитвAdditionalInfo.
5. Проверить регистрацию изменения контрагента.
6. Выполнить тестовую выгрузку.
7. Проверить наличие дополнительного свойства в пакете обмена.### В базе-приемнике
1. Установить такое же расширение.
2. Проверить наличие реквизитаКредитныйЛимит.
3. Подключить обработчик загрузки.
4. Найти вAdditionalInfoсвойствоMyCompany.КредитныйЛимит.
5. Преобразовать значение в число.
6. Записать его в объектКонтрагенты.
7. Выполнить загрузку.
8. Проверить значение реквизита в карточке контрагента.## 13. Тестовый сценарий
Проверять лучше на отдельном контрагенте.
### Тест 1. Положительное значение
В базе-источнике установить:
1С (Код)1КредитныйЛимит = 500000,25После обмена в приемнике должно быть:
1С (Код)1КредитныйЛимит = 500000,25### Тест 2. Нулевое значение
В источнике установить:
1С (Код)1КредитныйЛимит = 0После обмена в приемнике должен быть именно ноль.
### Тест 3. Изменение только лимита
Изменить только
КредитныйЛимит, не меняя наименование и ИНН.Проверить, что:
— контрагент зарегистрирован к обмену;
— сформирован пакет;
— значение передано;
— в приемнике лимит изменился.### Тест 4. Старый пакет без свойства
Загрузить пакет, сформированный до доработки.
В этом случае:
— ошибка возникать не должна;
— существующее значение в приемнике желательно не изменять.### Тест 5. Две стороны
Если обмен двусторонний, необходимо отдельно проверить:
— источник изменил лимит и передал приемнику;
— приемник изменил лимит и передал источнику;
— нет циклического затирания значения;
— при конфликте изменений используется предусмотренное типовое правило разрешения конфликтов.## 14. Важное ограничение
Расширение должно быть установлено в обеих базах. Если расширение будет только в базе-источнике, значение попадет в пакет, но база-приемник может его проигнорировать. Если расширение будет только в приемнике, оно сможет загрузить значение только в том случае, если источник уже его передает.
Для надежной работы должны совпадать:
— имя дополнительного свойства;
— формат значения;
— правила обработки пустых значений;
— версия расширения;
— логика выгрузки и загрузки.Практически для задачи с одним реквизитом решение следует строить так:
1С (Код)12345Контрагенты.КредитныйЛимит↓Дополнительная информация EnterpriseData↓Контрагенты.КредитныйЛимитПри этом основная конфигурация не изменяется, КД3.1 не используется, а вся логика располагается в расширении конфигурации и подключается к менеджеру обмена через точки расширения.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.