Yep Cart. Пишем интернет-магазин на http-сервисах OneScript

Программирование - Практика программирования

В статье описана демонстрационная конфигурация, реализующая простейший интернет магазин на http-сервисах OneScript, интегрированный с 1С:Предприятие.

Введение

Поскольку интернет-магазины прочно вошли в нашу жизнь и зачастую являются неотъемлемой частью информационной системы предприятия,  я подумал, что было бы интересно изучить возможности, которые может предоставить OneScript, в плане создания интернет-магазинов.

Дабы не превращать настоящую статью в книгу, а демонстрационную конфигурацию в “типовую”, на просторах интернет был найден простой демонстрационный проект, созданный на php, который реализует простейший интернет-магазин.

Таким образом, целью настоящей работы является создание простейшего интернет-магазина на OneScript, на основе существующего демонстрационного проекта, написанного на php.

О том, что из этого получилось – Вы можете прочитать ниже или посмотреть, нажав кнопку "Показать демо", которая находится справа.

Архитектура решения

Платформа web-приложения

В качестве платформы для реализации магазина, были выбраны http-сервисы OneScript. Для сокращения трудозатрат, в качестве основы для web-части использовалась Yep CMS с обновлениями, описанными здесь.

Внешний вид приложения

Внешний вид приложения оставлен практически без изменений и соответствует исходному проекту.

Хранение данных

В отличие от исходного проекта, где для хранения данных о товарах и ценах исользуется СУБД MySQL, в настоящем проекте, с целью упрощения развертываниия используется СУБД SQLite. Взаимодействие OneScript с СУБД SQLite осуществляется посредством библиотеки OneScript SQL.

Следует отметить, что вышеуказанная библиотека работает и с другими СУБД. Таким образом, при необходимости, хранение данных может быть организовано и в MySQL или другой СУБД, в зависимости от ваших потребностей.

Обмен с 1С:Предприятие

Обмен данными с платформой 1С:Предприятие осуществляется посредством http-сервисов, которые являются частью платформы. В качестве формата передаваемых данных используется JSON.

