воскресенье, 25 февраля 2018 г.

Работа с контактной информацией сотрудника

Данное дествие необратимо, оно приведет к переносу (копированию) информации:
- мобильный телефон
- электронная почта
- домашний телефон
- рабочий телефон
- адрес прописки
- адрес проживания 
из дополнительных данных сотрудника в личные данные сотрудника (контактная  информация).

Введенная ранее вручную контактная информация в "Личных данных" будет перезаписана без возможности восстановления.

Внимание! Информация в дополнительных данных является первичной по отношению к личным данным.



&НаСервере
Процедура КомандаНачатьПереносДанныхНаСервере()
 //начать пребор сотрудников 
 Выборка = Справочники.Сотрудники.Выбрать(); 
 Счетчик = 1;
 Пока Выборка.Следующий() = 1 Цикл
  //получить доп. данные сотрудника: мобильный телефон, электронная почта, домашний телефон, рабочий телефон
  ТекущийСотрудник = Выборка.Наименование;
  КодТекущийСотрудник = Выборка.Код;
  МобильныйТелефон = Выборка.phonemobile;
  ЭлектроннаяПочта = Выборка.email;
  ДомашнийТелефон = Выборка.phonehome;
  РабочийТелефон = Выборка.phonework;
  АдресПрописки = Выборка.address;
  АдресПроживания = Выборка.addresshome;
  //записать личные данные сотрудника
  РезультатПоиска = Справочники.Сотрудники.НайтиПоНаименованию(ТекущийСотрудник);
  ФЛ=РезультатПоиска.ФизическоеЛицо.ПолучитьОбъект();
  ФЛ.КонтактнаяИнформация.Очистить();
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,МобильныйТелефон,Справочники.ВидыКонтактнойИнформации.ТелефонМобильныйФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.Телефон);
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,ЭлектроннаяПочта,Справочники.ВидыКонтактнойИнформации.EMailФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,ДомашнийТелефон,Справочники.ВидыКонтактнойИнформации.ТелефонДомашнийФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.Телефон);
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,РабочийТелефон,Справочники.ВидыКонтактнойИнформации.ТелефонРабочийФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.Телефон);
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,АдресПрописки,Справочники.ВидыКонтактнойИнформации.АдресПоПропискеФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.Адрес);
  УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(ФЛ,АдресПроживания,Справочники.ВидыКонтактнойИнформации.АдресМестаПроживанияФизическиеЛица,Перечисления.ТипыКонтактнойИнформации.Адрес);
  ФЛ.Записать(); 
  Сообщение = "Сотрудник "+Счетчик+" "+ Выборка.Наименование+" Моб. телефон: "
  +МобильныйТелефон+" Эл. почта: "+ЭлектроннаяПочта
  +" Дом. телефон: "+ДомашнийТелефон+" Раб. телефон: "+РабочийТелефон
  +" Адрес прописки: "+АдресПрописки+" Адрес проживания: "+АдресПроживания;
  Сообщить (Сообщение);
  ПорталПротейНаСервере.Логгер ("Перенос в личные данные:", Сообщение, );
  Счетчик = Счетчик +1;
 КонецЦикла; 
КонецПроцедуры

&НаКлиенте
Процедура КомандаНачатьПереносДанных(Команда)
 КомандаНачатьПереносДанныхНаСервере();
КонецПроцедуры

понедельник, 19 февраля 2018 г.

Возврат из функции нескольких значений через структуру

Возврат из функции нескольких значений через структуру

&НаСервере
Функция ПолучитьДанныеСотрудникаИз1С(IDТекущегоСотрудника) Export
  
.......
     //для передачи на сервер всего этого колхоза данных сформируем структуру данных
     ДанныеСотрудникаИз1с = Новый Структура; 
     ДанныеСотрудникаИз1с.Вставить("id_1c", id_1c);
     ДанныеСотрудникаИз1с.Вставить("workerid_1c", IDТекущегоСотрудника);    
     Возврат ДанныеСотрудникаИз1с; //передадим данные в форму
    КонецФункции  



Принимаем значения в процедуре
Процедура ОбновитьЗапись1С(Команда)
 
 ДанныеСотрудникаИз1с = ПорталПротейНаСервере.ПолучитьДанныеСотрудникаИз1С(IDТекущегоСотрудника); // получаем данные сотрудника из 1с
 id_1c = ДанныеСотрудникаИз1с.id_1c;
 workerid_1c = ДанныеСотрудникаИз1с.workerid_1c;
 
КонецПроцедуры

Изменение элемента справочника

Изменение элемента справочника

// установка deleted в данных сотрудника по отметеке "в архиве"
&НаСервере
Процедура УстановитьDeleted(КодСотрудника, ЗначениеВАрхиве) Export
 
 СсылкаНаТекущегоСотрудника = Справочники.Сотрудники.НайтиПоКоду(КодСотрудника);
   Если Не СсылкаНаТекущегоСотрудника.Пустая() Тогда
          НовыеДанныеСотрудникаВСправочник = СсылкаНаТекущегоСотрудника.ПолучитьОбъект();
   НовыеДанныеСотрудникаВСправочник.deleted = ЗначениеВАрхиве;
   НовыеДанныеСотрудникаВСправочник.Записать();
   КонецЕсли; 
КонецПроцедуры

воскресенье, 18 февраля 2018 г.

Запрос через функцию

Запрос через функцию

&НаСервере
Функция ПолучитьКодРуководителяПодразделения(КодПодразделения) Export
 //получаем код руководителя подразделения текущего сотрудника
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   | Сотрудники.Код КАК Код,
   | ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение.Код КАК ТекущееПодразделениеКод,
   | Сотрудники.head КАК head,
   | ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение КАК ТекущееПодразделение,
   | ТекущиеКадровыеДанныеСотрудников.Сотрудник КАК Сотрудник
   |ИЗ
   | РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
   |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
   |  ПО ТекущиеКадровыеДанныеСотрудников.Сотрудник.Код = Сотрудники.Код
   |ГДЕ
   | ТекущиеКадровыеДанныеСотрудников.ТекущееПодразделение.Код = &departmentid_1c
   | И Сотрудники.head = &head";
   Запрос.УстановитьПараметр("head", True);
   Запрос.УстановитьПараметр("departmentid_1c", КодПодразделения);
   
   Результат = Запрос.Выполнить();
      Выборка = Результат.Выбрать();
      Пока Выборка.Следующий() Цикл
           КодРуководителяПодразделения = Выборка.Код;
      КонецЦикла;
   Возврат КодРуководителяПодразделения;
 
КонецФункции 

Пример использования REST API

Использование REST API со стороны 1с

Вызов

Результат = ПорталПротейНаСервере.WorkerBasic("GET", httpResponse, Отладка);
 

Процедура

&НаСервере
Функция WorkerBasic(ТипЗапроса, httpResponse, Отладка) Export
 //Типи запросов: POST, GET, PUL, DELETE
 companycode = ПорталПротейНаСервере.КодКомпании();
 ПараметрГЕТ = "";
 Если ТипЗапроса="POST" Тогда
  httpResponse = httpResponse; 
  Адрес = "/api/worker/add.worker";
 ИначеЕсли ТипЗапроса="PUT" Тогда 
  httpResponse = httpResponse; 
  Адрес = "/api/worker/update.worker"; 
 ИначеЕсли ТипЗапроса="DELETE" Тогда 
  ПараметрГЕТ = "?externalId=" + httpResponse + "&companyCode=" + CompanyCode; 
  Адрес = "/api/worker/delete.worker"; 
 ИначеЕсли ТипЗапроса="GET" Тогда
  ПараметрГЕТ = "?id=" + httpResponse + "&companyCode=" + CompanyCode; 
  Адрес = "/api/worker/get.worker";
 КонецЕсли;
 
 Попытка 
  АдресСтраницыНаСервере =  Адрес + ПараметрГЕТ; // ЗАПРОС
  ЗащищенноеСоединение=Ложь;
  Таймаут=30; // ждем ответ от сервера 30 сек
  
  СерверПриемник = "newportal.protei:8090"; //имя сервера  
  ЗаголовкиHTTP = Новый Соответствие;
  ЗаголовкиHTTP.Вставить("Content-Type", "application/xml");
  
  SSL =  ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
  НТТР = Новый HTTPСоединение(СерверПриемник, , , , , Таймаут, SSL);
  
  резутатПолучен=Ложь;
  Попытка
   //Формируем HTTP запрос
   ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
   //Устанавливает строку, из которого будет прочитано тело POST-запроса.
   ЗапросHTTP.УстановитьТелоИзСтроки(httpResponse);
   
   //Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
   Если ТипЗапроса="GET" Тогда
    ОтветHTTP = НТТР.ВызватьHTTPМетод("GET",ЗапросHTTP);
   ИначеЕсли ТипЗапроса="POST" Тогда
    ОтветHTTP = НТТР.ВызватьHTTPМетод("POST",ЗапросHTTP);
   ИначеЕсли ТипЗапроса="PUT" Тогда
    ОтветHTTP = НТТР.ВызватьHTTPМетод("PUT",ЗапросHTTP);
   ИначеЕсли ТипЗапроса="DELETE" Тогда
    ОтветHTTP = НТТР.ВызватьHTTPМетод("DELETE",ЗапросHTTP);
   Иначе
    ВызватьИсключение("Неизвестный запрос: "+ТипЗапроса+"!");
   КонецЕсли;
   резутатПолучен=Истина;
   
  Исключение
   ТекстСообщения = НСтр("ru = 'Неудачная попытка соединения с '")  + СерверПриемник + ": " + ОписаниеОшибки();
   Если Отладка = Истина Тогда
    Сообщить("ПЛОХО "+ТекстСообщения); 
   КонецЕсли;
   Логгер(ТипЗапроса, АдресСтраницыНаСервере, "ПЛОХО "+ТекстСообщения);
  КонецПопытки;
  
  ПолученныеДанные="";
   Если Отладка = Истина Тогда
    //Сообщить ("StatusCode = " + ОтветHTTP.КодСостояния); 
   КонецЕсли;
  Если резутатПолучен Тогда
   Если ОтветHTTP.КодСостояния = 200 Тогда                                                                                        
    // теперь можно разбирать ответ
    ЗаголовкиHTTP = ОтветHTTP.Заголовки;
    ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
    ПолученныеДанные = ОтветHTTP.ПолучитьТелоКакСтроку();
   Иначе
    Если Отладка = Истина Тогда
     Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
    КонецЕсли;
   КонецЕсли;
   Логгер(ТипЗапроса + АдресСтраницыНаСервере + httpResponse  , "StatusCode = " + ОтветHTTP.КодСостояния, ПолученныеДанные);
  КонецЕсли;
  
  //Возврат ПолученныеДанные;
  //Сообщить(ПолученныеДанные);
  Возврат (ПолученныеДанные);
 Исключение
   ТекстОшибки = ОписаниеОшибки();
  Если Отладка = Истина Тогда
    Сообщить(ОписаниеОшибки()); 
  КонецЕсли;
  Логгер("PUT ", "error",  ТекстОшибки );
 КонецПопытки

КонецФункции

Способ задания "глобальных" переменных через функцию

Способ задания "глобальных" переменных через функцию


&НаСервере    
Функция КодКомпании() Export
 // protei для ООО Протей или protei-st для ООО Протей-СТ
 Companycode = "protei";
 Возврат CompanyCode;
Конецфункции

&НаСервере
Функция ПризнакОтладки() Export
 // Ложь - не выводить служебные  сообщения, Истина - выводить служебные сообщения
 Отладка = Истина;
 Возврат Отладка;
Конецфункции