Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Всем привет и с Новым Годом, уважаемые знатоки!) Использую платформу 8.3.9
В целях повышения собственных знаний и накопления опыта решил поиграться с обменом с базой какого-то сайта, благо пока выходные и все бухают - есть время повысить собственный IQ. Дано: Есть локальный сайт, созданный на базе OpenCart у которого имеется БД на MySQL (phpMyAdmin). Есть конфигурация 1С УТП. Требуется: сделать связь между 1С и базой данных MySQL для обмена товарами, категориями, заказами. Из 1С в OpenCart должны идти категории и товары, а назад Заказы покупателей. Что пробовал и что пытаюсь сделать: почесав репу, решил попробовать поиграться с объектом "Внешние источники данных", т.к. раньше его не использовал, и захотелось получить немного опыта работы с ним. Нашел мануальчик как подключиться к базе и вроде как к базе подключиться удалось, добавились таблицы с базы скуля в дерево объектов 1С. Попробовал сделать простейший запрос на выборку категорий - супер, данные читаются - тут все ок. Проблема: Дальше захотел попробовать выгрузить номенклатуру и группы номенклатуры в товары и категории сайта и тут застрял. Немного не понимаю принципа как это можно сделать. В одних источниках пишут что с полученными таблицами можно работать как с обычными объектами 1С, например так:
{ВнешняяОбработка.ТестСоединенияСБазой.Форма.Форма.Форма(69)}: Ошибка при вызове метода контекста (Записать) КатегорияОбъект.Записать(); по причине: Ошибка внешней базы данных: ошибка при выполнении запроса по причине: Ошибка ODBC. SQLSTATE: 42000 Номер ошибки: 1064 Описание: [MySQL][ODBC 5.1 Driver][mysqld-5.6.38]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'column,`sort_order`,status,`date_added`,`date_modified`) VALUES(LAST_INSERT_ID('' at line 1
Я конечно пробовал убирать заполнение category_id - думал может оно должно автоматом назначаться СУБД, или скорее всего формат даты не такой - пробовал комментировать, но результат тот же - ошибка.
Далее нашел [необходимо зарегистрироваться для просмотра ссылки], в которой было написано что 1С умеет писать в базы напрямую через "Внешние источники данных" только через stored-процедуры (так называемые "Хранимые процедуры"), т.е. это скрипт SQL который создается в СУБД, и при добавлении источника данных подтягивается в 1С и далее просто вызывается как функция, но знаний в этой области мало - пробовал сделать процедуру на insert в таблицу, но она у меня даже сохраняться не хочет, видимо ошибка в синтаксисе.
Так вот вопрос - каким все таки способом можно писать в базы внешних источников, кто какие использовал и если есть возможность приведите пример - кода 1С или запроса на SQL как это должно выглядеть. Спасибо!
Сообщение отредактировал Bernet - 02.01.19, 10:18
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Сделал тестовую новую базу (а не базу OpenCart) - подключил её, и запись и чтение сработало, скорее всего я что-то не заполнял из обязательных полей или не в таком формате.... поковыряюсь. Но остается вопрос - как массово сделать запись в базу? т.е. не по одной записи писать, а например одним запросом/действием закинуть в базу перечень товаров/категорий
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3679.4
хакерок, вопрос в том, как сделать это через ВнешнийИсточникДанных.
Bernet, в виде рассуждения. Так как в регистры сведений, например, мы не можем добавить сразу несколько записей, то вероятно, с внешними источниками данных ситуация такая же.
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Vofka @ Сегодня, 14:28
, а как же набор записей?) в регистры можем, играясь с внешним иточником OpenCarta выявил что записи без проблем записываются в таблицы "Необъектного" типа, т.е. они похожи на регистры сведений - туда записать могу и одну и несколько записей (работаем через МенеджерЗаписи или НаборЗаписей), а вот в таблицу объектного типа oc_category (таблица с категориями в OpenCarte) не получается записать даже одиночную запись (похоже на создание документа СоздатьОбъект()). Ругается:
Цитата
по причине: Ошибка ODBC. SQLSTATE: 42000 Номер ошибки: 1064 Описание: [MySQL][ODBC 5.1 Driver][mysqld-5.6.38]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'column,`sort_order`,status,`date_added`,`date_modified`) VALUES(LAST_INSERT_ID('' at line 1
не могу понять на что ругается. Мой код для примера такой:
Вроде бы все обязательные поля заполняю, чего ругается не могу понять.
При этом - сделал отдельную базу данных - в ней создал таблицу "categories" с полями: "category_id", "name", "description". Подключил её в 1С как внешний источник, и такой код срабатывает без проблем:
хакерок @ Сегодня, 14:10
, мне не интересно чужое решение (разве что на исходники взглянуть, но платить 8700 грн как-то жирно ради простого "взглянуть"), тем более платное - я делаю это для себя, во-первых потому что мне это интересно, во-вторых, потому что хочу научиться работать с внешними источниками данных, в-третьих, сайт локальный чисто для опытов
Сообщение отредактировал Bernet - 03.01.19, 14:49
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3679.4
Цитата(Bernet @ 03.01.19, 14:35)
а как же набор записей?)
Есть у нас регистр сведений с измерениями Склад и Номенклатура. Как одним набором записей записать туда записи: Номенклатура 1 / Склад 1 Номенклатура 2 / Склад 1 Номенклатура 3 / Склад 1 ?
Для Каждого СтрокаТоваров Из Товары Цикл Запись = ТЗ_Записей.Добавить(); Запись.Номенклатура = СтрокаТоваров.Номенклатура; Запись.Склад = СтрокаТоваров.Склад; КонецЦикла;
ТЗ_Записей.Свернуть("Номенклатура,Склад");
НаборЗаписей.Загрузить(ТЗ_Записей);
НаборЗаписей.Записать(Истина);
Vofka @ Сегодня, 14:40
, На уровне SQL я понимаю что это должен быть запрос по такому шаблону:
типа такого - но как такой запрос выполнить с привязкой к "Внешнему источнику данных" не знаю, обычные 1С-ные запросы работают только на выборку, создание и апдейты вроде как через объекты таблиц надо делать (как приводил в примере выше), но почему ругается в одном случае (база OpenCarta), а в другом срабатывает (моя сампольная база) не могу понять
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Пользователи
Сообщений: 258
Из: Київ
Спасибо сказали: 12 раз
Рейтинг: 0
Bernet @ Сегодня, 15:39
, Тоже пробовал записывать данные с использованием класса ВнешниеИсточникиДанных похоже метод Записать() создаёт SQL запрос совместимый с MS SQL и MS Access. Будет время могу поделится основными частями записи в MySQL бесплатно.Bernet @ Сегодня, 15:39
,
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3679.4
Цитата(Bernet @ 03.01.19, 15:02)
вот так вроде можно
Точно работает? Я сейчас проверить не могу, но в набор записей можно добавлять только записи, соответствующие отбору набора записей. Если ваш пример отрабатывает, как ожидается, то пользоваться таким подходом в реальной жизни это мягко говоря (смайлик не к вам относится, а охарактеризовывает ситуацию), потому что код выше сначала все записи из таблицы читает НаборЗаписей.Прочитать();, а в момент НаборЗаписей.Записать(Истина); все записи из таблицы удаляет и потом вставляет кучу новых. То есть, что бы, условно говоря, добавить 3 записи в таблицу, в которой уже есть 1000 записей, мы должны прочитать 1000 записей, удалить 1000 записей, вставить 1003 записи.
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Vofka @ Сегодня, 17:15
, Да, код работает - проверил. Про отбор в курсе, просто в нашем случае однозначно установить отбор не получится, поэтому по такому принципу написал: получаем то что уже в таблице есть и добавляем новые записи, но тут есть момент - если попадется сочетание измерений по которым запись уже есть - выдаст ошибку, поэтому и сделал выгрузку в ТЗ, и сворачивание ТЗ, а затем уже окончательную таблицу пишу в РС. Знаю что это бред, но тем не менее такая возможность есть
Кстати, если допустим будет такая ситуация что надо писать набор записей в регистр и отбор сразу установить не получится, то что лучше - писать по одной записи через МенеджерЗаписи 1000 записей (соответственно 1000 запросов к базе) или лучше три запроса (выгрузка в ТЗ, сворачивание, запись в регистр) - условно один но тяжелый запрос?
хакерок @ Сегодня, 16:02
, если есть возможность приведите пример как Вы в базу внешнего источника добавляете записи. У меня на самодельной базе получается, а на базе OpenCarta нет, не знаю в чем особенность, но именно в таблицу oc_category добавлять не хочет
Сообщение отредактировал Bernet - 03.01.19, 17:23
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3679.4
Цитата(Bernet @ 03.01.19, 17:21)
Кстати, если допустим будет такая ситуация что надо писать набор записей в регистр и отбор сразу установить не получится, то что лучше - писать по одной записи через МенеджерЗаписи 1000 записей (соответственно 1000 запросов к базе) или лучше три запроса (выгрузка в ТЗ, сворачивание, запись в регистр)?
Я никогда не писал что-то через НаборЗаписей с заранее неизвестным отбором. Если отбор заранее неизвестен, я всегда использовал МенеджерЗаписи. Так как ваш способ сам по себе подразумевает удаление всех записей и вставку новых, то при возникновении подобной задачи, я бы сформировал какую-то таблицу или выборку с новыми записями, явно очистил бы таблицу и потом добавлял через МенеджерЗаписи. Что лучше не могу сказать, но можно провести такой эксперимент: создать регистр, заполнить его 1 000 000 записей, попробовать оба варианта и замерять время. Сейчас проверить не могу, но если вы это сделаете, мне тоже будет интересно узнать результат .
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Vofka @ Сегодня, 17:35
, Поиграюсь на досуге, сейчас борюсь с той долбанной записью в MySQL
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Кажется разобрался, решил попробовать воссоздать полностью эту таблицу "oc_category" в новой базе и при попытке создать колонку с именем "column" - MySQL ругнулся что это зарезервированное слово. Если посмотреть на текст ошибки то собственно с этого поля ошибка и начинается, так что подозреваю проблема именно в этом
Цитата
right syntax to use near 'column,`sort_order`
единственное что мне остается непонятным - это как разработчики OpenCarta смогли создать таблицу с такой колонкой - у меня в ручную такое воспроизвести не получается. Может надо базу SQL-запросом создавать,я хз. Теперь надо придумать как обойти это - удалить колонку я не могу, я хз как это повлияет на сайт, но и передать данные оно не дает, даже если я её не заполняю.
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0
Bernet @ Сегодня, 23:21
, и что в таком случае нужно делать? как же тогда работают готовые решения по обменам с OpenCart-ом? если найдете решение отпишитесь пожалуйста
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Sarm @ Сегодня, 23:30
, Знал бы прикуп..) буду искать, как работает это в других обменах я не знаю, может там не используется объект "Внешний источник данных"
Что ж, господа, решение найдено. При добавлении внешнего источника данных убрал галочку с поля "column" таблицы "oc_category" и вуаля - запись в базу идет без проблем. Уж без этого поля как-то обойдусь, его в админке если что вручную проставить можно будет.
Что я понял: 1. "Column" ключевое слово - использовать во внешних источниках нельзя, иначе ODBC драйвер стопориться (хотя в phpMyAdmin вылазит сообщение, но запрос все равно выполнить можно). 2. Во внешних источниках данных у таблиц "объектного" типа можно инсертить записи только по одной 3. Во внешних источниках данных у таблиц "необъектного" типа можно писать набор записей и единичные записи.
Для таблиц объектного типа думаю надо попробовать использовать stored-процедуру - но с этим разберусь уже позже, пока я рад что я смог выгрузить категории и они у меня на сайте появились - это уже успех :-)
Всем спасибо за терпение и участие.
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Местный
Сообщений: 858
Из: Місто щасливих людей
Спасибо сказали: 327 раз
Рейтинг: 0
Vofka @ Сегодня, 9:23
, У таблиц внешнего источника данных есть свойство "Тип данных таблицы внешнего источника данных", которое может быть равно "Объектные данные" и "Необъектные данные" типа. У таблиц объектного типа новый объект добавляется через функцию СоздатьОбъект() а у необъектного типа через МенеджерЗаписи или НаборЗаписей
Дописываю конфигурации на платформе 8.х. - Управление торговым предприятием для Украины - Управление производственным предприятием для Украины - Управление небольшой фирмой для Украины - Бухгалтерия для Украины; - Общепит для Украины - Ресторан (Рарус) - Розница
Группа: Пользователи
Сообщений: 3
Спасибо сказали: 0 раз
Рейтинг: 0
Bernet @ 03.01.19, 23:21
, Требуется дропнуть колонку column в 1С и колонка перестанет попадать в запрос. В опенкарте эта колонка всегда будет 0 - если подходит, то можно жить с таким багом)
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!