Pull to refresh

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

Reading time 6 min
Views 30K
Недавно знакомый попросил помочь с задачей импортировать данные небольшого интернет-магазина в 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 таблицами:
  1. Products
  2. Categories
  3. 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С, поэтому если специалисты найдут неточности в этой статье, прошу отнестись к ним снисходительно и рассматривать статью лишь как пособие для решения конкретной прикладной задачи.
Tags:
Hubs:
-1
Comments 7
Comments Comments 7

Articles