eventus-market.com

Обмен заказами между 1С Предприятие 8.3 Управление Торговлей 11.1 (далее по тексту 1С УТ) и интернет-магазином на базе 1С-Битрикс 14.0 (далее по тексту Битрикс) — это часть стандартного «коробочного» механизма обмена между указанными системами. Пользователь формирует заказ на сайте, а затем по расписанию и, начиная с определенного статуса заказа, заказы выгружаются в 1С УТ. Описание данного механизма в его стандартном виде можно найти по ссылкам, указанным в конце данной статьи, статья же о том, как расширить указанный функционал и подогнать его под документооборот конкретного торгового предприятия.

В стандартном варианте данный механизм обмена не полностью автоматизирует работу менеджера на стороне 1С УТ: дело в том, что реквизиты заказа, такие как метод оплаты, способ доставки — передаются на сторону 1С УТ и записываются в доп. сведения о заказе.



Но поля доставки заказа, а так же грузоперевозчик (при доставке грузоперевозчиком), метод оплаты, склад — остаются незаполненными. 



И для того, чтобы пустить заказ в дальнейший документооборот, пользователю требуется посмотреть на дополнительные сведения и вручную заполнить в заказе все перечисленные поля (автоматическое заполнение склада — это, конечно спорный вопрос, но, как правило, удобно, чтобы по умолчанию при создании заказа выбирался основной склад). 



Казалось бы, это всего 8 щелчков мышью, однако при большом количестве заказов в день, эти рутинные операции очень утомляют пользователя. Поэтому и встала задача доработки экспорта заказов из Битрикс в 1С УТ таким образом, чтобы поля доставки, грузоперевозчик, поле метода оплаты и поле склад заполнялись автоматически в ходе выполнения обмена.

Кроме этого, важным условием задачи так же являлось не нарушить целостность конфигурации 1С УТ, чтобы не снимать ее с поддержки, поэтому было решено выделить часть модуля обмена, отвечающего за обмен заказами, вынести его во внешнюю обработку, а затем уже доработать функционал этой внешней обработки.

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

Функция СведенияОВнешнейОбработке() Экспорт РегистрационныеДанные = Новый Структура; РегистрационныеДанные.Вставить("Наименование", "Расширенный обмен заказами с сайтом"); РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь); РегистрационныеДанные.Вставить("Версия", "1.0"); РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка"); РегистрационныеДанные.Вставить("Информация", "Обработка для обмена с сайтами, с дополнительными настройками"); тзКоманд = Новый ТаблицаЗначений; тзКоманд.Колонки.Добавить("Идентификатор"); тзКоманд.Колонки.Добавить("Представление"); тзКоманд.Колонки.Добавить("Модификатор"); тзКоманд.Колонки.Добавить("ПоказыватьОповещение"); тзКоманд.Колонки.Добавить("Использование"); строкаКоманды = тзКоманд.Добавить(); строкаКоманды.Идентификатор = "1"; строкаКоманды.Представление = "Ввод настроек (ОткрытиеФормы)"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Использование = "ОткрытиеФормы"; строкаКоманды.Модификатор = ""; строкаКоманды = тзКоманд.Добавить(); строкаКоманды.Идентификатор = "2"; строкаКоманды.Представление = "Запуск обмена (ВызовСерверногоМетода)"; строкаКоманды.ПоказыватьОповещение = Истина; строкаКоманды.Использование = "ВызовСерверногоМетода"; строкаКоманды.Модификатор = ""; РегистрационныеДанные.Вставить("Команды", тзКоманд); Возврат РегистрационныеДанные; КонецФункции 


Там же в основном модуле обработки необходимо описать процедуру, которую мы будем вешать на регламентное задание, и которая будет непосредственно запускать обмен:

Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт 	 ЗагрузитьРеквизиты(); ВыполнитьОбмен(ЭтотОбъект.УзелОбмена, НСтр("ru = 'Фоновый обмен'"));	 КонецПроцедуры 


В процедуре выше мы использовали вызов функции ЗагрузитьРеквизиты. В этой фукнции мы выбираем ранее заданные реквизиты дополнительных настроек обмена из хранилища:

Процедура ЗагрузитьРеквизиты() Экспорт КлючОбъекта = "РасширенныйОбмен"; КлючНастроек = "ОбменССайтомРасширенныйОбмен "; ИмяПользователя = "SHARE"; СтруктураНастроек = Новый Структура(); РеквизитыОбработки = ЭтотОбъект.Метаданные().Реквизиты; Попытка СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек,,ИмяПользователя); Исключение Сообщить("Нет прав на восстановление реквизитов."); КонецПопытки; Если СтруктураНастроек = Неопределено Тогда Сообщить("Не вышло восстановить реквизиты!"); Иначе Для каждого Реквизит из РеквизитыОбработки Цикл ЭтотОбъект[Реквизит.Имя] = СтруктураНастроек[Реквизит.Имя]; Сообщить(ЭтотОбъект[Реквизит.Имя]); КонецЦикла;	 КонецЕсли; КонецПроцедуры 


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



