Как рождалась эта разработка.
Вначале я спросил людей(в телеграмм в сообществе БСП и Архитектура):
-Деревом в 1С это не сделать, как быть? Заказ горит. Денег вагон дают.
Мне последовал ответ: Поле HTML документа, html, js и json.
Дальше накидываю дипсику в своем терминале, в котором по апи он мне отвечает без ограничений, сделай мне шаблончик такой идеи, и получаю в ответ:
Ну дальше я вошел во вкус и двое суток накидывал по ТЗ и вспоминал JS и HTML из яркой молодости.
В итоге решение представляет собой расширение реализующее систему взаимодействия с АПИ поставщика под любую платформу и под любые формы.
Регламентное задание раз в сутки грузит данные с сайта поставщика в периодический регистр сведений.
Основная общая форма представляет из себя поле HTML документа и 1 реквизит с типом бесконечная строка. Выводит список доступных позиций в таблицу по данным регистра с, так сказать, "необычными" группировками для 1С (видно на скриншоте).
Ну теперь самое сладкое, код.
&НаСервере
Процедура ОбновитьДанные()
// Инициализация таблицы для хранения результата запроса
РезультатЗапроса = Новый ТаблицаЗначений;
РезультатЗапроса.Колонки.Добавить("ПартНомер");
РезультатЗапроса.Колонки.Добавить("Производитель");
РезультатЗапроса.Колонки.Добавить("Бренд");
РезультатЗапроса.Колонки.Добавить("ТНВЭД");
РезультатЗапроса.Колонки.Добавить("ДатаЗагрузки");
РезультатЗапроса.Колонки.Добавить("ОтветныйПартНомер");
РезультатЗапроса.Колонки.Добавить("Количество");
РезультатЗапроса.Колонки.Добавить("Прайсы", Новый ОписаниеТипов("ТаблицаЗначений"));
// Инициализация таблицы для хранения прайсов
ТаблицаПрайс = Новый ТаблицаЗначений;
ТаблицаПрайс.Колонки.Добавить("ПартНомер");
ТаблицаПрайс.Колонки.Добавить("ГруппировкаВидПрайса");
ТаблицаПрайс.Колонки.Добавить("СрокПоставки");
ТаблицаПрайс.Колонки.Добавить("Цены");
ТаблицаПрайс.Колонки.Добавить("Количество");
ТаблицаПрайс.Колонки.Добавить("Источник");
ТаблицаПрайс.Колонки.Добавить("Предложение");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ИсторияОбновленияНоменклатурыСрезПоследних.Номенклатура.Артикул КАК ПартНомер,
| ИсторияОбновленияНоменклатурыСрезПоследних.Номенклатура.БрендПроизводитель КАК Производитель,
| ИсторияОбновленияНоменклатурыСрезПоследних.Период КАК ДатаЗагрузки,
| ИсторияОбновленияНоменклатурыСрезПоследних.ОтветныйПартНомер КАК ОтветныйПартНомер,
| ИсторияОбновленияНоменклатурыСрезПоследних.ТНВЭД КАК ТНВЭД,
| ИсторияОбновленияНоменклатурыСрезПоследних.ИсточникИД КАК ИсточникИД,
| ИсторияОбновленияНоменклатурыСрезПоследних.ДатаКвотации КАК ДатаКвотации,
| ИсторияОбновленияНоменклатурыСрезПоследних.ВидПрайса КАК ГруппировкаВидПрайса,
| ИсторияОбновленияНоменклатурыСрезПоследних.Валюта КАК Валюта,
| ВЫРАЗИТЬ(ИсторияОбновленияНоменклатурыСрезПоследних.СрокПоставки КАК СТРОКА(250)) КАК СрокПоставки,
| ИсторияОбновленияНоменклатурыСрезПоследних.ДоступноеКоличество КАК Количество,
| ВЫРАЗИТЬ("" "" КАК СТРОКА(250)) КАК Цены,
| ИсторияОбновленияНоменклатурыСрезПоследних.Бренд КАК Бренд,
| ИсторияОбновленияНоменклатурыСрезПоследних.Источник КАК Источник,
| ИсторияОбновленияНоменклатурыСрезПоследних.КоличествоОт КАК КоличествоОт,
| ИсторияОбновленияНоменклатурыСрезПоследних.Предложение КАК Предложение,
| ИсторияОбновленияНоменклатурыСрезПоследних.Цена КАК ЦенаПозиции
|ИЗ
| РегистрСведений.ИсторияОбновленияНоменклатуры.СрезПоследних(&Дата, ) КАК ИсторияОбновленияНоменклатурыСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| ПартНомер,
| Предложение,
| ГруппировкаВидПрайса,
| КоличествоОт
|ИТОГИ
| МАКСИМУМ(Производитель),
| МАКСИМУМ(ДатаЗагрузки),
| МАКСИМУМ(ОтветныйПартНомер),
| МАКСИМУМ(ТНВЭД),
| МАКСИМУМ(ИсточникИД),
| МАКСИМУМ(ДатаКвотации),
| МАКСИМУМ(Валюта),
| МАКСИМУМ(СрокПоставки),
| СУММА(Количество),
| МАКСИМУМ(Цены),
| МАКСИМУМ(Бренд),
| МАКСИМУМ(Источник),
| МАКСИМУМ(ЦенаПозиции)
|ПО
| ПартНомер,
| Предложение,
| ГруппировкаВидПрайса,
| КоличествоОт
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Дата", КонецДня(ТекущаяДата()));
//Запрос.Текст = СтрЗаменить(Запрос.Текст, "%ИМЯТАБЛИЦЫ%", СтрЗаменить(Константы.TC_ИмяТаблицы.Получить(), ".ТабличнаяЧасть", ""));
ИмяСправочника = СтрЗаменить(Константы.TC_Реквизит.Получить(), Константы.TC_ИмяТаблицы.Получить() + ".Реквизит.", "");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Номенклатура", ИмяСправочника);
Артикул = Константы.TC_РеквизитПартНомер.Получить();
Если Артикул = "Код" Или Артикул = "Наименование" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Артикул", Артикул);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Артикул", СтрЗаменить(Константы.TC_РеквизитПартНомер.Получить(), "Справочник.Номенклатура.Реквизит.", ""));
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "БрендПроизводитель", СтрЗаменить(Константы.TC_РеквизитБренд.Получить(), "Справочник.Номенклатура.Реквизит.", ""));
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
Строка = РезультатЗапроса.Добавить();
Строка.ДатаЗагрузки = Выборка.ДатаЗагрузки;
Строка.Количество = Выборка.Количество;
ВыборкаПредложение = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
// Очищаем таблицу прайсов перед заполнением для новой строки
ТаблицаПрайс.Очистить();
Пока ВыборкаПредложение.Следующий() Цикл
ВыборкаВидПрайса = ВыборкаПредложение.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаВидПрайса.Следующий() Цикл
НоваяСтрока = ТаблицаПрайс.Добавить();
ЗаполнитьЗначенияСвойств(Строка, ВыборкаВидПрайса, , "ДатаЗагрузки,Количество");
НоваяСтрока.ГруппировкаВидПрайса = Строка(ВыборкаВидПрайса.ГруппировкаВидПрайса);
ВыборкаКоличествоОт = ВыборкаВидПрайса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
СтрокаЦен = "";
СтрокаСрокиПоставки = "";
Пока ВыборкаКоличествоОт.Следующий() Цикл
СтрокаЦен = СтрокаЦен + Строка(ВыборкаКоличествоОт.ЦенаПозиции) + " " + ВыборкаКоличествоОт.Валюта + " от " + Строка(ВыборкаКоличествоОт.КоличествоОт) + "<br>";
СтрокаСрокиПоставки = СОКРЛП(ВыборкаКоличествоОт.СрокПоставки);
ВыборкаДетали = ВыборкаКоличествоОт.Выбрать();
КонецЦикла;
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаВидПрайса);
НоваяСтрока.Количество = ВыборкаПредложение.Количество;
НоваяСтрока.Цены = СтрокаЦен;
НоваяСтрока.СрокПоставки = СтрокаСрокиПоставки;
КонецЦикла;
КонецЦикла;
// Копируем заполненную таблицу прайсов в строку результата
Строка.Прайсы = ТаблицаПрайс;
КонецЦикла;
// Преобразование результата в HTML
Реквизит1 = ТаблицаВHTML(РезультатЗапроса);
КонецПроцедуры
Получилось что то такое, если смотреть с точки зрения будущего 1С:
Итоговый вариант для заказчика выглядел так:
Ну что хочу сказать в итоге. Реализация в прикрепленном расширении.
Чуть понимающий специалист сделает себе такое же, для своих поставщиков по апи воткнув токен, эндпоинт и чуть подправив код.
Под любую платформу. Под любые формы.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.228
Вступайте в нашу телеграмм-группу Инфостарт