===== Встраивание подсистемы "Новая почта" ===== 1. Объединяем с конфигурацией модуля новой почты {{ :delivery1.jpg?400 |}} 2. Выполняем объединение 3. Пропускаем зависимости {{ :delivery2.jpg?400 |}} 4.1 Если модуль "Новая почта" внедряется совместно с модулями торговых площадок "eComm+" тогда перетаскиваем подсистему "Новая почта" в торговые площадки Только вместе с "eComm+" {{ :delivery3.jpg?400 |}} 4.2 Если модуль "Новая почта" внедряется самостоятельно (без модулей "eComm+") тогда отображаем подсистему "eComm_СлужбыДоставки" в командном интерфейсе Только самостоятельно (без "eComm+") {{ ::bas_np_only.png?400 |}} ===== Редактирование документа “Заказ клиента” ===== ==== Редактирование формы документа “Заказ клиента” ==== Добавляем в конце метода “ПриСозданииНаСервере” следующий код //++ ingenum.com.ua / Торговые площадки eCommДоставкаСервер.ЗаказПокупателя_ФормаДокумента_ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка); //-- ingenum// Добавляем в конце модуля формы следующий код &НаКлиенте Процедура eComm_ЭкспрессНакладнаяНажатие(Элемент, СтандартнаяОбработка) //++ eComm / Службы доставки Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда ПоказатьПредупреждение(, НСтр("ru = 'Данные не записаны. |Переход к экспресс-накладной возможен только после сохранения заказа'; | |uk = 'Данные не записаны. |Перехід до експрес-накладної можливий лише після збереження замовлення'")); Возврат; КонецЕсли; Если Элемент.Имя = "eComm_ЭкспрессНакладная_Открыть" Тогда // Это открытие списка накладных СписокВыбора = eCommДоставкаСервер.СписокЭкспрессНакладных(Объект.Ссылка); Если СписокВыбора.Количество() > 1 Тогда ОповещениеОВыборе = Новый ОписаниеОповещения("ВыполнитьПослеВыбораЗначения", ЭтаФорма, Объект.Ссылка); ПоказатьВыборИзМеню(ОповещениеОВыборе, СписокВыбора, Элементы["eComm_ЭкспрессНакладная_Открыть"]); ИначеЕсли СписокВыбора.Количество() = 1 Тогда ВыполнитьПослеВыбораЗначения(СписокВыбора[0], Объект.Ссылка); Иначе // Создадим если ранее накладная не была создана ВыполнитьПослеВыбораЗначения(Новый Структура("Значение", Неопределено), Объект.Ссылка); КонецЕсли; ИначеЕсли Элемент.Имя = "eComm_ЭкспрессНакладная_Создать" Тогда // Это создание новой накладной ВыполнитьПослеВыбораЗначения(Новый Структура("Значение", Неопределено), Объект.Ссылка); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВыполнитьПослеВыбораЗначения(ЭлементСпискаВыбора, Заказ) Экспорт //++ eComm / Службы доставки Если НЕ ЭлементСпискаВыбора = Неопределено Тогда ЗначенияЗаполнения = Новый Структура("ДокументОснование", Заказ); ОткрытьФорму("Документ.eComm_ЭкспрессНакладная.ФормаОбъекта", Новый Структура("Ключ, ЗначенияЗаполнения", ЭлементСпискаВыбора.Значение, ЗначенияЗаполнения)); КонецЕсли; КонецПроцедуры ==== Редактирование формы "ФормаСпискаДокументов" документа “Заказ клиента” ==== Для реквизита "Список" выполняем команду "Настройка списка" и приводим текст запроса к такому виду: ЕСТЬNULL(ФактОплаты.СуммаОплаты, 0) + ЕСТЬNULL(ФактОплаты.СуммаАванса, 0) КАК СуммаОплатыОборот, //++ ,eComm_СтатусыЭкспрессНакладных.ЭкспрессНакладная КАК ЭкспрессНакладная, eComm_СтатусыЭкспрессНакладных.ОписаниеСтатуса КАК ОписаниеСтатуса, eComm_СтатусыЭкспрессНакладных.СтатусДенежногоПеревода, eComm_СтатусыЭкспрессНакладных.ДнейХраненияНаСкладе КАК ДнейХраненияНаСкладе, eComm_СтатусыЭкспрессНакладных.НачалоПлатногоХранения, ЕСТЬNULL(СообщенияSMS.КоличествоSMS, 0) КАК SMS //-- ИЗ Документ.ЗаказКлиента КАК ДокументЗаказКлиента //++ {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.eComm_ЭкспрессНакладныеСпискаЗаказов КАК eComm_ЭкспрессНакладныеСпискаЗаказов ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.eComm_СтатусыЭкспрессНакладных КАК eComm_СтатусыЭкспрессНакладных ПО eComm_ЭкспрессНакладныеСпискаЗаказов.ЭкспрессНакладная = eComm_СтатусыЭкспрессНакладных.ЭкспрессНакладная ПО eComm_ЭкспрессНакладныеСпискаЗаказов.ДокументОснование = ДокументЗаказКлиента.Ссылка} {ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СообщениеSMS.Ссылка) КАК КоличествоSMS, СообщениеSMS.ВзаимодействиеОснование КАК ДокОснование ИЗ Документ.СообщениеSMS КАК СообщениеSMS ГДЕ СообщениеSMS.ПометкаУдаления = ЛОЖЬ СГРУППИРОВАТЬ ПО СообщениеSMS.ВзаимодействиеОснование) КАК СообщенияSMS ПО ДокументЗаказКлиента.Ссылка = СообщенияSMS.ДокОснование} //-- ==== Редактирование роли "Базовые права УТ" ==== Для роли "Базовые права УТ" добавим право на чтение и просмотр к: * регистрам "eComm_СтатусыЭкспрессНакладных", "eComm_ЭкспрессНакладныеСпискаЗаказов" * документу "eComm_ЭкспрессНакладная" ==== Редактирование формы документа "СообщениеSMS" ==== === Метод "ОтправитьВыполнить" === Приведем код к следующему виду: Записать(); Оповестить("СообщениеSMSОтправлено"); //++ Закрыть(); ==== Редактирование общего модуля "ШаблоныСообщенийСервер" ==== === Метод "МассивОбъектовСДаннымиШаблоновСообщений" === Приведем код к следующему виду: Если ПолучитьФункциональнуюОпцию("ИспользоватьСчетаНаОплатуКлиентам") Тогда МассивОбъектовСДаннымиШаблоновСообщений.Добавить("Документ.СчетНаОплатуКлиенту"); КонецЕсли; МассивОбъектовСДаннымиШаблоновСообщений.Добавить("Документ.eComm_ЭкспрессНакладная"); //++ Возврат МассивОбъектовСДаннымиШаблоновСообщений; ==== Редактирование типа реквизита "ВзаимодействиеОснование" документа "СообщениеSMS" ==== * Дополним реквизит документа "ВзаимодействиеОснование" типом "ДокументСсылка.ЗаказКлиента" * Дополним реквизит формы элемента "ВзаимодействиеОснование" документа "СообщениеSMS" типом "ДокументСсылка.ЗаказКлиента" ===== Исправление ошибок подсистемы "Отправка SMS TURBO" ===== Если Вы используете провайдера TURBO SMS, тогда Вам, вероятно, понадобится исправить ошибки типовой конфигурации. ==== Редактирование табличной части "Адресаты" документа "СообщениеSMS" ==== В реквизите табличной части "Адресаты" документа "СообщениеSMS" увеличиваем длину реквизита "ИдентификаторСообщения" до 36 символов ==== Редактирование модуля "ОтправкаSMSЧерезTURBO" ==== === Метод "ОтправитьSMS" === Приведем код к следующему виду: Ответ = ПреобразоватьОтвет(ФайлОтвета, "ns1:ResultArray"); //ИдентификаторСообщения = Ответ.id; //++ //Результат.ОтправленныеСообщения.Добавить(Новый Структура("НомерПолучателя,ИдентификаторСообщения", // НомерПолучателя)); // //Если ЗначениеЗаполнено(Ответ) Тогда // Результат.ОписаниеОшибки = Результат.ОписаниеОшибки // + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='SMS на номер %1';uk='SMS на номер %1'"), Элемент) // + ": " + Ответ // + Символы.ПС; //КонецЕсли; Попытка ИдентификаторСообщения = Новый УникальныйИдентификатор(Ответ); УспешноОтправлено = Истина; Исключение УспешноОтправлено = Ложь; КонецПопытки; Если УспешноОтправлено Тогда Результат.ОтправленныеСообщения.Добавить(Новый Структура("НомерПолучателя,ИдентификаторСообщения", Элемент, Ответ)); Иначе Результат.ОписаниеОшибки = Результат.ОписаниеОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='SMS на номер %1';uk='SMS на номер %1'"), Элемент) + ": " + Ответ + Символы.ПС; КонецЕсли; //-- === Метод "СтатусДоставки" === Приведем код к следующему виду: | | | | " + ИдентификаторСообщения + " | | //++ //Баланс = ПреобразоватьОтвет(ФайлОтвета, "ns1:GetCreditBalanceResult"); //УдалитьФайлы(ФайлОтвета); //Ответ = Неопределено; //Запрос = Неопределено; //Соединение = Неопределено; //Возврат Баланс; СтатусДоставки = ПреобразоватьОтвет(ФайлОтвета, "ns1:GetMessageStatusResult"); УдалитьФайлы(ФайлОтвета); Возврат СтатусДоставкиSMS(СтатусДоставки); //-- === Метод "ПреобразоватьОтвет" === Приведем код к следующему виду: Если СокрЛП(ЧтениеХМЛ.Имя) <> Тег и ЧтениеХМЛ.ТипУзла <> ТипУзлаXML.Текст Тогда Продолжить; ИначеЕсли ЧтениеХМЛ.ТипУзла = ТипУзлаXML.Текст и СокрЛП(ЧтениеХМЛ.Имя) = "#text" Тогда //++ //ЗначениеВозврата = СокрЛП(ЧтениеХМЛ.Значение); //Прервать; Если ЧтениеХМЛ.Значение = "Сообщения успешно отправлены" Тогда Продолжить; Иначе ЗначениеВозврата = СокрЛП(ЧтениеХМЛ.Значение); Прервать; КонецЕсли; //-- КонецЕсли; === Добавим метод "СтатусДоставкиSMS" в конце модуля === Функция СтатусДоставкиSMS(СтатусСтрокой) //Сообщение с ID X не найдено //Не достаточно параметров для выполнения функции //Вы не авторизированы //Отправлено //В очереди //Сообщение передано в мобильную сеть //Сообщение доставлено получателю //Истек срок сообщения //Удалено оператором //Не доставлено //Сообщение доставлено на сервер //Отклонено оператором //Неизвестный статус //Ошибка, сообщение не отправлено //Не достаточно кредитов на счете //Отправка отменена //Отправка приостановлена //Удалено пользователем СоответствиеСтатусов = Новый Соответствие; СоответствиеСтатусов.Вставить("" , "НеОтправлялось"); СоответствиеСтатусов.Вставить("Отправка приостановлена" , "НеОтправлялось"); // SCHEDULED СоответствиеСтатусов.Вставить("В очереди" , "Отправляется"); // ENROUTE СоответствиеСтатусов.Вставить("Сообщение передано в мобильную сеть" , "Отправляется"); // ENROUTE СоответствиеСтатусов.Вставить("Сообщение доставлено на сервер" , "Отправляется"); // ENROUTE СоответствиеСтатусов.Вставить("Сообщение доставлено получателю" , "Доставлено"); // DELIVERED СоответствиеСтатусов.Вставить("Истек срок сообщения" , "НеДоставлено"); // EXPIRED СоответствиеСтатусов.Вставить("Отправка отменена" , "НеДоставлено"); // DELETED СоответствиеСтатусов.Вставить("Удалено пользователем" , "НеДоставлено"); // DELETED СоответствиеСтатусов.Вставить("Ошибка, сообщение не отправлено" , "НеДоставлено"); // UNDELIVERABLE СоответствиеСтатусов.Вставить("Отправлено" , "Отправлено"); // ACCEPTED СоответствиеСтатусов.Вставить("Неизвестный статус" , "Ошибка"); // UNKNOWN СоответствиеСтатусов.Вставить("Отклонено оператором" , "НеОпознаноПровайдером"); // REJECTED СоответствиеСтатусов.Вставить("Удалено оператором" , "НеОпознаноПровайдером"); // DISCARDED СоответствиеСтатусов.Вставить("Не доставлено" , "НеДоставлено"); // SENDING СоответствиеСтатусов.Вставить("Не достаточно кредитов на счете" , "НеДоставлено"); // NOT_SUPPORTED СоответствиеСтатусов.Вставить("Вы не авторизированы" , "НеДоставлено"); // WRONG_ALPHANAME СоответствиеСтатусов.Вставить("Не достаточно параметров для выполнения функции", "НеДоставлено"); // WRONG_ALPHANAME_RETURNED Результат = СоответствиеСтатусов[СтатусСтрокой]; Возврат ?(Результат = Неопределено, "Ошибка", Результат); КонецФункции ==== Общая форма "НастройкаОтправкиSMS" ==== Добавим на форму реквизит "ИмяОтправителя" (Строка) === Метод "ПриЗаписиНаСервере" === ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ЛогинДляОтправкиSMS, "Логин"); //++ ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ИмяОтправителя, "ИмяОтправителя"); //-- УстановитьПривилегированныйРежим(Ложь); === Метод "ПриСозданииНаСервере" === ПарольИЛогин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "Пароль, Логин, ИмяОтправителя"); //++ eComm+ / Добавлен параметр "ИмяОтправителя" УстановитьПривилегированныйРежим(Ложь); ЛогинДляОтправкиSMS = ПарольИЛогин.Логин; ПарольДляОтправкиSMS = ?(ЗначениеЗаполнено(ПарольИЛогин.Пароль), ЭтотОбъект.УникальныйИдентификатор, ""); ИмяОтправителя = ПарольИЛогин.ИмяОтправителя; //++ eComm+ / Добавлена строка ==== Общий модуль "ОтправкаSMS" ==== === Метод "НастройкиОтправкиSMS" === Результат = Новый Структура("Логин, Пароль, Провайдер,ИмяОтправителя"); //++ eComm+ Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.ПровайдерSMS"); УстановитьПривилегированныйРежим(Истина); ПарольИЛогин = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "Пароль,Логин,ИмяОтправителя");//++ eComm+ УстановитьПривилегированныйРежим(Ложь); Результат.Логин = ПарольИЛогин.Логин; Результат.Пароль = ПарольИЛогин.Пароль; Результат.ИмяОтправителя = ПарольИЛогин.ИмяОтправителя; //++ eComm+ Результат.Провайдер =Константы.ПровайдерSMS.Получить(); КонецЕсли; === Метод "ОтправитьSMS" === НастройкиОтправкиSMS = НастройкиОтправкиSMS(); Если НастройкиОтправкиSMS.Провайдер = Перечисления.ПровайдерыSMS.TURBO Тогда // TURBOSMS Результат = ОтправкаSMSЧерезTURBO.ОтправитьSMS(НомераПолучателей, Текст, НастройкиОтправкиSMS.ИмяОтправителя, НастройкиОтправкиSMS.Логин, НастройкиОтправкиSMS.Пароль); Обратите внимание что расписание обновлений справочников необходимо настраивать ТОЛЬКО ПОСЛЕ ПЕРВОНАЧАЛЬНОГО РУЧНОГО ОБНОВЛЕНИЯ СПРАВОЧНИКОВ. Иначе города/отделения/улицы могут задублироваться