Сохранение дополнительных реквизитов обмена осуществляется процедурой СохранитьРеквизиты из модуля формы (не путать с основным модулем внешней обработки).

Процедура СохранитьРеквизиты() Экспорт КлючОбъекта = "РасширенныйОбмен"; КлючНастроек = "ОбменСРасширенныйОбмен "; ИмяПользователя = "SHARE"; Настройки = Новый Структура(); Хранитель = РеквизитФормыВЗначение("Объект"); РеквизитыОбработки = Хранитель.Метаданные().Реквизиты; Для каждого Реквизит из РеквизитыОбработки Цикл ТипЗначения = ТипЗнч(Объект[Реквизит.Имя]); Если ТипЗначения = Тип("ДанныеФормыКоллекция") Тогда Настройки.Вставить(Реквизит.Имя, Объект[Реквизит.Имя].Выгрузить()); Иначе					 Настройки.Вставить(Реквизит.Имя, Объект[Реквизит.Имя]); КонецЕсли			 КонецЦикла; ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, , ИмяПользователя); КонецПроцедуры 


Параметры будут сохраняться в ХранилищеОбщихНастроек — это очень удобный инструмент платформы 1С Предприятие.

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

Еще одна процедура из модуля формы — это процедура ручного запуска обмена.

Процедура Начать()	 Обработка = РеквизитФормыВЗначение("Объект"); Обработка.ВыполнитьОбмен(Обработка.УзелОбмена, НСтр("ru = 'Фоновый обмен'")); КонецПроцедуры 


После того, как данные приготовления сделаны, мы копируем из стандартного модуля обмена с сайтом конфигурации 1С УТ все те процедуры, которые необходимы нам для обмена заказами (можно скопировать и весь текст модуля). Далее уже в нашем модуле внешней обработки расширенного обмена заказами мы видоизменяем процедуры обмена так, чтобы при обмене посредством данной обработки учитывались наши дополнительные настройки, а именно:

В процедуре СоздатьОбновитьДокументы находим место, где заполняется (в цикле) дополнительное сведение заказа: 

СвойстваЗаказа.Вставить(Реквизит, Значение);

Дописываем после этой строки:

 Если Реквизит = "Способ доставки" Тогда НайденнаяСтрока = ЭтотОбъект.СоответствиеСпособовДоставки.Найти(Значение, "НаСайте"); Если НЕ НайденнаяСтрока = Неопределено Тогда 	 Док.ДокументОбъект.СпособДоставки = НайденнаяСтрока.НаСервере; Док.ДокументОбъект.ПеревозчикПартнер = НайденнаяСтрока.Контрагент; Попытка Для Каждого СтрДерева Из Док.СтруктураДанныхКонтрагента.ДеревоАдресов.Строки Цикл Док.ДокументОбъект.АдресДоставки = СтрДерева.Представление; КонецЦикла; Исключение //Действия при ошибке КонецПопытки; КонецЕсли; ИначеЕсли Реквизит = "Метод оплаты" Тогда НайденнаяСтрока = ЭтотОбъект.СоответствиеМетодовОплаты.Найти(Значение, "НаСайте"); Если НЕ НайденнаяСтрока = Неопределено Тогда 	 Док.ДокументОбъект.ФормаОплаты = НайденнаяСтрока.НаСервере; КонецЕсли; КонецЕсли; 


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

Если ЭтотОбъект.ДобавлятьСкладКТоварам Тогда Для Каждого Строка из Док.ДокументОбъект.Товары Цикл Строка["Склад"] = Док.ДокументОбъект.Склад; КонецЦикла; КонецЕсли; 


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

Это все. Остается только зарегистрировать обработку в режиме предприятия (я напомню, что это делается в Администрирование-Настройка параметров системы — Печатные формы отчеты и обработки — Дополнительные отчеты и обработки).



Задать соответствия для методов оплаты.



Задать соответствия для способов доставки: 



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



Ссылки: 
1. Описание протокола обмена заказами между 1С-Битрикс и 1С Предприятием УТ;
2. Описание настройки стандартного обмена на стороне 1С-Битрикс;
3. Описание настройки стандартного обмена на стороне 1С Предприятия УТ;

Возврат к списку