УДК 28.17.19
ИНТЕГРАЦИЯ ИНТЕРНЕТ-МАГАЗИНА И СИСТЕМЫ УПРАВЛЕНИЯ ПРЕДПРИЯТИЕМ 1С ПРИ ПОМОЩИ МОДУЛЕЙ ЕВРИПТЕРИД
© О.В. Крючин, К.Р. Хабирова, Е.В. Вязовова
Ключевые слова: интернет-магазины; система управления предприятием; протокол передачи данных.
Описана технология интеграции системы управления предприятием 1С и интернет-магазинов, базирующихся на различных движках. Приводится подробное описание архитектуры системы и особенности ее технической реализации.
ВВЕДЕНИЕ
Традиционно в России управление торговым предприятием (магазин и т. п.) в большинстве случаев осуществляется при помощи программ 1С, занимающих в настоящее время более 75 % рынка. В то же время стремительно возрастает значение интернет-магазинов, число которых пока уступает аналогичному на Западе, но постепенно приближается к нему. Таким образом, интеграция интернет-магазинов и 1С приобретает все большую актуальность. Программистами 1С создано несколько решений, но все они требуют существенной доработки.
Исходя из вышесказанного, целью данной работы является разработка системы, позволяющей интегрировать 1С версии 7 «Торговля и склад» с интернет-магазинами, основанными на движке EuripterideShop.
- web (написанный на PHP интернет-магазин).
Схема взаимодействия. При изменении базы 1С пользователем (vender) происходит вызов 1С-функций, которые в свою очередь вызывают функции dll, вносящие изменения в СУБД. При запросах пользователя (client) веб-компонент (интернет-магазин) обращается к СУБД (рис. 2).
Программно-аппаратная архитектура. Структура распределения компонентов по аппаратным ресурсам показана на рис. 3. Как можно видеть, система состоит из трех частей (подсистем) - Vendor, Server и Client (из которых первые две входят в состав дистрибутива).
Компоненты системы Vender работают по следующему алгоритму:
1) пользователь изменяет контент в базе 1С;
2) 1С обращается к набору dll;
3) dll обращается к удаленной СУБД.
СТРУКТУРА СИСТЕМЫ
ПОДСИСТЕМА VENDOR
Компоненты системы. Разрабатываемая система представляет собой совокупность нескольких компонентов, архитектура которых представлена на рис. 1:
- 1С (произведено изменение конфигурации и добавлено несколько внешних обработок);
- dll (содержит вызываемые из 1С функции работающие с СУБД);
- mysql (СУБД, содержащую контент, необходимый для интернет-магазина);
Механизм. Для реализации подсистемы Vendor в конфигурацию 1С внесены следующие изменения:
1) изменен справочник «Номенклатура» - изменен код элемента на числовой и добавлены реквизиты «Картинка» и «КартинкаБольшая»;
2) изменена форма элемента - добавлены элементы отображения картинок;
3) изменен модуль элемента - добавлены процедуры «ВыборКартинки» и «ВыборБольшойКартинки», в процедуру ПриОткрытии вставлены открытия изображении, в процедуру ПриЗаписи - вызов процедуры евпДобавлениеНоменклатурыИМ;
4) изменена форма группы - добавлен элемент отображения картинок;
5) изменен модуль группы - добавлена процедура ВыборКартинки, в процедуру ПриОткрытии вставлены
Рис. 1. Диаграмма компонентов системы
client
Рис. 2. Схема взаимодействия
Рис. 3. Схема разделения компонентов по машинам
код открытия изображении, а в процедуру ПриЗаписи -вызов процедуры евпДобавлениеГруппы Номенклату-рыИМ (табл. 1). Глобальный модуль содержит ряд функций (s-методов), обращающихся к dll и вызывающих оттуда d-методы. S-методы предназначены для внесения изменений в СУБД при обновлении справочников 1С. Соответственно, вызываются они именно из модулей справочников (также эти функции вызываются при синхронизации базы).
Логика выгрузки. Для выгрузки номенклатуры в DLL предназначены два метода:
1) евпСинхронизацияНоменклатуры;
2) евпВыгрузкаНоменклатуры.
Первый из этих методов добавляет в СУБД данные из справочников, а второй очищает соответствующие таблицы в базе и заносит туда новые данные (т. е. разница в этих методах заключается в том, что первый не удаляет старые данные из СУБД). Таким образом, первый метод последовательно для каждой строки из справочника номенклатур вызывает метод евпДобавле-ниеНоменклатуры / евпДобавлениеГруппыНоменкла-туры (в зависимости от того, является ли данный элемент справочника группой). Метод евпВыгрузкаНо-менклатуры осуществляет очищение таблиц, вызывает d-метод clearNomenclature СУБД, а затем метод евп-СинхронизацияНоменклатуры.
Для выгрузки контрагентов предназначен метод ев-пВыгрузкаКонтрагентов, который очищает соответствующие таблицы в СУБД, а затем последовательно для каждой строки справочников Контрагентов, Юридических Лиц, Физических Лиц, Банковских Счетов и Банков вызывает соответствующую функцию добавления в СУБД.
Чтение заказов. При загрузке заказов из интернет-магазина в 1С необходимо произвести чтение некоторых служебных справочников, в частности банков. Чтение производится следующим образом:
- последовательно вызывается каждая строчка из соответствующей таблицы в СУБД;
- происходит проверка в справочнике банков на наличие записи с соответствующем кодом (БИК);
- в случае отсутствия соответствующей записи в 1С, информация о банке заносится в справочник.
Загрузка контрагентов в общем виде может быть представлена как чтение данных четырех типов: банковских счетов, юридических лиц, физических лиц и собственно контрагентов. Логика загрузки похожа на алгоритм чтения банков с одним исключением: в случае если при загрузке строки из СУБД оказывается, что запись с таким же кодом имеется в справочнике, происходит проверка на эквивалентность записей (эквивалентность в данном случае не подразумевает полного соответствия записей, записи считаются эквивалентными при идентичности нескольких основных реквизитов - для контрагента это код, наименование и т. д., второстепенные записи могут различаться - для контрагентов это e-mail и т. д.). Если записи не эквивалентны, то запись справочника переносится в конец (вычисляется максимальное значение кода, и значение на 1 больше максимального присваивается элементу), а на его место записывается элемент из СУБД.
Более логичным может показаться алгоритм, в котором элемент из СУБД записывается в конец справочника, а элемент, находившийся в справочнике до этого, остается неизменным. Этот алгоритм был бы более быстр по сравнению с текущим. Выбор используемого алгоритма обусловлен следующей причиной: элементы справочников 1С связаны, а для элементов таблиц СУБД этого утверждать нельзя. Это значит, что при изменении кода элемента все ссылки изменяются автоматически, т. е. по-прежнему указывают на этот элемент. Поскольку реализация интернет-магазина произвольна, перемещать элементы в таблицах может быть затруднительно, и для упрощения синхронизации выбран алгоритм перемещения элементов справочника.
Алгоритм чтения заказов состоит из двух частей -чтения данных и создания документа. Первая часть -загрузка данных из внешней компоненты в таблицу значений содержит несколько шагов:
- создается таблица значений с полями: контрагент; номенклатура, цена, количество;
Таблица 1
Список методов подсистемы Vendor (s-методов)
Название Параметры Назначение
евnИнициализация хост сервера с БД ^р-адрес), порт, имя БД, имя пользователя (логин), пароль, префикс таблиц, постфикс таблиц загрузка внешней компоненты и вызов d-метода, осуществляющего подключение к СУБД
евnДобавлениеГруn-пьНоменклатуры код, наименование, код родительской группы, комментарий добавление или обновление группы номенклатуры с заданным кодом
евnДобавлениеГруn- тіНоменклатрь- Им код, наименование, код родительской группы, комментарий, имя фотографии расширенное добавление или обновление группы номенклатуры с заданным кодом
евnДобавленuеНо- менклатуры код, наименование, код родительской группы, комментарий, полное наименование, артикул, остаток (обычно количество экземпляров на складе) добавление или обновление номенклатуры с заданным кодом
евnДобавлениеНо- менклатурыИм код, наименование, код родительской группы, комментарий, полное наименование, артикул, имя фотографии, имя большой фотографии расширенное добавление или обновление номенклатуры с заданным кодом
евnДобавленuеЦены код номенклатуры, тип, процент, код валюты, значение добавление или обновление цены номенклатуры с заданным кодом
евnДобавлениеTи- тЦены код, наименование, вычисляемость (1 - рассчитывается, 0 -задается), код базового типа (если выч=1), процент, код валюты, НДС, НП, комментарий добавление или обновление типа цены с заданным кодом
євп УдалениеНо-менклатуры код удаление выбранной номенклатуры
евnДобавлениеЮри- дическогоЛица код, наименование, ИИН, ОКПО, юридический адрес, фактический адрес, телефон, полное наименование, комментарий добавление или обновление юридического лица с выбранным кодом
евnДобавлениеБан-ковскогоС чета код, наименование (тип), код банка, значение счета, код владельца добавление или обновление банковского счета с выбранным кодом
етДобавлениеБанка код, наименование, кор. счет добавление или обновление банка с выбранным кодом
етДобавлениеКон- трагента код, наименование, тип (1 - юр.лицо, 2 - физ.лицо), код юр.лица/физ.лица, код банковского счета, электронная почта, комментарий добавление или обновление контрагента с выбранным кодом
евnУдалениеЭле- мента структура, содержащая информацию о выбранном элементе установка для выбранного элемента пометки на удаление
евnВосстановле- ниеЭлемента структура, содержащая информацию о выбранном элементе снятие для выбранного элемента пометки на удаление
- последовательно считываются все данные о заказах, взятые из СУБД;
- эти данные заносятся в таблицу значений;
- после завершения загрузки таблица значений сортируется по реквизиту «Контрагент».
Вторая часть - создание документа и заполнение его табличной части - также содержит несколько шагов:
- последовательно берутся все строки таблицы значений, соответствующие конкретному контрагенту;
- для этих данных создается документ «Неподтвержденная заявка»;
- выбранный контрагент заносится в шапку;
- в шапку заносятся текущая фирма и валюта;
- свойству документа ВидОперации присваивается значение «Перечисление.ВидыОперацийЗаявок.Не-подтвержденная»;
- вызывается функция глобального модуля глНазваниеДокументаВЖурнале и в качестве параметра передается объект документа;
- данные о номенклатуре, цене и количестве в табличную часть.
Политика. Для подключения к СУБД предназначена внешняя обработка eurip_db_connect.ert, которая содержит поля для ввода реквизитов подключения:
хост (ip-адрес СУБД-сервера), порт (обычно 3306), имя пользователя (логин), пароль, имя схемы (базы данных), префикс таблиц, постфикс таблиц.
После ввода реквизитов пользователь нажимает кнопку подтверждения, и вызывается s-метод етИни-циализация. Таким образом, загрузка внешней компоненты происходит именно на требование пользователя подключиться к СУБД (вызов метода евnИнициализа-ция происходит в предопределенном методе глобального модуля ПриОткрытии, а реквизиты подключения прописаны в ядре).
СИНХРОНИЗАЦИЯ
Назначение. Синхронизация подсистем Server и Vender осуществляет две важные задачи:
1) поддерживает актуальность товаров в СУБД; несмотря на то, что при действиях пользователя в 1С изменения вносятся в СУБД в режиме реального времени, синхронизация необходима в силу того, что соединение 1С с СУБД может быть не постоянным; в результате на какой-то момент обнаруживаются расхождения в справочниках 1С и таблицах СУБД; синхронизация решает эту проблему;
2) обеспечивает занесение информации о заказах в 1С.
Для обеспечения постоянной синхронизации с определенным периодом должны вызываться выгрузка номенклатуры и загрузка заказов.
Механизм. Для обеспечения синхронизации предназначена внешняя обработка euripsinhro.ert, которая содержит поля для ввода периодов выгрузки номенклатуры и загрузки заказов, а также поля для ввода интервалов запаздывания. При инициализации системы выгрузка номенклатуры и загрузка заказов будет произведена мгновенно после подтверждения установки значения и истечении интервалов задержки. Таким образом, если установить для выгрузки номенклатуры интервал задержки 0, период 10, а для загрузки заказов - 5 и 10, то номенклатура впервые будет выгружена сразу, второй раз - через 10 мин., третий - через 20 и т. д., а заказы будут загружены через 5, 15, 25, 35, ... мин.)
Алгоритм. Периодический вызов какой-либо функции в 1С обеспечивается процедурой Обработ-каОжидания. Эта функция принимает в качестве первого аргумента имя процедуры, которая будет вызываться периодически, а в качестве второго - интервал вызова. Таким образом, 1С позволяет вызывать в периоде только одну функцию. Для обеспечения вызова двух был разработан следующий алгоритм:
1) вычисляется НОД периодов выгрузки номенклатуры и загрузки заказов;
2) вычисленный НОД устанавливается в качестве интервала вызова;
3) в качестве функции вызова устанавливается функция проверки (евпИтерацияСинхронизации);
4) в s-методы евпИтерацияСинхронизации путем вычисления остатка деления временного отрезка, прошедшего с момента запуска синхронизации до настоящего момента, на период синхронизации производится проверка, какое действие должно быть выполнено на данной итерации (выгрузка номенклатуры или загрузка заказов); т. е. если с момента запуска синхронизации прошло 2 часа, а периоды равны 15 и 25 минутам, то вычисляются 120 mod 15 = 0, 120 mod 25 = 20; таким образом, на данной итерации вызывается выгрузка заказов.
5) при изменении параметров синхронизации производится перезапуск синхронизации;
6) синхронизация завершается при закрытии 1С.
КОМПОНЕНТЫ dll
Набор компонентов dll представляет собой совокупность трех файлов:
1) euripvk.dll - внешняя компонента, содержит d-методы, написанные на языке Delphi;
2) eurip.dll - внутренняя компонента, содержит с-методы, написанные на языке C/C++;
3) libmysql.dll - компонента работы с СУБД.
Внешняя компонента. Внешняя компонента
EuripVK.dll предназначена для взаимодействия 1C с компонентой ядра. Она реализует функции, которые вызывают с-методы (функции ядра).
EuripVK.dll написан на языке Delphi и состоит из 4 модулей: vkobject.pas, uBalloon.pas, addInLib.pas,
addInObj.pas.
В модуле vkobject реализованы функции, которые в качестве методов и свойств объекта Euripteride вызываются из 1C. В классе Tvkobject реализованы методы prop1, prop2,.. (для свойств) и meth1, meth2, ... (для методов). Все эти методы являются функциями, при-
нимающими аргумент типа TMode (перечисление) и возвращающими строку.
Все d-методы prop и meth проверяют значение передаваемого параметра mode и в зависимости от этого выполняют определенные действия:
- если значение параметра mode равно m_rus_na-me, то возвращается русское название s-метода (или s-свойства);
- если значение параметра mode равно m_en_na-me, возвращается английское название;
- если значение параметра mode равно m_n_pa-rams, то в член класса g_NParams заносится число аргументов метода (имеет смысл только для s-методов);
- если значение параметра mode равно m_get_value, то выполняется c-метод (который должен вызываться на возвращение значения s-свойства) и в член класса gValue заносится результат выполнения (имеет смысл только для s-свойств);
- если значение параметра mode равно msetvalue, то выполняется c-метод (который должен вызываться на установки значения s-свойства) (имеет смысл только для s-свойств);
- если значение параметра mode равно mexecute, то выполняется c-метод, который должен вызываться на вызов s-метода; необходимые аргументы возвращаются функциями:
- GetParamAsInteger(<номер аргумента>) для целых аргументов;
- GetParamAsFloat(<номер аргумента>) для вещественных аргументов;
- GetParamAsString(<номер аргумента>) для строковых аргументов.
Большинство d-методов prop предназначены только для возвращения информации в 1C.
Все необходимые с-функции загружаются неявным образом (статически) из библиотеки eurip.dll (external 'eurip.dll'), а аргументы передаются с использованием порядка cdecl.
Файл addInObj. Файл addInObj предназначен для формирования объекта, загружаемого в 1C. Он имеет следующие характеристики:
- в константе c_PropCount записано количество d-методов, соответствующих свойствам;
- тип TProperties представляет собой перечисление всех d-методов, соответствующих s-свойствам;
- в константе cMethCount записано количество d-методов, соответствующих s-методам;
- тип TMethods предствляет собой перечисление всех d-методов, соответствующих s-методам;
- в методе GetPropVal класса AddInObject производится проверка аргумента lPropNum на соответствие типу и вызывается соответствующий ему d-метод-prop объекта vk_object с аргументом m_get_value;
- в методе SetPropVal класса AddInObject производится проверка аргумента lPropNum на соответствие типу и вызывается соответствующий ему d-метод-prop объекта vk object с аргументом m set value;
- в методе CallAsFunc класса AddInObject производится проверка аргумента lMethodNum на соответствие типу и вызывается соответствующий ему d-метод-meth объекта vk_object с аргументом m_execute;
- в методе GetNParams класса AddInObject производится проверка аргумента lMethodNum на соответствие типу и вызывается соответствующий ему d-метод-meth объекта vk_object с аргументом m_n_params;
- в методе FindProp класса AddInObject производится проверка аргумента bstrPropName, для этого последовательно вызываются prop-методы объекта vk_object, результат сверяется с bstrPropName; когда необходимый d-метод находится, то его номер зано-
сится в локальную переменную (затем возвращаемую по ссылке; неважно);
- в методе FindMethod производится проверка аргумента bstrMethodName (аналогично методу FindProp за исключением того, что вместо prop-методов используются meth) (табл. 2, 3).
Таблица 2
Методы Prop внешней компоненты
Английское название Русское название Назначение
counterpartId КодКонтрагента возвращает код текущего контрагента
counterpartName ИмяКонтрагента возвращает имя текущего контрагента
counterpartFullName ПолноеИмяКонтрагента возвращает полное имя текущего контрагента
counterpartType TиnКонтрагента Возвращает тип текущего контрагента (1 - юр.лицо, 2 - физ.лицо)
counterpartBankNumber БанковскийСчетКонтрагента возвращает банковский счет текущего контрагента
counterpartLegalPerson ЮрЛицоКонтрагента возвращает код юридического лица текущего контрагента
counterpartEmail ЭлАдресКонтрагента возвращает e-mail текущего контрагента
counterpartInn ИннКонтрагента возвращает ИНН текущего контрагента
counterpartOkpo ОкноКонтрагента возвращает ОКПО текущего контрагента
counterpartFormAddres s ЮрАдрессКонтрагента возвращает юридический адрес текущего контрагента
counterpartFactAddress ФактАдресКонтрагента возвращает фактический адрес текущего контрагента
counterpartTelephone TелефонКонтрагента возвращает телефон текущего контрагента
counterpartComment КомментарийКонтрагента возвращает комментарий, соответствующий текущему контрагенту
counterpartLPC ЮлкКонтрагента возвращает комментарий, соответствующий юр. лицу текущего контрагента
maxCounterpartLegalP ersonId МаксимальныйКодЮрЛица возвращает максимальный код контрагента
counterpartCountry ГосударствоКонтрагента возвращает государство контрагента
counterpartRegion РегионКонтрагента возвращает регион контрагента
counterpartCity ГородКонтрагента возвращает город контрагента
counterpartZip ПочтовыйИндексКонтрагента возвращает почтовый индекс контрагента
counterpartName1 ВтороеИмяКонтрагента возвращает второе имя контрагента
newCounterparts НовыйКонтрагент производит проверку наличия следующей строки в списке контрагентов. Возвращает 1 - если есть, 0 - если пет
newBankNumbers НовыйБанковскийСчет производит проверку наличия следующей строки в списке банковских счетов. Возвращает 1 - если есть, 0 - если пет
bankNumberId КодБанковскогоС чета возвращает код текущего банковского счета
bankNumberName НаименованиеБанковскогоСче- та возвращает название (тип) текущего банковского счета
bankNumberValue ЗначениеБанковскогоСчета возвращает значение текущего банковского счета (расчетный счет)
bankNumberC ХранилищеБанковскогоСчета возвращает бапк, в котором открыт текущий счет
bankNumberOwner ВладелецБанковскогоСчета возвращает контрагента, которому принадлежит текущий банковский счет
orderId КодЗаказа возвращает код текущего заказа
orderCounterpart КонтрагентЗаказа возвращает код контрагента, сделавшего текущий заказ
orderNomenclature НоменклатураЗаказа возвращает номенклатуру, заказанную текущим заказом
orderCount КоличествоЭкземтяровЗаказа возвращает количество экземпляров номенклатуры, заказанной текущим заказом
orderPrice ЦенаЗаказа возвращает цепу номенклатуры, заказанной текущим заказом
isNewOrder НовыйЗаказ производит проверку наличия следующей строки в списке заказов. Возвращает 1 - если есть, 0 - если пет
bankId КодБанка возвращает код текущего бапка
bankName НаименованиеБанка возвращает название текущего бапка
bankKNumber КорСчетБанка возвращает кор. счет текущего бапка
newBanks НовыйБанк производит проверку наличия следующей строки в списке банков. Возвращает 1 - если есть, 0 - если пет
selfFirmId КодСвоейФирмы возвращает/устанавливает код собственной фирмы
valute КодВалюты возвращает/устанавливает код валюты
timerProcNumber НомерПроцедурь^аймера возвращает индекс процедуры, которая должна вызываться па текущий момепт
timerPeriod ПериодTаймера возвращает период таймера
86З
Таблица З
D-методы, реализующие s-методы
Английское название Русское название Параметры Назначение
init Инициализация Ip-адрес, порт, имя базы, имя пользователя, пароль, префикс таблиц, постфикс таблиц подключение к СУБД
updateNomenclatureGroup ОбновлениеГруты- Номенклатуры Код, имя, код родительской группы, комментарий создание или изменение группы номенклатуры
updateNomenclatureGrou pIm ОбновлениеГруты- НоменклатурыИ Код, имя, код родительской группы, комментарий, файл с фотографией расширенное создание или изменение группы номенклатуры
updateNomenclature ОбновлениеНоменкла- туры Код, имя, код группы, комментарий, полное название, артикуль, остаток на складе создание или изменение номенклатуры
updateNomenclatureIm ОбновлениеНоменкла- турыИ Код, имя, код группы, комментарий, полное название, артикуль, остаток на складе, файл с фотографией, файл с большой фотографией расширенное создание или изменение номенклатуры
updatePrice ОбновлениеЦены Номенклатура, тип, процент, валюта, значение создание или изменение цены
updatePriceType ОбновлениеTиnаЦены Код, название, вычисляемость (1 -если вычисляет, 0 - задается), базовый тип (для вычисляемых) процент, валюта, НДС, НП, комментарий создание или изменение типа цены
updateCounterpart ОбновлениеКонтр- агента Код, имя, тип (1 - юр.лицо, 2 -физ.лицо), код юр.лица (/физ.лица) основной банковский счет, e-mail, комментарий создание или изменение контрагента
updateLegalPerson ОбновлениеЮрЛица Код, имя, ИНН\КПП, ОКПО, юр. адрес, фактический адрес, телефон, полное имя, комментарий создание или изменение юридического лица
updateBankNumber ОбновлениеБанковско- гоСчеа Код, название (тип) значение, банк, контрагент создание или изменение банковского счета
readNewCounterparts ВыбратьНовых- Контрагентов чтение из базы списка контрагентов
readNewBanks ВыбратьНовыеБанки чтение из базы списка банков
updateBank ОбновлениеБанка БИК название, кор. счет создание или изменение банка
clearNomenclature ОчисткаНоменклату- ры удаление всех групп и элементов номенклатуры
clearCounterparts ОчисткаКонтраген- тов удаление всех контрагентов и юридических лиц
readNewBanksNumbers ВыбратьНовыеБан- ковскиеСчета чтение из базы списка банковских счетов
removeNomenclature УдалитьНоменклату- ру код удаляемой номенклатуры удаление элемента номенклатуры
removeNomenclatureGroup УдалитьГруnnуНо-менклатуры код удаляемой группы удаление группы номенклатуры
removeCounterpart УдалитьКонтрагента код удаляемого контрагента удаление контрагента
removeLegalPerson УдалитьЮрЛицо код удаляемого юр.лица удаление юридического лица
removeBankNumber УдалитьБанковский- Счет код удаляемого счета удаление банковского счета
removeBank УдалитьБанк код удаляемого банка удаление банка
readNewOrders ВыбратьНовыеЗаказы чтение из базы списка заказов
startTimer ЗаnускTаймера запуск таймера для обработки синхронизации
timerIteration НоваяИmерацияTай- мера вызов новой итерации таймера
ЯДРО Интерфейсный модуль реализует функции, доступ-
ные для вызова из других компонент (euripvk.dll). Эти функции написаны на С++ в режиме совместимости с С. Они вызывают методы глобального статического объекта m_dbManager - экземпляра класса DBManager, инкапсулирующего работу с СУБД (табл. 4).
Функции синхронизации определяют механизм вычисления периода, через который необходимо проводить синхронизацию. В качестве входных параметров здесь используются время ожидания (в секундах) перед выгрузкой номенклатуры, перед загрузкой заказов и периоды этих обработок. Алгоритм вычисления механизма синхронизации имеет неясный алгоритм (основанный на алгоритме Евклида), который по понятным причинам описан здесь не очень подробно. При необходимости вносить в него изменения (крайне не рекомендуется), следует изучать код реализации перечисленных здесь четырех методов.
Рис. 4. Схема взаимодействия компонентов
Таблица 4
Интерфейсные методы библиотеки eurip.dll.
Название Параметры Назначение
1 2 3
initMySql Ip-адрес, порт ,имя базы, имя пользователя, пароль, префикс, постфикс подключение к базе
clearNomenclature удаление всех записей о номенклатуре (и группах) из базы
clearCounterparts удаление всех записей о контрагентах
updateNomenclatureGroup Код, имя, код родительской группы, комментарий создание или изменение группы номенклатуры
updateNomenclatureGroupI mage Код, имя, код родительской группы, комментарий, файл с фотографией расширенное создание или изменение группы номенклатуры (происходит копирование фотографии)
updateNomenclature Код, имя, код группы, комментарий, полное название, артикуль, остаток па складе создание или изменение номенклатуры
updateNomenclatureImage Код, имя, код группы, комментарий, полное название, артикль, остаток па складе, файл с фотографией, файл с большой фотографией расширенное создание или изменение номенклатуры (происходит копирование фотографий)
updatePrice Номенклатура, тип, процент, валюта, значение создание или изменение цены
updatePriceType Код, название, вычисляемость (1 - если вычисляет, 0 - задается), базовый тип (для вычисляемых), процент, валюта, НДС, НП, комментарий создание или изменение типа цены
updateCounterpart Код, имя, тип (1 - юр.лицо, 2 - физ.лицо), код юр.лица (физ.лица), основной банковский счет, e-mail, комментарий создание или изменение контрагента
updateLegalPerson Код, имя, ИНН\КПП, ОКПО, юр. адрес, фактический адрес, телефон, полное имя, комментарий создание или изменение юридического лица
updateBankNumber Код, название (тип) значение, бапк, контрагент создание или изменение банковского счета
updateBank БИК, название, кор. счет создание или изменение банка
readNewBanks чтение списка банков из БД
selectBank код бапка выбор конкретного банка из списка
isNewBanks проверка на наличие банков за текущим
getBankId возвращает код текущего банка
getBankName возвращает название текущего банка
getBankKNumber возвращает кор. счет текущего банка
readNewCounterparts чтение из базы списка контрагентов
selectCounterpart код контрагента выбор конкретного контрагента из списка
isNewCounterparts проверка на наличие контрагента за текущим
getCounterpartId возвращение кода текущего контрагента
Назначение и структура. Компонент eurip.dll предназначен для связи с СУБД, вызывая для этого функции библиотеки libmysql.dll. Схема его взаимодействия с другими компонентами представлена на рис. 4.
Компонент eurip.dll состоит из трех частей:
1) интерфейсного модуля, обеспечивающего импорт функций;
2) модуля dbmanager осуществляющего взаимодействие с СУБД;
3) библиотеки scrvl, использующейся для работы со строками.
Окончание таблицы 4
1 2 З
getCounterpartTime возвращение времени создания контрагента
getCounterpartName возвращение имепи текущего контрагента
getCounterpartType возвращает тип текущего контрагента (1 -юр.лицо, 2 - физ.лицо)
getCounterpartName1 возвращение второго имепи текущего контрагента
getCounterpartLegalPerson возвращение кода юр.лица текущего контрагента
getCounterpartBank- Number возвращение банковского счета текущего контрагента
getCounterpartEmail возвращение e-mail текущего контрагента
getCounterpartComment возвращение комментария для текущего контрагента
getCounterpartLPN возвращение полного наименования юр.лица текущего контрагента
getCounterpartInn возвращение ИИН текущего контрагента
getCounterpartOkpo возвращение ОКПО текущего контрагента
getCounterpartCounrty возвращение государства текущего контрагента
getCounterpartRegion возвращение региона текущего контрагента
getCounterpartCity возвращение города текущего контрагента
getCounterpartZip возвращение почтового индекса текущего контрагента
getCounterpartFormAddres s возвращение юр. адреса текущего контрагента
getCounterpartFactAddress возвращение фактического адреса текущего контрагента
getCounterpartFullName возвращение полного имепи текущего контрагента
getCounterpartLPC возвращение комментария юр.лица имепи текущего контрагента
readNewBankNumbers чтение списка банковских счетов из БД
selectBankNumber код банковского счета выбор конкретного банковского счета
isNewBankNumbers проверка па наличие банковских счетов за текущим
getBankNumberId возвращение кода текущего банковского счета
getBankNumberName возвращение названия (типа) текущего банковского счета
getBankNumberNumber возвращение значения текущего банковского счета
getBankNumberBank возвращение бапка, в котором открыт текущий банковский счет
getBankNumberOwner возвращение контрагента, которому принадлежит текущий банковский счет
readNewOrders чтение списка заказов клиентов
isNewOrders проверка па наличие заказов за текущим
getOrderId возвращение кода текущего заказа
getOrderCounterpart возвращение контрагента, сделавшего текущий заказ
getOrderNomenclature возвращение номенклатуры текущего заказа
getOrderCount возвращение количества элементов текущего заказа
getOrderPrice возвращение цепы текущего заказа
removeNomenclature код номенклатуры удаление номенклатуры
removeNomenclatureGroup код группы номенклатуры удаление группы номенклатуры
removeCounterpart код контрагента удаление контрагента
removeLegalPerson код юр. лица удаление юр. лица
removeBankNumber код банковского счета удаление банковского счета
removeBank код банка удаление бапка
getSelfFirm возвращение кода собственной фирмы
setSelfFirm код фирмы установка кода собственной фирмы
getValute получение кода дефолтпой валюты
setValute код валюты установка кода дефолтпой валюты
getMaxCounterpartId возвращение максимального кода контрагента
startTimer ожидание перед первой выгрузкой номенклатуры, ожидание перед первой загрузкой заказов, период между выгрузками номенклатуры, период между загрузками заказов получение периодов и времени ожидания. Вычисление по ним периода вызова процедуры синхро-пизации
timerIteration указание па следующую итерацию синхронизации
getTimersPeriod возвращение текущего периода синхронизации
getTimersResult возвращение результата работы таймера
DBManager. Обращения к СУБД производится при помощи вызова функций mysql. Для работы с этими функциями в методе DBManager::pr_initFunction происходит выгрузка библиотеки libmysql.dll, а затем получение адресов всех необходимых процедур и занесение их в члены класса. Для их определения описан ряд типов:
- MYSQL * STDCALL (*tmysql_init) (MYSQL *mysql);
- MYSQL * STDCALL (*tmysql_real_connect) (MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
- int STDCALL (*tmysql_query)(MYSQL *mysql, const char *q);
- void STDCALL (*tmysql_close)(MYSQL *sock);
- MYSQLRES * STDCALL (*tmysql_store_result)
(MYSQL *mysql);
- MYSQLROW STDCALL (*tmysqlfetchrow)
(MYSQL_RES *result);
- unsigned int STDCALL (*tmysql_num_rows)
(MYSQL_RES *res);
- unsigned int STDCALL (*tmysql_num_fields)
(MYSQL RES *res);
Соответственно среди полей класса определены их экземпляры:
- tmysql_real_connect pmysql_real_connect;
- tmysql_query pmysql_query;
- tmysql_close pmysql_close;
- tmysql_init pmysql_init;
- tmysql_store_result pmysql_store_result;
- tmysql_num_rows pmysql_num_rows;
- tmysql_fetch_row pmysql_fetch_row;
- tmysql_num_fields pmysql_num_fields;
Абстрагирование таблиц, производящееся в методе
DBManager::pr_createTablesNames, позволяет использовать в качестве имен таблиц и полей переменные. Следует учитывать, что используемость полей определяется политикой интернет-магазина, поэтому в зависимости от версии реализации могут использоваться не все описанные поля. Кроме того, из-за экзотичности некоторых движков используемых интернет-магазинов могут добавляться дополнительные поля (табл. 5).
Работа с СУБД. Подключение к СУБД происходит при создании экземпляра DBManager. В качестве параметров конструктор этого класса принимает следующие поля: имя хоста (ip-адрес), порт, имя пользователя (логин), пароль, имя СУБД, префикс таблиц, постфикс таблиц.
Для удаления записей реализованы методы clearNomenclature и clearCounterparts, удаляющие все записи по номенклатуре и по контрагентам, соответственно. Кроме того, существуют методы, позволяющие удалять одну выбранную строку (по id): removeNomenclature, removeNomenclatureGroup, remo-veCounterpart, removeLegalPerson, removeBankNumber, removeBannk. Все они вызывают защищенный метод (pr_removeElement).
Для внесения изменений реализован ряд методов (их параметры соответствуют параметрам методов из табл. 4 и потому не приведены здесь) updateNo-menclatureGroup, updateNomenclature, updatePrice, updatePriceType, updateCounterpart, updateLegalPerson, updateBankNumber, updateBank, setSelfFirm, setValute. Работа этих методов реализована следующим образом:
1) происходит проверка на наличие в таблице строки с соответствующим id, для этого применяется метод prisThere;
2) если соответствующая запись не найдена, данные добавляются командой INSERT, если же строка с таким id существует, то происходит обновление (UPDATE);
3) DBManager предоставляет несколько методов для получения одиночных данных из СУБД:
- getSelfFirm - получение кода собственной фирмы;
- getValute - получение кода дефолтной валюты;
- getMaxId(CrVString) - получение максимального id в данной таблице.
Таблица 5
Поля таблиц СУБД в DBManager
Название поля Значение
nomenclatureGroup группы номенклатуры
id код
name название
parent код родительской группы
comment комментарий
products_count количество номенклатур в данной группе
image фотография группы
nomenclature номенклатуры
id код
name название
fullname полное наименование (для печати)
parent код группы
comment комментарий
price цена
image фотография
imagel большая фотография
rating рейтинг (0-5)
votes количество голосов, определяющих рейтинг
enabled видимость товара (1 - виден, 0 -нет)
articul артикул
rem остаток товара
counterpart контрагент
id код
name имя
othername другое имя
email e-mail
country государство
region регион
city город
address адрес
telephone телефон
zip почтовый индекс
time время регистрации
orders заказы
id код
nomenclature код номенклатуры
count количество экземпляров
price цена
counterpart контрагент
Выгрузка элементов (списков) из СУБД производится следующим способом: вначале происходит извлечение данных и сохранение их члене-класса m_result, а затем интерфейсные функции обращаются к этим данным и возвращают их элементы.
Список методов, извлекающих данные (данные методы вызываются из соответствующих интерфейсных методов read (readNewBanks, readNewCounterparts, readNewOrders). Прочие интерфейсные методы занимаются исключительно обработкой массива mresult.: firstCounterpart, firstBank, firstOrder, firstCounter-partOrder.
Для вызова данных из СУБД реализован метод pr_firstObject, вызываемый всеми вышеперечисленными методами. При выборе строки она удаляется из базы. Член-класса m result представляет собой двумерный массив (строки данных и поля).
LibmySQL. Библиотека libmySQL.dll реализует функции, позволяющие взаимодействовать с СУБД. Как и всякая скомпилированная библиотека, libmySQL содержит только реализации, а не описания и типы, которые содержатся в заголовочном файле mysql.h. При разработке ядра этот файл (и несколько других) был взят из MySQLServer и помещен в директорию с заголовочными файлами среды.
ВЫВОДЫ
Таким образом, разработана технология интеграции системы управления предприятием 1С и интернет-магазинов, базирующихся на различных движках.
ЛИТЕРАТУРА
1. Рязанцева Н., Рязанцев Д. 1С Предприятие: Торговля и склад. Секреты работы. СПб.: БХВ-Петербург, 2003. 368 с.
Поступила в редакцию 25 марта 2014 г.
Kryuchin O.V., Khabirova K.R., Vyazovova E.V. INTEGRATION OF INTERNET-STORE AND ENTERPRISE MANAGEMENT SYSTEM WITH MODULES 1C EURIPTE-RIDE
The technology of enterprise management system 1C and in-ternet-stores based on different equipment is described. The full description of the system architecture and its technical characteristic specificity is given.
Key words: internet-stores; management system; messages passing protocol.
Крючин Олег Владимирович, Тамбовский государственный университет им. Г.Р. Державина, г. Тамбов, Российская Федерация, магистрант по направлению подготовки «Прикладная математика и информатика» института математики, физики и информатики, e-mail: [email protected]
Kryuchin Oleg Vladimirovich, Tambov State University named after G.R. Derzhavin, Tambov, Russian Federation, Candidate for Master’s Degree of Direction of Preparation of “Applied Mathematics and Informatics” of Mathematics, Physics and Informatics Institute, e-mail: [email protected]
Хабирова Кристина Раильевна, Тамбовский государственный университет им. Г.Р. Державина, г. Тамбов, Российская Федерация, студентка института математики, физики и информатики, e-mail: [email protected]
Khabirova Kristina Railyevna, Tambov State University named after G.R. Derzhavin, Tambov, Russian Federation, Stu-dewnt of Mathematics, Physics and Informatics Institute, e-mail: [email protected]
Вязовова Елена Владимировна, Тамбовский государственный университет им. ГР. Державина, г. Тамбов, Российская Федерация, магистрант по направлению подготовки «Прикладная математика и информатика» института математики, физики и информатики, e-mail: [email protected]
Vyazovova Elena Vladimirovna, Tambov State University named after G.R. Derzhavin, Tambov, Russian Federation, Candidate for Master’s Degree of Specialty of “Applied Mathematics and Informatics” of Mathematics, Physics and Informatics Institute, e-mail: [email protected]