К сожалению, в настоящее время в OneScript отсутствуют встроенные функции (написанные на C#), аналогичные функциям ПрочитатьJSON и ЗаписатьJSON, платформы 1С:Предприятие. В наличии имеется только библиотека работы с JSON, которая представляет собой библиотеку 1С:JSON, портированную на OneScript. Поскольку вышеуказанная библиотека достаточно объемны и несколько громоздки для нашего простого случая, для конвертации объектов в формат JSON и обратно используется немного доработанная обработка JSON в 1С:8Х.

Детали реализации

Общие замечания

В части интернет-магазина, конфигурация содержит три подсистемы:

ДемоCart – подсистема, которая содержит объекты, которые находятся на стороне интернет-магазина и выполняются в OneScript.

ДемоCartНаСайте – подсистема, которая содержит объекты 1С:Предприятие, которые находятся на стороне интернет-магазина и выполняются в среде 1С:Предприятие. Эти объекты используются для эмуляции поведения интернет-магазина в среде 1С:Предприятие и используются для разработки и отладки.

ДемоCartОбъекты1С – подсистема, содержащая объекты 1С:Предприятие, которые являются аналогами объектов типовых конфигураций.

Объекты информационной системы

Данные объекты, являются аналогами объектов типовых конфигураций, которые находятся на стороне 1С:Предприятие.

Справочники:

Номенклатура – является аналогом одноименного справочника в 1С:Предприятие. Для простоты, фотография товара для сайта, а также расширение файла фото хранятся в этом справочнике.

КатегорииДляСайта – этот справочник не имеет прямого аналога в типовых конфигурациях, его аналогом может являться любой справочник, где хранится информация о категориях товаров для сайта.

Документы:

УстановкаЦенНоменклатуры – используется для установки/изменения цен номенклатуры как в 1С:Предприятие так и в интернет-магазине. Этот объект является аналогом одноименного документа в типовых конфигурациях. Для упрощения, в нашем случае не используются виды цен.

ЗаказКлиента – содержит информацию о заказах клиентов, поступивших из интернет-магазина. Не имеет прямого аналога в 1С:Предприятие. Возможным ближайшим аналогом может являться объект ЗаказПокупателя (УНФ).

РегистрыСведений:

ЦеныНоменклатуры – аналог одноименного регистра в типовых конфигурациях.

Обмен информацией о товарах и ценах

Сторона 1С:Предприятие

Поскольку непосредственное использование 1С:Предприятие как back-end для интернет-магазина может повлечь за собой значительную лицензионную нагрузку, а также снижение производительности информационной системы, все данные о товарах, категориях и ценах хранятся локально на сайте в реляционной СУБД, а обмен с интернет магазином осуществляется посредством http-сервисов.

Объекты 1С предприятие, ответственные за обмен с интернет-магазином, представлены на рисунке ниже:

В нашем случае, факт изменения номенклатуры, категорий товаров или цен, отслеживается соответствующими подписками на события. Подписки создают документы ОбновленияДляСайта, в которых содержится информация об измененных объектах. В дальнейшем, регламентное задание ВыполнитьОбменССайтом осуществляет вызов соответствующих http-сервисов на стороне интернет-магазина и передает им необходимую информацию.

Сторона интернет-магазина

Для эмуляции объектов интернет-магазина с целью разработки и отладки в конфигурации созданы объекты ИБ, отражающие информацию о товарах и ценах на сайте интернет-магазина. Данные объекты представлены на рисунке ниже:

Справочники:

НоменклатураНаСайте – соответствует справочнику Номенклатура в информационной системе.

КатегорииНаСайте – соответствует справочнику КатегорииДляСайта в информационнойСистеме.

Регистры сведений:

ЦеныНоменклатурыНаСайте – соответствует документу УстановкаЦенНоменклатуры в информационной системе.

Список объектов со стороны интернет-магазина, которые выполняются в OneScript – представлен на рисунке ниже:

HTTP-сервисы:

ec – служит для обновления информации о категориях товаров во внутренней БД сайта.

ep – служит для обновления информации о товарах во внутренней БД сайта.

epr – служит для обновления информации о ценах во внутренней БД сайта.

createdb – служебный http-сервис. Служит для первоначального создания внутренней БД сайта. Выполняется один раз.  

В продуктивной среде, объекты НоменклатураНаСайте, КатегорииНаСайте и ЦеныНоменклатурыНаСайте реализованы при помощи соответствующих объектов СУБД SQLite:

//<OneScript>
Соединение = СлужебныеФункции.НовыйСоединениеБД();
Запрос = Новый Запрос();
Запрос.УстановитьСоединение(Соединение);

Запрос.Текст = "CREATE TABLE product(
	|id nvarchar(50) PRIMARY KEY,
	|descr nvarchar(150),
	|name nvarchar(150),
	|code nvarchar(50),
	|category_id nvarchar(50),
	|fext nvarchar(4),
	|deleted boolean
	|);";

Запрос.ВыполнитьКоманду();

Запрос.Текст = "CREATE TABLE prices(
	|id nvarchar(50),
	|from_date datetime,
	|product_id nvarchar(50),
	|price decimal(10,2)
	|);";

Запрос.ВыполнитьКоманду();

Запрос.Текст = "CREATE TABLE category(
	|id nvarchar(50) PRIMARY KEY,
	|name nvarchar(150),
	|code nvarchar(50),
	|deleted boolean
	|);";

Запрос.ВыполнитьКоманду();
//<!OneScript>

Корзина товаров

Как и в исходном проекте, корзина товаров реализована на базе http-сессий и cookies. Со стороны OneScript, функционал работы с http-сессиями реализован в библиотеке HttpMeans. Эмуляция работы корзины в 1С:Предприятие, реализована при помощи константы ПараметрыСессии, а также общего модуля ЭмуляцияСессии.

Сайт интернет-магазина

Сайт интернет-магазина реализован на базе Yep CMS. Главная страница, каталог товаров, а также страница заказа реализованы соответствующими http-сервисами:

HTTP-сервисы:

index – отображение главной страницы сайта.

catalog – отображение каталога товаров

product – отображение страницы с детальной информацией о товаре

cart – отображение детальной информации о товарах в корзине.

order – отображение страницы формирования заказа  

Обмен информацией о заказах

