logo
Разработка и внедрение модуля интеграции 1с 7.7 и "Joomla VirtueMart" для предприятия ООО "Вазаро"

3.4 Написание программного кода для "1С: Предприятие" и интернет-магазина

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

Все функции по связи 1С и базы данных MySQL находятся в поставляемой вместе с модулем библиотеке MySQL.dll. Каждая функция отвечает за определённую функцию, в число которых, входит, например функция "vm_UpdateProduct" обновляет продукты на сайте, а функция "vm_InsertProduct" добавляет новые элементы (sql-запросы UPDATE и INSERT соответственно).

Однако данная библиотека ограничена набором таких функций, что не даёт в полной мере её использовать. Из-за этого пришлось искать другие способы выгрузки и загрузки информации из базы данных.

В этом помогла дополнительная библиотека для "1С: Предприятие 7.7" V7PLUS.dll, которая включает в себя ряд дополнительных новшеств, используемых в данной версии 1С. Среди них оказалась возможность обращаться к странице на каком-либо сайте и передавать, благодаря этому, параметры в формате GET-запросов.

Сначала необходимо создать новую процедуру в коде модуля до вызова самой процедуры, которая умеет передавать подобные запросы (Рисунок N):

Рисунок N. Код процедуры "Сформировать()".

Данная процедура принимает в себя 2 параметра:

· "СтрОтпр" - уже сформированная строка для отправления через GET-запрос вида "Текст;ДругойТекст;Значение;". Данная строка, разделённая знаком ";" содержит в себе определённую информацию, которая на определённой странице сайта раскладывается на отдельные переменные, передаваемые потом в базу данных;

· "Флаг" - значение для определения вида запроса (например, выгрузка товара или выгрузка категории).

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

Далее необходимо изменить и добавить код обработки категорий и групп категорий для их выгрузки. В процедуре "Пак_ВыгрузитьПроизводителей", вызываемую при нажатии "Выгрузить номенклатуру" на форме модуля, необходимо добавить код для выгрузки сначала самих групп категорий, а после этого связки групп с категориями. Для выгрузки справочника "ГруппыКатегорий" был написан код (Рисунок N):

Рисунок N. Код по выгрузке групп категорий.

В данном участке кода создаётся объект из справочника "ГруппыКатегорий", из которого в цикле выбираются значения. Эти значения формируются в строку и передаются через созданную ранее процедуру "Сформировать". Выше цикла создаётся таблица значений для сохранения получаемых данных и эти данные из глобальной переменной "СтрокаДляПриема" сохраняются в таблицу значений в качестве новой строки. В данном случае это идентификатор новой записанной а базу данных группы со связкой её наименования.

Следующим шагом после выгрузки групп идёт создание кода по внедрению в базу данных связки между группами категорий и самими категориями. Данный участок кода представлен ниже (Рисунок N):

Рисунок N. Код по выгрузке связки категорий и групп категорий.

В данном участке кода сначала перебираются все категории из справочника "ПроизводительCMS", от которого создаётся объект. Каждый элемент в этом справочнике проверяется на пустоту и пометку на удаление, из-за чего данный элемент может пропуститься в цикле. В строку для передачи добавляется наименование категории, а после выше созданная таблица значений с добавленными или просто выбранными группами категорий на сайте перебирается для поиска подставленных в качестве реквизита групп. Если такое значение найдено, то в строку для передачи GET-запроса добавляется идентификатор этой группы в базе данных. В итоге вызывается процедура "Сформировать" с необходимыми параметрами.

Для выгрузки всех необходимых данных в базу данных используется специально написанный скрипт на языке PHP, который находится в корневом каталоге сайта и перебирает передаваемые через GET-запрос параметры для передачи в базу данных. Данный скрипт состоит из нескольких частей, каждая из которых описана ниже.

Сначала данный скрипт подключается к необходимой базе данных (Рисунок N):

Рисунок N. Подключение к базе данных.

Данный код отвечает за стандартное подключение к базе MySQL на языке PHP и выбор необходимой базы.

Дальнейшим действием после подключения становится уже непосредственная работа с GET-запросами. В случае с данной модернизацией модуля данный скрипт работает в двух вариациях: при работе с группами категорий и при работе со связками этих категорий. Для обоих из этих скриптов используются свои схемы работы, каждая из которых представлена ниже.

Первый участок кода отвечает за вставку или выборку значений из базы данных по группам категорий (Рисунок N):

Рисунок N. Код обработки GET-запроса по группам категорий.

Данный участок кода обладает определённой структурой, которая представляет собой различные действия на те или иные приходящие данные.

