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

Представляю кусок кода в 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 Comment

  1. WanGoff

    Может и мало кого заинтересует, но направление… прикольное. Вот такое слово я использую.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *