ПРИЛОЖЕНИЕ 3
ЛИСТИНГ ПРОГРАММЫ
Функция ПолучитьНазваниеГруппы () Экспорт
Возврат Константы.НазваниеГруппы.Получить();
КонецФункции
Функция ПолучитьТекущийКурс () Экспорт
Возврат Константы.ТекущийКурс.Получить();
КонецФункции
Функция ПолучитьПодгруппу () Экспорт
Возврат Константы.Подгруппа.Получить();
КонецФункции
//Получение почтовых констант
Функция ПолучитьПочтовыйАдрес() Экспорт
Возврат Константы.ПочтовыйАдрес.Получить();
КонецФункции
Функция ПолучитьИмя() Экспорт
Возврат Константы.Имя.Получить();
КонецФункции
Функция ПолучитьЛогин() Экспорт
Возврат Константы.Логин.Получить();
КонецФункции
Функция ПолучитьСерверИсходящейПочты() Экспорт
Возврат Константы.СерверИсходящейПочты.Получить();
КонецФункции
Функция ПолучитьПортSMTP() Экспорт
Возврат Константы.SMTPсервер.Получить();
КонецФункции
Функция ПолучитьПароль() Экспорт
Возврат Константы.Пароль.Получить();
КонецФункции
//Для ПРОКСИ
Функция ПолучитьПроксиЛогин() Экспорт
Возврат Константы.ПроксиЛогин.Получить();
КонецФункции
Функция ПолучитьПроксиПароль() Экспорт
Возврат Константы.ПроксиПароль.Получить();
КонецФункции
Функция ПолучитьФлагИспользоватьПрокси() Экспорт
Возврат Константы.ИспользоватьПрокси.Получить();
КонецФункции
Функция ПолучитьСерверПрокси() Экспорт
Возврат Константы.СерверПрокси.Получить();
КонецФункции
Функция ПолучитьПортПрокси() Экспорт
Возврат Константы.ПортПрокси.Получить();
КонецФункции
//Для Обмена данными с сайтом
Функция ПолучитьПрефиксНумерации() Экспорт
//Префикс= Константы.ПрефиксНумерации.Получить();
Префикс=Константы.НазваниеГруппы.Получить()+"-"+Константы.ТекущийКурс.Получить()+"0"+Константы.Подгруппа.Получить();
Возврат Префикс;
КонецФункции
&НаСервереБезКонтекста
Процедура ОткрытьФормуИзображения(ФормаВладелец, ОсновноеИзображение, Сотрудник) Экспорт
Если ОсновноеИзображение = Неопределено ИЛИ ОсновноеИзображение.Пустая() Тогда
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.Заголовок = "Выберите файл с изображением";
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
//ДиалогОткрытияФайла.Фильтр = ПолучитьФильтрИзображений();
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбранноеИзображение = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла, Ложь);
Иначе
Возврат;
КонецЕсли;
НовыйОбъект = Справочники.ХранилищеКартинок.СоздатьЭлемент();
НовыйОбъект.Фото= Новый ХранилищеЗначения(ВыбранноеИзображение, Новый СжатиеДанных);
НовыйОбъект.Сотрудник= Номенклатура;
ФормаИзображения = НовыйОбъект.ПолучитьФорму("ФормаЭлемента");
Иначе
ФормаИзображения = ОсновноеИзображение.ПолучитьФорму("ФормаЭлемента");
КонецЕсли;
ФормаИзображения.ВладелецФормы = ФормаВладелец;
ФормаИзображения.РежимВыбора = Истина;
ФормаИзображения.ЗакрыватьПриВыборе = Ложь;
ФормаИзображения.Открыть();
КонецПроцедуры
Функция ВключитьПрокси() Экспорт
Если ((ПолучитьФлагИспользоватьПрокси())=1)Тогда
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Пользователь = СерверныеМеханизмы.ПолучитьПроксиЛогин();
ПроксиСервер.Пароль = СерверныеМеханизмы.ПолучитьПроксиПароль();
ПроксиСервер.Порт(СерверныеМеханизмы.ПолучитьПортПрокси());
ПроксиСервер.Сервер(СерверныеМеханизмы.ПолучитьСерверПрокси());
Возврат ПроксиСервер;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьСтатусИзПеречислений(Статус) Экспорт
Если Статус="Учится" Тогда
Возврат Перечисления.СтатусыСтудентов.Учится;
ИначеЕсли Статус="Отчислен" Тогда
Возврат Перечисления.СтатусыСтудентов.Отчислен;
ИначеЕсли Статус="Повторно" Тогда
Возврат Перечисления.СтатусыСтудентов.Повторно;
ИначеЕсли Статус="Академ" Тогда
Возврат Перечисления.СтатусыСтудентов.Академ;
КонецЕсли;
КонецФункции
Процедура ОтправитьСообщенияОбмена(ИмяСервера,Порт,ИмяПользователя,ПарольПользователя,Таймаут,ЛогинНаСайте,ПарольНаСайте,Поддомен,ИспользоватьПоддомен) Экспорт
//Далее выбираем все узлы из плана обмена, за исключением текущего,
//у которых установлен реквизит ВыполнятьОбмен.
ВыборкаУзлов = ПланыОбмена.ОбменССайтом.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена.ОбменССайтом.ЭтотУзел() Тогда
Продолжить;
КонецЕсли;
//С помощью объектов ЗаписьXML и ЗаписьСообщения выполняем запись изменений
//для выбранного узла в xml-файл.
Сообщить("Создаю файл обмена.");
Узел = ВыборкаУзлов.Ссылка;
ЗаписьXML = Новый ЗаписьXML();
ИмяФайлаСообщения = КаталогВременныхФайлов() + "messagefromklient_"+ЛогинНаСайте+".xml";
ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения);
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Узел);
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
//Cоздаем новое соединение с ФТП, передаем ему полученный xml-файл и отправляем
Файл = Новый Файл(ИмяФайлаСообщения);
Сообщить("Соединяюсь с сервером...");
Попытка
Сервер = Новый FTPСоединение(ИмяСервера,Порт,ИмяПользователя,ПарольПользователя,СерверныеМеханизмы.ВключитьПрокси(),Истина,Таймаут);
Если ИспользоватьПоддомен=Истина Тогда
Папка="/www/"+Поддомен+"/obmen/";
Иначе
Папка="/www/obmen/";
КонецЕсли;
Попытка
Сервер.УстановитьТекущийКаталог(Папка);
Исключение
Сообщить("Ошибка: Неправильно задан каталог на сервере!");
КонецПопытки;
Попытка
Сервер.Записать(Файл.ПолноеИмя,Файл.Имя);
Исключение
Сообщить("Ошибка при записи файла обмена на сервер!");
КонецПопытки;
Сообщить("Выгрузка выполнена успешно! ");
Исключение
Сообщить("ОБМЕН: Ошибка при подключении по FTP! Обмен не выполнен! " +
ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
УдалитьФайлы(ИмяФайлаСообщения);
// --------- СОЕДИНИМСЯ И ЗАПУСТИМ СКРИПТ ОБМЕНА-------------
// Попытка
// Соединение=Новый HTTPСоединение(ИмяСервера,,ЛогинНаСайте,ПарольНаСайте,,);
// //Соединение=Новый HTTPСоединение("kurator.delphicomponent.ru");
// Исключение
// Сообщить("Не удалось установить соединение с сервером:"
// + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
// Возврат;
//КонецПопытки;
//
// //посылаем запрос выполнения скрипта обмена
// ФайлРезультата = ПолучитьИмяВременногоФайла();
// ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
//
////Будут проблемы при передаче параметра названиеГруппы из за того что можно использовать только латинские буквы
// СтрокаВыполненияСкрипта="/read.php";
// Попытка
// Соединение.Получить(СтрокаВыполненияСкрипта,КаталогВременныхФайлов() + "temp___.xml");
// Соединение = Неопределено;
// Сообщить("На сервере произведено обновление БД!");
// Сообщить("Смотри ответ во временном файле: "+КаталогВременныхФайлов() + "temp___.xml");
// Исключение
// Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
// КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ПолучитьСообщенияОбмена(ИмяСервера,Порт,ИмяПользователя,ПарольПользователя,Таймаут,ЛогинНаСайте,ПарольНаСайте,Поддомен,ИспользоватьПоддомен) Экспорт
ВыборкаУзлов = ПланыОбмена.ОбменССайтом.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена.ОбменССайтом.ЭтотУзел() Тогда
Продолжить;
КонецЕсли;
НазваниеГруппыНаКлиенте=СерверныеМеханизмы.ПолучитьНазваниеГруппы()+"-"+СерверныеМеханизмы.ПолучитьТекущийКурс()+"0"+СерверныеМеханизмы.ПолучитьПодгруппу();
//------------Скачиваем файл с сайта по FTP -------------------------
ИмяФайлаСообщения ="messagefromserver_"+ЛогинНаСайте+".xml";
ПринятыйФайл= КаталогВременныхФайлов() + "messagefromserver_"+ЛогинНаСайте+".xml";
//Временно отключим, т.к. медленно для отладки
Файл = Новый Файл(ИмяФайлаСообщения);
Попытка
Сервер = Новый FTPСоединение(ИмяСервера,Порт,ИмяПользователя,ПарольПользователя,СерверныеМеханизмы.ВключитьПрокси(),Истина,Таймаут);
Если ИспользоватьПоддомен=Истина Тогда
Папка="/www/"+Поддомен+"/obmen/";
Иначе
Папка="/www/obmen/";
КонецЕсли;
Сервер.УстановитьТекущийКаталог(Папка);
Сервер.Получить(Файл.ПолноеИмя,ПринятыйФайл);
Сообщить("Прием файла обмена завершен! "+ПринятыйФайл);
Исключение
Сообщить("Перед обменом не забудьте записать файл обмена на сайте!");
Сообщить("ОБМЕН: Ошибка при подключении по FTP! Обмен не выполнен! " +
ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Возврат;
КонецПопытки;
УдалитьФайлы(ИмяФайлаСообщения);
//------------Считываем полученный файл-------------------------------
НазваниеГруппы = Новый Массив; НазваниеГруппы=ПрочитатьСтудентов(ПринятыйФайл,"To","Строка",НазваниеГруппы);
НазваниеГруппыВФайлеОбмена =НазваниеГруппы[0];
Если НЕ НазваниеГруппыВФайлеОбмена=НазваниеГруппыНаКлиенте Тогда
Сообщить("Не совпадает название группы! Обмен невозможен!
|(на клиенте "+ НазваниеГруппыНаКлиенте+
",а в файле обмена "+НазваниеГруппыВФайлеОбмена+")");
Иначе
МассивКодов = Новый Массив;
МассивФамилий = Новый Массив;
МассивИмен = Новый Массив;
МассивОтчеств = Новый Массив;
МассивСтатусов = Новый Массив;
МассивРейтингов = Новый Массив; МассивКодов=ПрочитатьСтудентов(ПринятыйФайл,"Code","Строка",МассивКодов); МассивФамилий=ПрочитатьСтудентов(ПринятыйФайл,"Description","Строка",МассивФамилий); МассивИмен=ПрочитатьСтудентов(ПринятыйФайл,"Имя","Строка",МассивИмен); МассивОтчеств=ПрочитатьСтудентов(ПринятыйФайл,"Отчество","Строка",МассивОтчеств); МассивСтатусов=ПрочитатьСтудентов(ПринятыйФайл,"Статус","Строка",МассивСтатусов); МассивРейтингов=ПрочитатьСтудентов(ПринятыйФайл,"Рейтинг","Число",МассивРейтингов);
КоличествоСтудентов=МассивКодов.Количество();
//-------------------Обновляем БД где надо -------------------------------
Счетчик=0;
Пока Счетчик<�КоличествоСтудентов Цикл
Код=МассивКодов[Счетчик];
Фамилия=МассивФамилий[Счетчик];
Имя=МассивИмен[Счетчик];
Отчество=МассивОтчеств[Счетчик];
Статус=МассивСтатусов[Счетчик];
Рейтинг=МассивРейтингов[Счетчик];
Счетчик=Счетчик+1;
ОбновлениеБД(Код,Фамилия,Имя,Отчество,Рейтинг,Статус);
КонецЦикла;
УдалениеНеНужныхСтудентовИзСправочника(МассивКодов,Код);
КонецЕсли; //Сравнение Названия Группы
КонецЦикла; //Конец узла
КонецПроцедуры
Функция ПрочитатьСтудентов(ПринятыйФайл,НужноеЛокальноеИмя,НужныйТип,Массив)
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ИгнорироватьПробелы=Истина;
ЧтениеXML.ОткрытьФайл(ПринятыйФайл);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.ЛокальноеИмя = НужноеЛокальноеИмя Тогда
ЧитаемНужныйАтрибут = Истина;
Иначе
ЧитаемНужныйАтрибут = Ложь;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Если ЧитаемНужныйАтрибут Тогда
НужныйАтрибут = XMLЗначение(Тип(НужныйТип), ЧтениеXML.Значение);
Массив.Добавить(НужныйАтрибут);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Возврат Массив;
КонецФункции // ПрочитатьСтудентов()
&НаСервере
Процедура ОбновлениеБД(Код,Фамилия,Имя,Отчество,Рейтинг,Статус)
СсылкаНаСтудента=Справочники.Студенты.НайтиПоКоду(Код);
Если НЕ СсылкаНаСтудента.Пустая() Тогда
Студент=СсылкаНаСтудента.ПолучитьОбъект();
Студент.Наименование=Фамилия;
Студент.Имя=Имя;
Студент.Отчество=Отчество;
Студент.Рейтинг=Рейтинг;
Студент.Статус=СерверныеМеханизмы.ПолучитьСтатусИзПеречислений(Статус);
Студент.Записать();
Сообщить("Успешно изменили студента: "+Студент.Наименование);
Иначе
Сообщить("Студент не найден!");
НовыйСтудент=Справочники.Студенты.СоздатьЭлемент();
НовыйСтудент.Код=Код;
НовыйСтудент.Наименование=Фамилия;
НовыйСтудент.Имя=Имя;
НовыйСтудент.Отчество=Отчество;
НовыйСтудент.Рейтинг=Рейтинг;
НовыйСтудент.Статус=СерверныеМеханизмы.ПолучитьСтатусИзПеречислений(Статус);
НовыйСтудент.Записать();
Сообщить("Добавлен новый студент: "+Фамилия);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УдалениеНеНужныхСтудентовИзСправочника(МассивКодов,Код) //Теперь удалим Всех студентов, которых нет в файле обмена
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Студенты.Наименование,
| Студенты.Код,
| Студенты.Имя,
| Студенты.Отчество,
| Студенты.Рейтинг,
| Студенты.Статус
|ИЗ
| Справочник.Студенты КАК Студенты";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Код=Выборка.Код;
Если (МассивКодов.Найти(Код)=Неопределено) Тогда
Сообщить("Студент с кодом: "+Код +"- отсутствует в файле обмена!");
СсылкаНаСтудента=Справочники.Студенты.НайтиПоКоду(Код);
Студент=СсылкаНаСтудента.ПолучитьОбъект();
Студент.ПометкаУдаления=Истина;
Студент.Записать();
Сообщить("Пометили на удаление студента: "+Студент.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
|