Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 июн 2025, 01:55

ЭДО унф и бп

Автор sali, 09 июн 2025, 08:55

0 Пользователей и 1 гость просматривают эту тему.

sali

есть новое расширение по эдо и не вдупляю совсем куда/где лучше прописать дополнительно строки чтобы получить ключ торгового оборудования он же ГУИД.
код идет таким ..
мы нажимаем на кнопку "Получить Номенклатуру Для Сопоставления"
&НаКлиенте
Процедура ПолучитьНоменклатураДляСопоставления(Команда)
Результат = ПолучитьНоменклатураДляСопоставленияНаСервере();

Для Каждого СтрокаСопоставления Из Результат.МассивНоменклатуры Цикл
СопоставлениеНоменклатуры.Очистить();
        ТоварТЗ = СопоставлениеНоменклатуры.Добавить();
ТоварТЗ.Наименование = СтрокаСопоставления.name;

КонецЦикла;
СопоставлениеПоНаименованию(); // по гуиду

Если ЗначениеЗаполнено(Результат.СообщениеОбОшибке) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(СтрШаблон(НСтр("ru='Сервис вернул ошибку: %1'"), Результат.СообщениеОбОшибке));

ТекстОповещения = НСтр("ru='Ошибка'");
ТекстПояснения = НСтр("ru='Сервис вернул ошибку'");
ПоказатьОповещениеПользователя(ТекстОповещения,, ТекстПояснения, БиблиотекаКартинок.ДиалогВосклицание);
Иначе

ТекстОповещения = НСтр("ru='Успех'");
ТекстПояснения = НСтр("ru='Данные с сервиса получены'");
ПоказатьОповещениеПользователя(ТекстОповещения,, ТекстПояснения, БиблиотекаКартинок.ДиалогИнформация);

Оповестить("ЗагрузкаНоменклатура");
КонецЕсли;
КонецПроцедуры   


дальше мы идем в функцию
&НаСервере
Функция ПолучитьНоменклатураДляСопоставленияНаСервере()
КлючТорговогоОборудования = ?(ЭДОН_ТорговоеОборудование.Пустая(), "", ЭДОН_ТорговоеОборудование.ГУИДИсточника);
Возврат ЭДОН_РаботаССервисом.ПолучитьНоменклатураДляСопоставления(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, ЭтоБП);
КонецФункции

которая идет в общий модуль и вернет нам результат - либо заполненный массив, либо сообщение об ошибке
Функция ПолучитьНоменклатураДляСопоставления(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, ЭтоБП) Экспорт
Результат = Новый Структура;
Результат.Вставить("СообщениеОбОшибке", "");
Результат.Вставить("МассивНоменклатуры","");

   // кучу строк на заполнение deviceID, AUTH, method и так далее, в общем заполняет все данные торг. оборуд, клиента, адреса перед получением номенклатуры
Если РезультатОперации.КодСостояния = 200 Тогда

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатОперации.Содержимое);
ОтветОбъект = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Если ОтветОбъект.general.error Тогда

// Сообщение для пользователя.
Результат.СообщениеОбОшибке = ОтветОбъект.general.message;

// Запист в журнал регистарции.
ИнформацияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Сервис вернул ошибку (%1).
|Код состояния: %2;
|Сообщение: %3'"),
ИдентификаторСервиса,
ОтветОбъект.general.response,
ОтветОбъект.general.message);

ЗаписатьОшибкуВЖурналРегистрации(ИнформацияОбОшибке, ИдентификаторСервиса);
Иначе
МассивНоменклатура = ОтветОбъект.result.goods;
Если МассивНоменклатура.Количество() = 0 Тогда
Результат.СообщениеОбОшибке = НСтр("ru = 'Нет данных для загрузки.'"); 
Иначе 
Результат.МассивНоменклатуры = МассивНоменклатура;
КонецЕсли; 
КонецЕсли;

Иначе
ЗаписатьОшибкуВЖурналРегистрации(РезультатОперации.ИнформацияОбОшибке, ИдентификаторСервиса);

Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
?(РезультатОперации.КодСостояния = 500,
НСтр("ru = 'Ошибка сервиса (%1).'"),
НСтр("ru = 'Ошибка подключения (%1).'")),
РезультатОперации.КодСостояния);
КонецЕсли;

Возврат Результат;

КонецФункции
 


по окончанию функции при успешном всем получаем результат (является массивом). в нем содержится гуид номенклатуры приемник/источник (goodID, ownerID), картинка товара, наименование, штрихкод и тому подобное.  и встает вопрос где писать строку о получение и гуида торгового оборудования?

Максим75

sali, ну добавьте в структуру Результат еще что-то, где и будете писать за торговое оборудование.

