Подскажите, как написать обмен между самописками?
Доброго дня!
Есть две самописные конфигурации, между ними нужно организовать обмен. Поставили ТЗ обмен писать через файлы на ФТП. Использую формат Json.
1. Переношу простейшие типы (строка, число, булево, дата) с этим проблем нет.
2. ссылки (спрСсылка) передаются как УИД, ищу в базе приемнике,
3. Перечисления - тут вопрос...Как лучше передавать и разбирать их? Можно конечно передавать их в строковом виде и потом делать
Но правильно ли это?
4. Как передавать реквизиты с составным типом данных (ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения)?
Есть две самописные конфигурации, между ними нужно организовать обмен. Поставили ТЗ обмен писать через файлы на ФТП. Использую формат Json.
1. Переношу простейшие типы (строка, число, булево, дата) с этим проблем нет.
2. ссылки (спрСсылка) передаются как УИД, ищу в базе приемнике,
СправочникСсылка = Справочники.ФизическиеЛица.ПолучитьСсылку(Новый УникальныйИдентификатор(СтруктураСообщения.ГУИД));
Если ОбщегоНазначения.СсылкаСуществует(СправочникСсылка) Тогда
СправочникОбъект = СправочникСсылка.ПолучитьОбъект();
Иначе
СправочникОбъект = Справочники.ФизическиеЛица.СоздатьЭлемент();
СправочникОбъект.УстановитьСсылкуНового(СправочникСсылка);
КонецЕсли;
Показать3. Перечисления - тут вопрос...Как лучше передавать и разбирать их? Можно конечно передавать их в строковом виде и потом делать
Если СтруктураСообщения.Пол = "Мужской" Тогда
СправочникОбъект.Пол = Перечисления.ПолФизическогоЛица.Мужской;
Иначе
СправочникОбъект.Пол = Перечисления.ПолФизическогоЛица.Женский;
КонецЕсли;
Но правильно ли это?
4. Как передавать реквизиты с составным типом данных (ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения)?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(12) О какой инфраструктуре речь? Справочник "Пользователи", что там еще? Если самописки существуют, то, полагаю, вся "инфраструктура" уже есть. Здесь на ИС почему-то сильно переоценивают БСП.
БСП необходима в задачах, корень которых обусловен наличием самой же БСП, а в остальном достаточно методов платформы.
БСП необходима в задачах, корень которых обусловен наличием самой же БСП, а в остальном достаточно методов платформы.
(1) так просто КД2 использовать и все. Стандартной обработкой универсальный обмен в формате xml.
Выгрузить в файл - загрузить из файла.
В КД2 правила писать проще простого.
А обработку по универсальному обмену, можно красиво завернуть в свою оболочку, лишнее скрыть от пользователей - оставив минимум кнопок. Если порыть тут на инфостарте, статьи и примеры точно были, как это сделать.
Выгрузить в файл - загрузить из файла.
В КД2 правила писать проще простого.
А обработку по универсальному обмену, можно красиво завернуть в свою оболочку, лишнее скрыть от пользователей - оставив минимум кнопок. Если порыть тут на инфостарте, статьи и примеры точно были, как это сделать.
(1) Тип и вид значения тоже можно передавать через json, чтобы было проще искать.
К примеру:
Обмены подобного вида писались между нетленками в клюшках (на 1С v7.x)
В типовых есть РегистрСведений.СоответствияОбъектовИнформационныхБаз
Что мешает использовать что-то подобное в самописных обменах?
Один раз задал соответствие по УИД и все связки справочник—перечисления закрылись.
Но, поддержу высказывания выше, чтобы было универсально, нужно копать в сторону КД
К примеру:
метТип = "Справочник";
метВид = "Контрагенты";
УИД = "4e531634-c69d-11f0-a1a1-d8bbc16eb42c";
Если метТип = "Справочник" Тогда
УИД = Новый УникальныйИдентификатор(УИД);
ссылка = Справочники[метВид].ПолучитьСсылку(УИД);
Если ссылка.ПолучитьОбъект() = Неопределено Тогда
// создать новый
Иначе
// найдена ссылка
КонецЕсли;
ИначеЕсли метТип = "Документ" Тогда
// ...
КонецЕсли; ПоказатьОбмены подобного вида писались между нетленками в клюшках (на 1С v7.x)
В типовых есть РегистрСведений.СоответствияОбъектовИнформационныхБаз
Что мешает использовать что-то подобное в самописных обменах?
Один раз задал соответствие по УИД и все связки справочник—перечисления закрылись.
Но, поддержу высказывания выше, чтобы было универсально, нужно копать в сторону КД
можешь поверить мне на слово. Лучше тебе внедрить бсп в свои самописки и сделать нормальный обмен через кд и бсп.
Тем более что на стетхеме ты прорастешь все конвертации писать с нуля. А там уже все есть из коробки. Тем более в кд3 оладка простая.
И в бсп есть из коробки обмен по фтп
Тем более что на стетхеме ты прорастешь все конвертации писать с нуля. А там уже все есть из коробки. Тем более в кд3 оладка простая.
И в бсп есть из коробки обмен по фтп
У меня обмен сделан через xml. В одной базе выгружаю таблицу значений, в другой загружаю.
В качестве уникального поля везде использую сгенерированный ИД (без разницы какой, хоть числа по порядку) и регистр сведений, где связаны объекты по ИД в обоих базах. При создании любого нужного объекта для обмена ему присваивается ИД и при обмене, если такого нет в другой базе, то он создаётся и соответствие ИД пишется в регистр сведений.
В качестве уникального поля везде использую сгенерированный ИД (без разницы какой, хоть числа по порядку) и регистр сведений, где связаны объекты по ИД в обоих базах. При создании любого нужного объекта для обмена ему присваивается ИД и при обмене, если такого нет в другой базе, то он создаётся и соответствие ИД пишется в регистр сведений.
(6) Да, ИД только для ссылок.
Передаются только те реквизиты, которые есть в обоих базах. Если реквизитов нет, то можно как-то их копить и потом, например, положить текстовый файл с сообщением на фтп, или сообщать каким-то другим методом. Смысл передавать то, чего нет в другом месте?)
Передаются только те реквизиты, которые есть в обоих базах. Если реквизитов нет, то можно как-то их копить и потом, например, положить текстовый файл с сообщением на фтп, или сообщать каким-то другим методом. Смысл передавать то, чего нет в другом месте?)
На отправку
XMLСтрока(Значение) - Значение это реквизит перечисления в объекте.
На получение.
Перечисления.СтавкиНДС[ЗначениеПеречисленияКотороеПришлоПриОбмене]
XMLСтрока(Значение) - Значение это реквизит перечисления в объекте.
На получение.
Перечисления.СтавкиНДС[ЗначениеПеречисленияКотороеПришлоПриОбмене]
По моему КД 2 это очень медленный механизм с полным чтением объекта для выгрузки. Да и процедуры все выполняются для каждого объекта. Писать правила обмена конечно легко/удобно/понятно, но мне кажется было актуально, когда еще управляемых форм не было. Http + json самое простое и быстрое.
Или там в КД уже что то сильно поменялось?
Или там в КД уже что то сильно поменялось?
(19) Вы сравнивали скорость работы, на сколько можно оптимизировать выгрузку данных написав ее вручную по сравнению с КД?
"А КД это универсальный механизм", это единственный плюс. Работая с 1с хочешь не хочешь, но в КД придется вляпаться)
"А КД это универсальный механизм", это единственный плюс. Работая с 1с хочешь не хочешь, но в КД придется вляпаться)
(20) я и сам разрабатывал и поддерживал много самопальных обменов, в т.ч. с передачей через http сервисы...и до какого то момента считал также, что нафиг нужна эта КД, я и руками сделаю намного оптимальнее и быстрее.
Но когда дело доходит до организации серьезных обменов, навороченных баз, с сотнями самых разных объектов, да если еще и регулярно требуется изменения, в т.ч. и разными людьми...этот "единственный" плюс, перевешивает все преимущества оптимизированных, эксклюзивных вариантов. Я уж молчу про трудозатраты на создание и отладку и изменения. КД в разы облегчает эту задачу.
Но когда дело доходит до организации серьезных обменов, навороченных баз, с сотнями самых разных объектов, да если еще и регулярно требуется изменения, в т.ч. и разными людьми...этот "единственный" плюс, перевешивает все преимущества оптимизированных, эксклюзивных вариантов. Я уж молчу про трудозатраты на создание и отладку и изменения. КД в разы облегчает эту задачу.
При эксплуатации обмена важна прозрачность и доверие, а для этого весь процесс должен быть под контролем. Какие данные выгрузились, как, как загрузились, какие возникли ошибки. В процессе возникают правки : здесь выгружаем не все, здесь не все загружаем, ищем по коду, при загрузке выполняем код и т.д. и т.п. Дальше больше - выгрузите с реализацией СФ и наоборот. Типовой обмен решает большинство задач.
3. Для перечислений можно использовать передачу строкой предопределенного имени с последующим поиском на Приемнике. На приемнике обязательно проверяйте есть ли такое перечисление у вида, иначе словите ошибку.
Отправка:
Получение:
Для ПВХ используйте тот же механизм как и для справочников, а тип можно также передавать и распознавать строкой, только помните, что ТипЗначения ПВХ это описание типов (в примере только 1 тип передается, по логике вашей задачи лучше перебирать все):
Отправка:
Получение:
И т.к. вы пишете самостоятельно обмен, то наверное полезно подключить часть механизма КД, а именно для ссылочных типов передавать не только УИД, а КлючевыеПараметры (Ссылка, код, наименование), по ним в последствии можно организовывать поиск на приемнике. Также учитывайте проблему присвоения УИДа источника, он может быть занят и тогда не сработает назначение. В КД3 для этого используются ПубличныеИдентификаторыСинхронизируеммыхОбъектов, не лишено смысла завести подобное и в вашем обмене.
Но в целом по опыту все самописные обмены приводили к откату на КД2 или КД3 в виду большей надежности и универсальности.
Отправка:
ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;
ИндексЗначенияПеречисления = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
ПредопределенноеИмя = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя;Получение:
ЗначенияПеречисления = Метаданные.Перечисления[ВидПеречисления].ЗначенияПеречисления;
Если Не ЗначенияПеречисления.Найти(ИмяПеречислимого) = Неопределено Тогда
ПолученныеДанные[ИмяРеквизита] = Перечисления[ВидПеречисления][ИмяПеречислимого];
КонецЕсли;Для ПВХ используйте тот же механизм как и для справочников, а тип можно также передавать и распознавать строкой, только помните, что ТипЗначения ПВХ это описание типов (в примере только 1 тип передается, по логике вашей задачи лучше перебирать все):
Отправка:
ТипЗначенияСтрока= ОбщегоНазначения.СтроковоеПредставлениеТипа(ДанныеИБ.ТипЗначения.Типы()[0])Получение:
СписокТипов = Новый Массив;
СписокТипов.Добавить(Тип(ТипЗначенияСтрока));
НовыйПВХ.ТипЗначения = Новый ОписаниеТипов(СписокТипов);И т.к. вы пишете самостоятельно обмен, то наверное полезно подключить часть механизма КД, а именно для ссылочных типов передавать не только УИД, а КлючевыеПараметры (Ссылка, код, наименование), по ним в последствии можно организовывать поиск на приемнике. Также учитывайте проблему присвоения УИДа источника, он может быть занят и тогда не сработает назначение. В КД3 для этого используются ПубличныеИдентификаторыСинхронизируеммыхОбъектов, не лишено смысла завести подобное и в вашем обмене.
Но в целом по опыту все самописные обмены приводили к откату на КД2 или КД3 в виду большей надежности и универсальности.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот