gifts2017

Единая федеральная автоматизированная информационная система сведений о показах фильмов в кинозалах (ЕАИС) + 1С

Опубликовал Дмитрий Канин (Dicc) в раздел Обмен - Интеграция с WEB

Представляю кусок кода в 1с для отправки POST-запроса сведений о публичной демонстрации кинофильмов в кинозалах российских кинотеатров.
Согласно приказу №56 Минкульта РФ от 08.02.2011.

Доброго времени дня коллеги, вряд ли кого данная публикация заинтересует в виду ее узкой специфики, но да ладно, мне в свое время данная информация была нужна, может кому упрощу жизнь.

Предистория:

"Во исполнение поручения Президента Российской Федерации Министерством культуры Российской Федерации создана и функционирует единая федеральная автоматизированная информационная система сведений о показах фильмов в кинозалах (ЕАИС). Назначение указанной системы состоит в сборе, учёте и обработке сведений о публичной демонстрации кинофильмов в кинозалах российских кинотеатров."

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

Итак, дано :

"приказа №56 Минкульта РФ от 08.02.2011" - описывается механизм передачи данных.

Сайт ekinobilet.ru - сайт системы (ЕАИС)

Логин, пароль, id(демонстратора фильма) - выдаются при регистрации (процесс регистрации описан на сайте)

Задача:

Реализовать механизм отправки данных по продажам билетов на сайт системы в рамках платформы 1с:8.2

Решение:

Login, Password - имя пользователя и пароль выданный при регистрации в системе ЕАИС

XMLFile - путь к отправляемому файлу "*.zip"(xml - положил в архив)

ИмяФайлаXml - имя отправляемого файла.

Процедура ОтправитьPOSTЗапрос(Login,Password,XMLFile,ИмяФайлаXml)
    //Подготовка переменных
    массивФайлов = Новый Массив;
    Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    ИмяФайлаСПараметрами = ПолучитьимяВременногоФайла("txt"); // первый файл, содержащий параметры    
    ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаСПараметрами);
    ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("xml"); // наш сервер возвращает ответы в виде XML
    
    // параметр "login"
        //Заголовок
        ЗаписьТекста.ЗаписатьСтроку("Content-type: multipart/form-data, boundary="+Boundary);
        ЗаписьТекста.ЗаписатьСтроку("");
        //
        ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""login""");
        ЗаписьТекста.ЗаписатьСтроку("");
        ЗаписьТекста.ЗаписатьСтроку(Login);
    // параметр "password"
        ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""password""");
        ЗаписьТекста.ЗаписатьСтроку("");
        ЗаписьТекста.ЗаписатьСтроку(Password);
    // параметр "zip"
        ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""XMLfile""; filename="+""""+ИмяФайлаXml+"""");
        ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/x-zip-compressed");
        ЗаписьТекста.ЗаписатьСтроку("");
        ЗаписьТекста.Закрыть(); // заканчиваем работу с zip
 
        массивФайлов.Добавить(имяФайлаСПараметрами); // добавляем zip-файл для объединения
        массивФайлов.Добавить(XMLFile); // добавляем архив для объединения
        
        // файл, закрывающий параметры
        ИмяФайлаСПараметрами = ПолучитьимяВременногоФайла("txt");
        ЗаписьТекста = Новый ЗаписьТекста(имяФайлаСПараметрами);
        ЗаписьТекста.ЗаписатьСтроку("");
        ЗаписьТекста.ЗаписатьСтроку("--"+boundary+"--");
        ЗаписьТекста.Закрыть(); // заканчиваем работу с файлом, закрывающим параметры
        массивФайлов.Добавить(имяФайлаСПараметрами); // добавляем файл, закрывающий параметры
        // результирующий файл, который и будет отправлен
        ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("out");
        // объединим все файлы
        ОбъединитьФайлы(МассивФайлов, ИмяФайлаОтправки);
         //Данные для заголовка
        ФайлОтправки = Новый Файл(имяФайлаОтправки);
        РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
        // передадим данные на сервер
        Заголовки = Новый Соответствие();
        Заголовки.Вставить("Content-Type", "multipart/form-data, boundary="+boundary);
        Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
        Соединение = Новый HTTPСоединение("ekinobilet.ru",,Login,Password,,Истина);
        Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, "ekbs/upload.aspx", ИмяВыходногоФайла, Заголовки);

    // удалим файл отправки - он больше не нужен
    Попытка
        УдалитьФайлы(имяФайлаОтправки);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    // обработаем ответ сервера    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(имяВыходногоФайла);
    
    Пока ЧтениеXML.Прочитать() Цикл
        // Прочитать "структурные части" элементов.
        // Проверить, какая часть элемента - текущая.
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяУзла = ЧтениеXML.Имя; Сообщить("--" + ИмяУзла);
            // Атрибуты элементов можно читать только если текущая часть -
            // начало элемента
            Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
                // Прочитать данные узла атрибута.
                ТипУзла = ЧтениеXML.ТипУзла;
                Имя = ЧтениеXML.Имя;
                Значение = ЧтениеXML.Значение;
                // Обработать полученные значения.
            КонецЦикла;
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
            // В примере просто выводим текст в окно сообщений.
            Сообщить("Текст:" + ЧтениеXML.Значение);
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            // В примере просто выводим признак конца элемента
            // в окно сообщений Сообщить("--Конец:" + Чтение.Имя);
        КонецЕсли;         
    КонецЦикла;
    ЧтениеXML.Закрыть();
    // удаляем файл после использования
    Попытка
        УдалитьФайлы(имяВыходногоФайла);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;        
КонецПроцедуры  
П.С.
Процедура не претендует на "илитарность", но думаю, может пригодиться.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений ' (WanGoff) 23.10.13 10:31
Может и мало кого заинтересует, но направление... прикольное. Вот такое слово я использую.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа