Недавно знакомый попросил помочь с задачей импортировать данные небольшого интернет-магазина в 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С, поэтому если специалисты найдут неточности в этой статье, прошу отнестись к ним снисходительно и рассматривать статью лишь как пособие для решения конкретной прикладной задачи.
Автор: sadomovalex