В процессе формирования заказа, информация о покупателе, а также о выбранных товарах сохраняется в локальной БД сайта. Затем производится оповещение информационной системы 1С:Предприятие о том, что появился новый Заказ. Оповещение производится вызовом http-сервиса ОповещениеОЗаказе, который расположен на стороне 1С:Предприятие. Этот сервис инициирует выполнение фонового задания с процедурой, соответствующей регламентному заданию ПолучитьЗаказыССайта см. рисунок ниже:

Которое получает заказы, вызывая http-сервис go, расположенный на стороне интернет-магазина, создает документы ЗаказКлиента в информационной системе и создает документ ОбновлениеДляСайта, соответствующий удалению сформированных заказов в БД сайта. В дальнейшем, при выполнении регламентного задания ВыполнитьОбменССайтом, производится вызов http-сервиса do, который удаляет заказы из БД интернет-магазина.

В случае, если публикация ИБ в интернет по каким-либо причинам отсутствует, эту часть кода необходимо отключить. В этом случае прием заказов будет происходить по расписанию, регламентным заданием ПолучитьЗаказыССайта.

Заключение

По моим сугубо-личным ощущениям, основанным на таком-вот небольшом опыте, разработка интернет-магазина на OneScript, не является какой-то более сложной или трудоемкой процедурой, по сравнению с созданием магазина с аналогичным функционалом на php. Конечно есть некоторая доля избыточного кодирования, для обеспечения разработки и отладки в среде 1С:Предприятие, однако она относительно невелика и в основном связана с реализацией возможностей, которые есть в OneScript и нет в 1С:Предприятие и наоборот. Также, немного подпортило общее впечатление, несоответствие поведения функции Сред в OneScript и 1С:Предприятие, но я склонен отнести этот момент к разряду досадных случайностей, которые несомненно будут исправлены.

Тем не менее, по моему мнению, все вышеперечисленные неудобства с лихвой компенсируются знакомым языком программирования, а также понятной схемой взаимодействия с информационной системой на базе 1С:Предприятие, которая может быть легко адаптирована под нужды бизнеса с минимальными усилиями.

В остальном, объем кода, его читабельность и производительность вы легко можете сравнить самостоятельно, не полагаясь на чье-то мнение.

Скачать файлы

Наименование Файл Версия Размер
Yep Cart. Пишем интернет-магазин на http-сервисах OneScript:
.cf 6,10Mb
16.04.18
5
.cf 6,10Mb 5 Скачать

См. также

Комментарии
Сортировка: Древо
6. Lapitskiy 875 20.04.18 10:45 Сейчас в теме
Ничего не нашел в статье про безопасность скриптов и т.п.
jquery и прочие - регулярно выпускают обновления безопасности, а как обстоят дела с этим делом в OneScript ?
Когда используем локально - проблем как бы нет, но когда выходим в открытый интернет, то надо быть готовыми к угрозам.
7. blackhole321 704 20.04.18 10:56 Сейчас в теме
(6)
выпускают обновления безопасности, а как обстоят дела с этим делом в OneScript ?
Когда используем локально - проблем как бы нет, но когда выходим в открытый интернет, то надо быть готовыми к угрозам.

Полностью с Вами согласен.
Поскольку jquery является отдельной библиотекой и не является частью OneScript, ее обновление ложится на Ваши плечи. Собственно аналогичным образом обстоят дела и с другими продуктами (не OneScript). Конечно, некоторые включают автоматическое обновления, в некоторых, как источник используется CDN.
8. Maxisussr 24.05.18 16:35 Сейчас в теме
(0)
Не совсем понял, в проекте по сути есть 3 блока

1. Скрипты на php + web-сервер
2. СУБД MySQL/SQLLite
3. 1С (конфа + СУБД).

верно? и данные хранятся и в БД "1С" (назовем ее так, хотя там по сути конфа + своя СУБД, постгрес или скуль), и в MySQL/SQLLite для интернет-магазина для того, чтобы из php их читать.
где хранится "морда" сайта - все в п.1?
если так - то зачем тогда OneScript, что он делает?