Если в GET-запросе существует нужный передаваемый параметр и он не пустой, тогда значение данного параметра (специально разделённые в 1С по знаку ";" данные) разбивается по знаку ";" на массив, каждая ячейка которого отвечает за определённое значение. В данном случае первая ячейка - наименование группы, а вторая - её описание.

Делается пробный запрос в базу данных к таблице "jos_vm_manufacturer_category" с целью проверить, есть ли группа с таким названием уже в таблице.

1) Если в условии после запроса "SELECT" появилась возможность выбрать из пришедшего результирующего массива хоть одно значение, то это означает, что группа с таким названием уже есть и тогда в 1С передаётся идентификатор данной группы для последующего использования.

2) Если же в условии ничего не выбралось, значит строки с таким наименованием в таблице нет. В этом случае производится SQL-запрос "INSERT", добавляющий в таблицу "jos_vm_manufacturer_category" новую строку с данными о новой1 группе.

Далее, из-за ограниченных стандартных возможностей PHP, не позволяющих сразу после "INSERT"а достать значение из пришедшего массива, выполняется ещё один запрос к базе данных идентичный первоначальному запросу "SELECT". И теперь пришедший в качестве ответа массива должен вернуть значение, которое также, как и в первом пункте, передаётся в 1С.

Все эти действия приводят к тому, что в 1С передаётся идентификатор записи (либо вставленной в таблицу базы данных, либо просто выбранный оттуда), который используется для второго использования этого скрипта PHP.

Этот второй участок кода, находящийся на той же странице, к которой обращается процедура "Сформировать" в 1С, представлен ниже (Рисунок N):

Рисунок N. Код обработки GET-запроса по связке группы категорий и категории.

Данный код также обладает определённой структурой, но она отличается от структуры кода, представленного выше.

В данном случае с помощью процедуры "Сформировать" в 1С передаются следующие данные:

· Имя категории;

· Идентификатор группы, выбранный благодаря первому участку скрипта.

Таким образом, сначала проверяется наличие такой категории в таблице "jos_vm_manufacturer", которая и хранит список всех категорий. В случае нахождения строки или нет, определяются варианта событий:

1) Если строка с таким именем уже есть, а, значит, такая категория на сайте уже существует, проверяется ряд условий:

· есть ли во второй ячейке разбитого из пришедшей строки массива какое-либо значение;

· отсутствует ли элемент с ключом массива, отвечающим за идентификатор группы, в пришедшем от запроса массиве;

· если всё же данная ячейка с таким ключом есть, проверяется, равна ли она NULL.

Все эти условия необходимы для того, чтобы проверить, есть ли в пришедшем GET-запросе идентификатор группы, и нет ли его в выбранной из таблицы строке. Если в запросе передаётся идентификатор, а в базе данных у этой категории нет группы, данной категории присваивается идентификатор необходимой группы.

2) Если после запроса "SELECT" строки с наименованием такой категории не оказалось, проверяется другое условие, по результату которого может произойти 2 разных действия:

· если в передаваемом GET-запросе есть идентификатор группы, то в таблицу "jos_vm_manufacturer" базы данных заносится новая строка с именем данной категории и её привязанной в 1С группы;

· если же в запросе нет этого идентификатора, то в таблицу заносится строка только лишь с названием категории без какого-либо идентификатора (то есть это поле так и остаётся в значении NULL).

В итоге всех этих запросов таблицы базы данных заполняется необходимыми значениями, что даёт реализовать отображение в интернет-магазине группировку категорий.

Однако данный способ реализации данной задачи не самый быстрый, так как каждый отдельный запрос к странице сайта определяет новое подключение к базе данных, новые лишние выборки и т.д. Всё это очень затормаживает обращение к базе данных, что, со стороны 1С замедляет работу модуля.

Другой задачей согласно техническому заданию было добавление полей для выгрузки описаний и ключевых слов товаров и разделов товаров.

Изменению подверглись две используемые процедуры: "Пак_ВыгрузитьСтруктуруГрупп" для разделов товаров и "Пак_ВыгрузитьНоменклатуру" для самих товаров.

Для процедуры по выгрузке разделов были добавлены новые данные в передаваемую строку (Рисунок N), а также соответствующие названия полей таблицы для выгрузки с помощью встроенной в библиотеку MYSQL.dll функции (Рисунок N):

Рисунок N. Строка в категории, передаваемая в базу данных.

Рисунок N. Функция из библиотеки MySQL.dll, передающая строку для категории.

То же самое производится и над выгрузкой номенклатуры. Тут также добавляются новые данные в передаваемую функции строку (Рисунок N):