потом там, куда эта структура возвращается, разберете. у Вас будет некий массив номенклатуры, и будет еще что-то, где будет храниться нужный Вам ГУИД.

sali

Максим75, ага я решил сделать так
Функция ПолучитьНоменклатураДляСопоставления(АдресПубликации, КлючКлиента, КлючТорговогоОборудования, ЭтоБП) Экспорт
Результат = Новый Структура;
Результат.Вставить("СообщениеОбОшибке", "");
Результат.Вставить("МассивНоменклатуры","");
    Результат("ГУИДТорговогоОборудования", "");
...
Иначе
МассивНоменклатура = ОтветОбъект.result.goods;
        ТоргОборудование   = КлючТорговогоОборудования;
Если МассивНоменклатура.Количество() = 0 Тогда
Результат.СообщениеОбОшибке = НСтр("ru = 'Нет данных для загрузки.'"); 
Иначе 
Результат.МассивНоменклатуры = МассивНоменклатура;
Результат.ГУИДТорговогоОборудования = ТоргОборудование;
КонецЕсли; 
КонецЕсли;


и уже в обработке ЭДО получить наименование этого оборудования
&НаКлиенте
Процедура ПолучитьНоменклатураДляСопоставления(Команда)
Результат = ПолучитьНоменклатураДляСопоставленияНаСервере();

Для Каждого СтрокаСопоставления Из Результат.МассивНоменклатуры Цикл
СопоставлениеНоменклатуры.Очистить();
ТоварТЗ = СопоставлениеНоменклатуры.Добавить();
ТоварТЗ.Наименование = СтрокаСопоставления.name;
ТоварТЗ.ГУИДИсточник     = СтрокаСопоставления.goodID;
ТоварТЗ.ГУИДПриёмник     = СтрокаСопоставления.ownerID;
ТоварТЗ.Штрихкод = СтрокаСопоставления.barcode;
ТоварТЗ.АртикулЭДО = СтрокаСопоставления.article;
        ТоварТЗ.ТоргОб           = Справочники.ЭДОН_тОРГОВОЕоБОРУДОВАНИЕ.НайтиПоРеквизиту("ГУИДИсточника", Результат.ГУИДТорговогоОборудования.ключ);
КонецЦикла;

это же будет верно?

sali

ВЫБРАТЬ
СопоставлениеНоменклатуры.Наименование КАК Наименование,
СопоставлениеНоменклатуры.Номенклатура КАК Номенклатура,
СопоставлениеНоменклатуры.ГУИДИсточник КАК ГУИДИсточник
ИЗ
РегистрСведений.СопоставлениеНоменклатуры КАК СопоставлениеНоменклатуры
ГДЕ
не СопоставлениеНоменклатуры.ГУИДИсточник ЕСТЬ NULL
почему так работает , а вот так уже нет??

ВЫБРАТЬ
СопоставлениеНоменклатуры.Наименование КАК Наименование,
СопоставлениеНоменклатуры.Номенклатура КАК Номенклатура,
СопоставлениеНоменклатуры.ГУИДИсточник КАК ГУИДИсточник
ИЗ
РегистрСведений.СопоставлениеНоменклатуры КАК СопоставлениеНоменклатуры
ГДЕ
СопоставлениеНоменклатуры.ГУИДИсточник ЕСТЬ NULL

Максим75

sali, ну наверное потому, что в первом случае условие выполняется, а во втором не выполняется. не?

antoneus

Какой тип у ГУИДИсточник?

Да неважно, на самом деле. Даже если составной - в результате обычной выборки в незаполненном реквизите окажется Неопределено, никак не null. Null нельзя запихать в реквизит. Вот что пишет 1С:

Значение типа Null используется при работе с таблицами прикладных объектов. Оно обозначает отсутствие значения поля в выборке. Прежде всего оно используется в результатах запросов выполняющих левое или правое соединение. Поля невыбранных записей таблиц участвующих в таких соединениях будут иметь значение Null. Кроме того, значение типа Null будет иметь, например, реквизит иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами.


sali

antoneus, хорошо , но если я и ставлю в условии ГДЕ
СопоставлениеНоменклатуры.ГУИДИсточник = НЕОПРЕДЕЛЕНО
пустой ответ , а данные есть такие
на условие в запросе же ГДЕ
не СопоставлениеНоменклатуры.ГУИДИсточник = НЕОПРЕДЕЛЕНО

он вытаскивает абсолютно все записи

antoneus

Так какой тип у ГУИДИсточник?

sali


Максим75

sali, ну т.е. надо проверять на пустую строку. а не неопределено, null и прочее.

Теги:

Похожие темы (4)

Рейтинг@Mail.ru

Поиск