Обмен заказами между 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С Предприятия УТ;
4. Описание формата CommerceML 2.
Автор: Bedrosova