Всем привет и с Новым Годом, уважаемые знатоки!)
Использую платформу 8.3.9
В целях повышения собственных знаний и накопления опыта решил поиграться с обменом с базой какого-то сайта, благо пока выходные и все бухают - есть время повысить собственный IQ.
Дано: Есть локальный сайт, созданный на базе OpenCart у которого имеется БД на MySQL (phpMyAdmin). Есть конфигурация 1С УТП.
Требуется: сделать связь между 1С и базой данных MySQL для обмена товарами, категориями, заказами. Из 1С в OpenCart должны идти категории и товары, а назад Заказы покупателей.
Что пробовал и что пытаюсь сделать: почесав репу, решил попробовать поиграться с объектом "Внешние источники данных", т.к. раньше его не использовал, и захотелось получить немного опыта работы с ним. Нашел мануальчик как подключиться к базе и вроде как к базе подключиться удалось, добавились таблицы с базы скуля в дерево объектов 1С. Попробовал сделать простейший запрос на выборку категорий - супер, данные читаются - тут все ок.
Проблема:
Дальше захотел попробовать выгрузить номенклатуру и группы номенклатуры в товары и категории сайта и тут застрял. Немного не понимаю принципа как это можно сделать.
В одних источниках пишут что с полученными таблицами можно работать как с обычными объектами 1С, например так:
КатегорияОбъект = ВнешниеИсточникиДанных.ИМЯБД.Таблицы.oc_category.СоздатьОбъект();
КатегорияОбъект.category_id = 1;
КатегорияОбъект.top = 1;
КатегорияОбъект.column = 1;
КатегорияОбъект.sort_order = 1;
КатегорияОбъект.date_added = ТекущаяДата();
КатегорияОбъект.date_modified = ТекущаяДата();
КатегорияОбъект.Записать();
Сделал тестовую новую базу (а не базу OpenCart) - подключил её, и запись и чтение сработало, скорее всего я что-то не заполнял из обязательных полей или не в таком формате.... поковыряюсь.
Но остается вопрос - как массово сделать запись в базу? т.е. не по одной записи писать, а например одним запросом/действием закинуть в базу перечень товаров/категорий
Bernet @ Вчера, 11:14
,
Можно начать с модуля который будет работать с MySQL.
Я уже решал такую задачу.
Можно почитать http://pro1c.org.ua/redirect.php?http://bisoft.kiev.ua/index.php?route=product/product&path=1&product_id=1015 что получилось
Небольшой пример
хакерок, вопрос в том, как сделать это через ВнешнийИсточникДанных.
Bernet, в виде рассуждения. Так как в регистры сведений, например, мы не можем добавить сразу несколько записей, то вероятно, с внешними источниками данных ситуация такая же.
Vofka @ Сегодня, 14:28
,
а как же набор записей?) в регистры можем, играясь с внешним иточником OpenCarta выявил что записи без проблем записываются в таблицы "Необъектного" типа, т.е. они похожи на регистры сведений - туда записать могу и одну и несколько записей (работаем через МенеджерЗаписи или НаборЗаписей), а вот в таблицу объектного типа oc_category (таблица с категориями в OpenCarte) не получается записать даже одиночную запись (похоже на создание документа СоздатьОбъект()). Ругается:
КатегорияОбъект = ВнешниеИсточникиДанных.МОЯБД.Таблицы.oc_category.СоздатьОбъект();
КатегорияОбъект.category_id = 4;
КатегорияОбъект.parent_id = 0;
КатегорияОбъект.top = 1;
КатегорияОбъект.column = 1;
КатегорияОбъект.sort_order = 1;
КатегорияОбъект.status = 1;
КатегорияОбъект.date_added = ТекущаяДата();
КатегорияОбъект.date_modified = ТекущаяДата();
КатегорияОбъект.Записать();
КатегорияОбъект = ВнешниеИсточникиДанных.МОЯБД.Таблицы.categories.СоздатьОбъект();
КатегорияОбъект.category_id = 4;
КатегорияОбъект.name = "ПРИМЕР";
КатегорияОбъект.description = "тест";
КатегорияОбъект.Записать();
Vofka @ Сегодня, 14:40
,
вот так вроде можно:
НаборЗаписей = РегистрыСведений.НоменклатураСклады.СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
ТЗ_Записей = НаборЗаписей.Выгрузить();
Для Каждого СтрокаТоваров Из Товары Цикл
Запись = ТЗ_Записей.Добавить();
Запись.Номенклатура = СтрокаТоваров.Номенклатура;
Запись.Склад = СтрокаТоваров.Склад;
КонецЦикла;
ТЗ_Записей.Свернуть("Номенклатура,Склад");
НаборЗаписей.Загрузить(ТЗ_Записей);
НаборЗаписей.Записать(Истина);
INSERT INTO [table] (col1, col2, col3) VALUES ((val11, val12, val13), (val21, val22, val23), (val31, val32, val33))
Bernet @ Сегодня, 15:39
,
Тоже пробовал записывать данные с использованием класса ВнешниеИсточникиДанных похоже метод Записать() создаёт SQL запрос совместимый с MS SQL и MS Access.
Будет время могу поделится основными частями записи в MySQL бесплатно.Bernet @ Сегодня, 15:39
,
Vofka @ Сегодня, 17:15
,
Да, код работает - проверил.
Про отбор в курсе, просто в нашем случае однозначно установить отбор не получится, поэтому по такому принципу написал: получаем то что уже в таблице есть и добавляем новые записи, но тут есть момент - если попадется сочетание измерений по которым запись уже есть - выдаст ошибку, поэтому и сделал выгрузку в ТЗ, и сворачивание ТЗ, а затем уже окончательную таблицу пишу в РС.
Знаю что это бред, но тем не менее такая возможность есть
Кстати, если допустим будет такая ситуация что надо писать набор записей в регистр и отбор сразу установить не получится, то что лучше - писать по одной записи через МенеджерЗаписи 1000 записей (соответственно 1000 запросов к базе) или лучше три запроса (выгрузка в ТЗ, сворачивание, запись в регистр) - условно один но тяжелый запрос?
хакерок @ Сегодня, 16:02
,
если есть возможность приведите пример как Вы в базу внешнего источника добавляете записи. У меня на самодельной базе получается, а на базе OpenCarta нет, не знаю в чем особенность, но именно в таблицу oc_category добавлять не хочет
Vofka @ Сегодня, 17:35
,
Поиграюсь на досуге, сейчас борюсь с той долбанной записью в MySQL
Bernet @ Сегодня, 15:39
,
Попробуйте ТекущуюДату() перед внесением обработать функцией
Функция СтрокаДата(Дата) Экспорт
Возврат Строка(Формат(Дата,"ДФ=yyyy-MM-dd"));
КонецФункции
Кажется разобрался, решил попробовать воссоздать полностью эту таблицу "oc_category" в новой базе и при попытке создать колонку с именем "column" - MySQL ругнулся что это зарезервированное слово. Если посмотреть на текст ошибки то собственно с этого поля ошибка и начинается, так что подозреваю проблема именно в этом
Bernet @ Сегодня, 23:21
,
и что в таком случае нужно делать? как же тогда работают готовые решения по обменам с OpenCart-ом? если найдете решение отпишитесь пожалуйста
Sarm @ Сегодня, 23:30
,
Знал бы прикуп..) буду искать, как работает это в других обменах я не знаю, может там не используется объект "Внешний источник данных"
Что ж, господа, решение найдено. При добавлении внешнего источника данных убрал галочку с поля "column" таблицы "oc_category" и вуаля - запись в базу идет без проблем. Уж без этого поля как-то обойдусь, его в админке если что вручную проставить можно будет.
Что я понял:
1. "Column" ключевое слово - использовать во внешних источниках нельзя, иначе ODBC драйвер стопориться (хотя в phpMyAdmin вылазит сообщение, но запрос все равно выполнить можно).
2. Во внешних источниках данных у таблиц "объектного" типа можно инсертить записи только по одной
3. Во внешних источниках данных у таблиц "необъектного" типа можно писать набор записей и единичные записи.
Для таблиц объектного типа думаю надо попробовать использовать stored-процедуру - но с этим разберусь уже позже, пока я рад что я смог выгрузить категории и они у меня на сайте появились - это уже успех :-)
Всем спасибо за терпение и участие.
Bernet @ Сегодня, 0:06
,
а что значит таблицы "объектного" и "необъектного" типа?
Vofka @ Сегодня, 9:23
,
У таблиц внешнего источника данных есть свойство "Тип данных таблицы внешнего источника данных", которое может быть равно "Объектные данные" и "Необъектные данные" типа. У таблиц объектного типа новый объект добавляется через функцию СоздатьОбъект() а у необъектного типа через МенеджерЗаписи или НаборЗаписей
! | http://pro1c.org.ua/index.php?act=announce&id=2: 8 |
Bernet @ Сегодня, 1:06
,
Если будете заполнять базу данных на разный языках перед заполнением текстовых данных понадобиться id языка.
Делел когда то выгрузку в следующем порядке.
Connection = Новый COMОбъект("ADODB.Connection");
Базовый_MySQL.ПодключитьсяКБазе(Connection);
Работа_С_Opencart.ОчиститьПрайсЛистИнтернетМагазина(Connection);
Работа_С_Opencart.ВыгрузитьГруппыАтрибутов(Connection);
Работа_С_Opencart.ВыгрузитьХарактеристикиНоменклатуры(Connection);
Работа_С_Opencart.ВыгрузитьПроизводителей(Connection);
Работа_С_Opencart.ВыгрузитьГруппы(Connection);
Работа_С_Opencart.ВыгрузитьГруппыФильтров(Connection);
Работа_С_Opencart.ВыгрузитьФильтрыГрупп(Connection);
Работа_С_Opencart.ВыгрузитьЭлементыВсехГрупп(Connection);
Connection.Close();
Bernet @ 03.01.19, 23:21
,
Требуется дропнуть колонку column в 1С и колонка перестанет попадать в запрос. В опенкарте эта колонка всегда будет 0 - если подходит, то можно жить с таким багом)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua