Импорт данных интернет-магазина в 1С: Управление торговлей

Ответить
admin
Администратор
Сообщения: 199
Зарегистрирован: 05 янв 2011, 04:19

Импорт данных интернет-магазина в 1С: Управление торговлей

Сообщение admin »

http://habrahabr.ru/post/189690/

Недавно знакомый попросил помочь с задачей импортировать данные небольшого интернет-магазина в 1С: Управление торговлей 11. Т.к. по основной работе я имею дело с SharePoint и стеком .Net, мне понравилась идея расширить свой кругозор и попробовать что-то новое. Задача была поставлена следующим образом:
— провести одноразовую загрузку данных в 1С с последующей односторонней синхронизацией из 1С в интернет-магазин;
— данные магазина хранятся в базе данных на MS SQL Server;
— экспорт данных из SQL Server и импорт в 1С желательно осуществлять штатными средствами с минимумом кода.

Эта статья написана на основе изучения форумов и документации 1С. В ней описывается процесс загрузки данных в 1С. Если тема будет востребована, в другой раз напишу, как настроить синхронизацию из 1С в интернет-магазин. Я попытался составить как можно более детальное описание процесса, чтобы его могли использовать люди, также как я не имеющие опыта работы с 1С. Надеюсь, что она поможет сэкономить время на выполнение этой типовой задачи и позволит избежать ошибок. Хотя в статье и говорится об экспорте данных из SQL Server, она будет полезна и с другими СУБД.

В стандартную поставку 1С: Управление торговлей входит обработка Загрузка данных из табличного документа (для тех, кто не имел опыта работы с 1С, поясню: это один файл ЗагрузкаДанныхИзТабличногоДокумента.epf, который можно найти на диске с дистрибутивом 1С), позволяющая загружать данные в различные справочники 1С, например, из файла MS Excel. Эту обработку мы и будем использовать для импорта. Преимущество использование стандартного функционала из коробки — экономия на разработке своего решения. В интернете можно найти несколько примеров использования этой обработки. Главным отличием данной статьи будет описание процедуры импорта не только стандартных реквизитов товаров, но и дополнительного реквизита, который мы создадим сами (см. ниже). Такого примера я не нашел, но в реальных сценариях он может быть очень востребованным. Например, нам потребуется дополнительный реквизит для товаров для хранения Id товара на сайте, чтобы потом можно было синхронизировать товары обратно из 1С в интернет-магазин. Можно было бы записать Id в один из стандартных реквизитов (использовать его не по назначению), но мы пойдем по более правильному, хотя и более сложному, пути.

Начнем с описания схемы базы данных. Нас интересуют таблицы c продуктами и категориями. Каждый продукт может относиться к нескольким категориям и каждая категория может содержать много продуктов. Кроме этого, каждая категория может иметь несколько подкатегорий, например, есть категория «Товары для спорта» и под ними категории для различных видов спорта. Для упрощения оставим только те аттрибуты, которые нам понадобятся для примера. Набор аттрибутов товаров у каждого магазина свой, но такие свойства как Название, Цена, Артикул возможно есть у большинства. Поэтому ограничимся 3 таблицами:

Products
Categories
ProductCategories — промежуточная таблица в отношении многие ко многим между продуктами и категориями


Вот схема базы:
Изображение

Сначала нам нужно выгрузить товары в файл из базы. Это сделать достаточно просто в SQL Management Studio: можно выполнить запрос в файл с фиксированной шириной колонок и потом открыть его как csv файл в Excel. Также можно просто скопировать результаты из таблицы с результатами Management Studio в Excel. Осталось написать нужный запрос.

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

Чтобы написать запрос нам потребуется работать с иерархическими данными в таблице категорий. Для подобных запросов в SQL Server есть специальный механизм обобщенные табличные выражения (Common Table Expressions), но мы пойдем более простым и понятным путем, используя пользовательские функции (User Defined Functions). Сначала определим рекурсивную функцию для выборки категории 1-го уровня по заданному categoryId:

Код: Выделить всё

create function dbo.get_parent_category(@categoryId int)
returns nvarchar(256)
begin
    declare @parentId int
    set @parentId = (select ParentCategoryId from dbo.Category where CategoryId = @categoryId)
    if @parentId is null
    begin
        return @categoryId
    end
    return dbo.get_parent_category(@parentId)
end

Затем функцию, которая вернет название первой категории 1-го уровня для заданого товара:

Код: Выделить всё

create function dbo.get_parent_product_category(@productId int)
returns nvarchar(256)
begin
    declare @categoryId int, @parentCategory int
    declare @categoryName nvarchar(256)

    set @categoryId =
    (select top 1 c.CategoryId
    from dbo.Product p
        inner join dbo.ProductCategory pc on p.ProductId = pc.ProductId
        inner join dbo.Category c on pc.CategoryId = c.CategoryId
    where p.ProductId = @productId)
   
    set @parentCategory = dbo.get_parent_category(@categoryId)
    return (select Name from dbo.Category where CategoryId = @parentCategory)
end

Осталось написать сам запрос для экспортируемых товаров. С описанными функциями это просто:

Код: Выделить всё

select Name, Price, Articul, Vendor, dbo.get_parent_product_category(ProductId), ProductId
from Product
order by p.Name

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

Итак, мы экспортировали данные в Excel. Следующий шаг — импорт в 1С. Товары в 1С: Управление торговлей (УТ) хранятся в справочнике Номенклатура. Для начала в этот справочник необходимо добавить дополнительный реквизит для хранения Id товара в базе данных интернет-магазина (как уже упоминалось, это нужно для последующей синхронизации товаров из 1С в интернет-магазин). Сделать это можно следующим образом: открываем любой товар в режиме редактирования и выбираем кнопку Дополнительные сведения (неприметная иконка сверху формы):
Изображение
В открывшемся окне выбираем Добавить > Общие свойства > Подбор > Создать и вводим название нового реквизита, например «Id товара на сайте»:
Изображение
После того, как мы добавили новый реквизит в набор, нужно переоткрыть форму редактирования товара. Форма редактирования реквизита должна появиться на форме:
Изображение

Для запуска обработки ЗагрузкаДанныхИзТабличногоДокумента необходимо открыть 1С в режиме Обычное приложение (по умолчанию 1С УТ 11 открывается в режиме Управляемое приложение). Чтобы переключиться в режим обычного приложения в конфигураторе необходимо выбрать Администрирование > Пользователи > выбрать пользователя и на форме редактирования на вкладке Прочие в поле Режим запуска установить Обычное приложение. Также в настройках запуска информационной базы в поле Основной режим запуска должно стоять Выбирать автоматически.

Теперь открываем информационную базу в режиме Обычное приложение и загружаем обработку ЗагрузкаДанныхИзТабличногоДокумента (Файл > Открыть). В открывшемся окне выбираем открыть Excel файл, который мы экспортировали из базы данных магазина:
Изображение
Перед импортом товаров нужно импортировать данные в зависимые справочники Производители и Виды номенклатуры, иначе эти поля останутся пустыми. Для импорта производителей вверху выбираем Режим загрузки = Загрузка в справочник, Вид справочника = Производители. На вкладке Настройка устанавливаем следующие значения:
Изображение
Здесь важно указать номер столбца и выбрать Поле поиска (иначе будут созданы дубликаты). После нажатия на Загрузить производители будут импортированы в справочник.

По аналогии проводим импорт данных в справочник Виды номенклатуры. Только в отличие от производителей в стандартной конфигурации на вкладке Настройки необходимо установить также Вариант оформления продажи и Тип номенклатуры:
Изображение
Теперь можно приступать к импорту товаров. Устанавливаем настройки как показано на следующем рисунке:
Изображение
Для загрузки данных в дополнительный реквизит «Id товара на сайте», который мы создали выше, добавляем следующий обработчик в События > При записе объекта:

Код: Выделить всё

Объект.ДополнительныеРеквизиты.Очистить();

свойствоИдентификатор =
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Id товара на сайте", Истина);
         
идентификаторНаСайте = Объект.ДополнительныеРеквизиты.Добавить();
идентификаторНаСайте.Свойство = свойствоИдентификатор;
идентификаторНаСайте.Значение = ТекстыЯчеек[6];
Объект.Записать();

После этого выполняем загрузку товаров. Если все сделано правильно, импорт пройдет успешно и при открытии формы редактирования с одним из товаров вы увидете его свойства, которые должны быть такими же, как в excel-е.

Остался один шаг — импорт цены. Этот шаг сильно зависит от конкретной конфигурации и типа цен. Из общих шагов можно выделить следующие. На форме обработки выбираем Режим загрузки = Загрузка в табличную часть, Ссылка = Установка цен номенклатуры. Затем опять нажимаем Ссылка еще раз и добавляем новый документ:
Изображение
После создания выбираем его (документ должен появиться в поле ссылка формы), в поле Табличная часть выбираем Товары и устанавливаем следующие установки на вкладке Настройки:
Изображение

Здесь важно, что мы указали из какого столбца будут браться цены при импорте. После этого можно загружать цены. Как я уже написал, процесс загрузки цен сильно зависит от конкретной конфигурации, поэтому здесь я не буду вдаваться в детали. Если интересуют детали, советую следующую статью: Загрузка данных в справочник номенклатура из прайс-листа Excel. Отмечу еще, что еще, возможно, потребуется согласовать созданный документ установки цен номенклатуры.

Таким образом мы загрузили данные из базы данных интернет-магазина в 1С для последующего использования в учете. Надеюсь, что эта статья поможет кому-нибудь сэкономить время и деньги на выполнение похожей задачи. Я не работаю с 1С, поэтому если специалисты найдут неточности в этой статье, прошу отнестись к ним снисходительно и рассматривать статью лишь как пособие для решения конкретной прикладной задачи.
Вложения
30531743fb173dc081d4f8fa1ff82dc2.png
30531743fb173dc081d4f8fa1ff82dc2.png (21.65 КБ) 40153 просмотра
fe56f778575acb9764f3912b98d783ab.png
fe56f778575acb9764f3912b98d783ab.png (17.13 КБ) 40153 просмотра
571a3953f344d638ba136f64d76a2118.png
571a3953f344d638ba136f64d76a2118.png (37.91 КБ) 40153 просмотра
098d3e2553e542e0115878bf6bdec2c0.png
098d3e2553e542e0115878bf6bdec2c0.png (38.13 КБ) 40153 просмотра
4eb8e60df3f23b5aec830fd1301f643c.png
4eb8e60df3f23b5aec830fd1301f643c.png (17.43 КБ) 40153 просмотра
e15f902766f82c50b2453238b9668efb.png
e15f902766f82c50b2453238b9668efb.png (21.51 КБ) 40153 просмотра
5bb90f1b839d49a23225080cac27fd5e.png
5bb90f1b839d49a23225080cac27fd5e.png (49.37 КБ) 40153 просмотра
69c98a81ed52410318e549438e353533.png
69c98a81ed52410318e549438e353533.png (25.04 КБ) 40153 просмотра
cacb57939b489957f8675c362afcdd67.png
cacb57939b489957f8675c362afcdd67.png (48.65 КБ) 40153 просмотра
31ed7d994006a146e2a56050047bc558.png
31ed7d994006a146e2a56050047bc558.png (9.08 КБ) 40153 просмотра
Ответить