если не так - просьба пояснить подробнее.
9. blackhole321 704 24.05.18 16:39 Сейчас в теме
(8) Не совсем правильно поняли.
Никаких скриптов php нет, в качестве php выступает OneScript.
Из проекта на php взяты html формы.
10. FreeArcher 53 25.05.18 07:09 Сейчас в теме
Мне кажется интересным был бы магазин, который забирал данные именно из 1С. Т.е. по сути 1С так же бы оставалась учетной системой в компании, а интернет-магазин был всего лишь frontend во внешний мир.
Я так понимаю, рано или поздно к этому придет проект или идею другая все же?
11. blackhole321 704 25.05.18 07:25 Сейчас в теме
(10)Если делать без промежуточной локальной базы на сайте то получаем следующие проблемы:
Количество клиентских лицензий 1с должно быть равно количеству одновременно работающих с базой пользователей. Если их зашло 100 надо 100 лицензий. Это будет дороговато :)
Если Ваш сайт подвергся ddos атаке подверглась атаке и Ваша учётная система, что как-то не очень.
Если Вы обновляете конфигурацию, платформу - сайт недоступен.
Если Вы не храните локальную копию данных, а получаете из 1с онлайн - Вы ограничены пропускной способностью канала сайт-1с.

В данном примере 1с и так является учётной системой, а onescript frontendом с промежуточной бд, в которой есть часть необходимых данных. И онлайн репликация между ними.

Поэтому по моему мнению лучше иметь локальную копию и репликацию
starik-2005; +1 Ответить
12. FreeArcher 53 25.05.18 09:17 Сейчас в теме
(11)
оличество клиентских лицензий 1с должно быть равно количеству одновременно работающих с базой пользователей. Если их зашло 100 надо 100 лицензий. Это будет дороговато :)

Про это я забыл. Это действительно проблема.

Остальные проблемы с приставкой "если".

(11)
В данном примере 1с и так является учётной системой, а onescript frontendом с промежуточной бд, в которой есть часть необходимых данных. И онлайн репликация между ними.

Данная схема классическая. Так работают все интернет-магазины, тот же Битрикс. И узким местом в этой схеме становится обмен. Т.к. структура данные в 1С и на сайте сильно отличается, бизнес-логика так же отличается. Из-за этого не получается удобной работы сайт->1C->сайт. Т.е. на выходе все равно 2 разные системы и посредник.

Мне кажется, если решить первую проблему с лицензиями, то схема с 1С в качестве БД и логики будет интересной. Сайт и 1С могут располагаться на одном физическом сервере. Проблему изоляции можно решить полным РИБ с базой, которая будет в офисе, если заворачиваться на безопасность.
13. blackhole321 704 25.05.18 10:48 Сейчас в теме
(12)
И узким местом в этой схеме становится обмен. Т.к. структура данные в 1С и на сайте сильно отличается, бизнес-логика так же отличается.

Это потому, что используемые системы изначально ничего не знают об 1С и по большей части ориентированы на создание блогов.
В данном случае у Вас есть все возможности реализовать бизнес-логику и данные таким образом, чтобы они максимально соответствовали потребностям. Соответственно программирование и поддержка резко упрощаются. Данная конфигурация содержит по моему 4 или 5 таблиц. В принципе не ахти как много.

Сайт и 1С могут располагаться на одном физическом сервере.

И иметь один сервер СУБД :) и тогда проблемы производительности станут общими и для сайта и для учетной системы.

Проблему изоляции можно решить полным РИБ с базой

Опять тот же самый обмен :), xml-файлы etc.
Не надо кикаких РИБ. В демо-конфигурации реализован обмен в реальном времени с использованием http-сервисов 1С и json.

И к тому-же Вы не сможете разместить сайт вовне, скажем на хостинге.
15. Prometeus2011 70 27.05.18 11:44 Сейчас в теме
Ну вот проталкивают этот OneScript прямо очень агрессивно. Что не обзор, то обязательно что-то на этой платформе.
Допустим, вы директор по развитию предприятия. У вас есть задача: сделать портал с каким-нибудь сервисом.
Выбор путей решения:
1. Нанять толкового net. программиста, чтобы запилить этот портал на технологии, на которой весь мир это делает + куча всяких жирных плюшек от Майки (кучу библиотек, отчеты красивые всякие, огромный коммьюнити и т.д.). Причем, net. программисты стоят сейчас даже дешевле 1сников (по понятным и оправданным, кстати, причинам).
2. Нанять аутсорсера, который сделает все это на web (в случае интернет-магазина).
3. Использовать среду разработки третьего поколения, которая тащит за собой кучу dependencies, интерпретирует часть функционала в net., часть - в 1с, скорость работы безопасность тоже не понятны. И все равно под поддержку продукта (по-нормальному) тоже придется брать отдельного 1с программиста, который еще разбирается в смежных областях, т.к. куча сопряжений технологий, которые не известно как будут работать в разных условиях и их надо постоянно контролировать и решать возникающие проблемы. Такой спец дорогой очень.
Ну я-бы не рискнул в это окунаться.
1с - платформа для разработки учетных систем! Все, что не связано с учетом - у нее получается плохо (медленно и технически не красиво).
Ну и бабло 1сники любят, очень любят. Отсюда все в лицензиях. Мы-же ведь все честные люди.
16. blackhole321 704 27.05.18 12:42 Сейчас в теме
(15)
Ну вот проталкивают этот OneScript прямо очень агрессивно

