В стандартном варианте данный механизм обмена не полностью автоматизирует работу менеджера на стороне 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.
ссылка на оригинал статьи http://habrahabr.ru/post/216219/
Добавить комментарий