Да никто его не проталкивает :) Мне например, неудобно писать большие статьи, поэтому получается часто и по немногу.
Пункты 1,2: Все дело в том, что портал как и интернет-магазин по большей части не существуют сами по себе, а как правило являются частью информационной системы предприятия. В нашей стране так исторически сложилось, что основой этой самой информационной системы как правило является 1С:Предприятие. Это ни хорошо и не плохо, это данность. Поэтому все эти порталы и интернет-магазины должны взаимодействовать с 1С, причем порой, достаточно тесно. И здесь встают вопросы, связанные с интеграцией этих систем, а также их доработкой т.к. все течет, все изменяется. Нанять программиста . Net как и аутсорсера php конечно можно, однако у Вас возникнут дополнительные накладные расходы на коммуникации между специалистами. К примеру, Вам нужно будет обяснять условному аутсорсеру, что такое цены номенклатуры, почему иногда их лучше выгрузить заранее, оговорить форматы, составить ТЗ etc. И так каждый раз даже при небольшх изменениях. И неизвестно, что в итоге дешевле и эффективнее.
Пункт 3.
Скорость и безопасность Вы можете протестировать. Если что-то непонятно и есть конкретные вопросы - welcome.

1с - платформа для разработки учетных систем! Все, что не связано с учетом - у нее получается плохо (медленно и технически не красиво).

Я и не призываю делать сайты на 1с :) для этого можно задействовать OneScript
17. starik-2005 1384 27.05.18 13:59 Сейчас в теме
(16)
Я и не призываю делать сайты на 1с :) для этого можно задействовать OneScript
Правильно ли я понимаю, что ванскрипт - это отдельная программа-интерпретатор кода 1С и для нее есть к апачу либа?
18. blackhole321 704 27.05.18 14:25 Сейчас в теме
(17)
Ванскрипт - это интерпретатор и среда выполнения, написанная на c#. Язык OneScript практически идентичен языку 1с:Предприятие синтаксически, что позволяет выполнять код 1С в ванскрипте методом ctrl+c ctrl + v. В данном конкретном случае используется библиотека aspnethandler. Это обычный обработчик web - запросов asp.net, который использует класс интерпретатора ванскрипт для генерации ответа. Фактически это обычный asp.net сайт, который может выполнять текстовые файлы, написанные на языке 1с. Конечно, Вы можете писать свои библиотеки на c# и использовать их внутри интерпретатора. Как к примеру используете в 1с com объекты или внешние компоненты, только более гибко. Работает все это на windows под iis и на linux под апачем или xsp. В данном случае, среда 1с:предприятие используется как среда разработки, в которой Вы пишете и отлаживается код. Потом выгружает конфигурацию в файлы и формируете само web-приложение (сайт).
Ссылки по теме:
Что такое ванскрипт:
Http://onescript.io
Публикации по теме http сервисов можете найти у меня в профиле.
19. blackhole321 704 27.05.18 14:29 Сейчас в теме
(18)Прошу меня извинить, правильная ссылка:
http://oscript.io
20. starik-2005 1384 27.05.18 14:34 Сейчас в теме
(19) почитал - интересная тема. Надеюсь, 1С возьмет у вас синтаксис для работы с регулярными выражениями, а то уж больно без них местами не просто )))
21. blackhole321 704 27.05.18 14:39 Сейчас в теме
(20)Ну это штатный синтаксис и классы ms. Если это проблема - есть com объекты или написать обёртку на native api если для linux
22. baton_pk 370 27.05.18 19:44 Сейчас в теме
(15)
Допустим, вы директор по развитию предприятия. У вас есть задача: сделать портал с каким-нибудь сервисом.

допустим, вы простой смертный одинэсник, который хочет упорядочить бардак в своей работе, и у вас есть задача: админка для типовых рутинных задач. В большее односкрипт пока не рвётся.
23. blackhole321 704 28.05.18 08:17 Сейчас в теме
(22)Ну почему не рвется? Если инструмент нормальный - почему бы не создать портал или сайт?
27. baton_pk 370 28.05.18 11:04 Сейчас в теме
(23)
не создать портал или сайт?

безопасность и быстродействие - две вещи, до сих пор окутанные туманом. Внутренний - да, торчащий наружу - уже со скрипом.
28. blackhole321 704 28.05.18 11:29 Сейчас в теме
(27) А что конкретно окутано туманом, по сравнению с сайтом, написанном на c# по классической технологии ASP.NET? Собственно это он и есть.
И что не так с производительностью? На запросах типа "Hello world", как показали мои замеры - производительность чуть лучше, чем у php, поставленном по умолчанию. И это как-бы не секрет.
30. baton_pk 370 28.05.18 11:53 Сейчас в теме
(28)
На запросах типа "Hello world"

запросы типа хеллоуворлд не показатель совсем. Кэширование, работа под нагрузкой - много вещей, где можно просесть.
32. blackhole321 704 28.05.18 12:00 Сейчас в теме
(30)Полностью согласен, можно. Можно просесть и на php и на c# и на java. Я привел пример, как отправную точку. Иначе нет смысла этим заниматься. По моим первичным оценкам - вполне годно, по крайней мере для сайта или портала - не уровня facebook или yandex. К тому-же есть горизонтальное масштабирование (но это история уже для среднего бизнеса).
34. starik-2005 1384 28.05.18 12:56 Сейчас в теме
(32) горизонтальное масштабирование везде кроме 1С есть )))
35. blackhole321 704 28.05.18 13:21 Сейчас в теме
(34)А в 1С рабочие сервера это не оно?
36. starik-2005 1384 28.05.18 13:34 Сейчас в теме
(35) не совсем оно, ибо основной элемент нагрузки - СУБД. Количество записей в СУБД при этом ограничено. В практике разработки высоконагруженных решений существует два вида масштабирования: вертикальный и горизонтальный шардинг для данных, когда данные разбиваются на части и хранятся в разных узлах СУБД. Также есть кешеры - мемкеш, рэдис, тарантул и просие NoSQL-inmemory-решения, позволяющие создать промежуточную прослойку между реляционной СУБД и объектной моделью данных.

Рабочие сервера 1С - это механизм избыточности, служащий для повышения стабильности работы, но не ее скорости, т.к. для синхронизации блокировок между рабочими серверами требуются некоторые ресурсы, а ожидание, как известно, чаще всего возникает на этих самых блокировках, Таким образом нередки случаи, когда увеличение количества серверов в кластере снижает производительность, ибо возникает проблема самого слабого звена...
24. TODD22 17 28.05.18 08:24 Сейчас в теме
(22)
В большее односкрипт пока не рвётся.

А статья вроде как говорит об обратном :)
25. blackhole321 704 28.05.18 08:50 Сейчас в теме
(24)Ну статья - это отражение моего личного видения области применения OneScript. У Сергея может быть другое видение. Это нормально. Сила в многообразии :)
26. baton_pk 370 28.05.18 11:02 Сейчас в теме
(24) статья говорит "смотри, как я умею!". Если приору занизить и поставить туда трубу широченную, это не значит, что автоваз рвётся в спорткары :)
Энтузиазм - это здорово, но к моему великому сожалению энтузиастов пока слишком мало, чтобы говорит о чём-то.
29. blackhole321 704 28.05.18 11:48 Сейчас в теме
(26)На мой взгляд аналогия не совсем корректная. Тогда уж мы взяли деталь от "АвтоВАЗа" и использовали в другом автомобиле. Если деталь нормальная, то почему бы и нет? Кстати такая практика в автомобилестроении достаточно распространена.
31. baton_pk 370 28.05.18 11:58 Сейчас в теме
(29)
то почему бы и нет?

да я-то только за.
33. blackhole321 704 28.05.18 12:02 Сейчас в теме
Оставьте свое сообщение