пятница, 8 ноября 2019 г.

Работа с файлами xml





&НаКлиенте
Процедура СформироватьДокументККМXML()
 ПолноеИмяФайлаXML = "C:\CheckKKM\SalesDocumentIn.xml";
 ВыбранныйФайл = Новый Файл(ПолноеИмяФайлаXML);
 Если Не ВыбранныйФайл.Существует() Тогда
  Возврат
 КонецЕсли;

  //перемещаем файл с клиенат на сервер для обработки
  ВыбраныйФайл = "C:\CheckKKM\SalesDocumentIn.xml"; //ДиалогОткрытияФайла.ПолноеИмяФайла;
     АдресВременногоХранилища = "";
     ПоместитьФайл(АдресВременногоХранилища, ВыбраныйФайл, ,Ложь, ЭтаФорма.УникальныйИдентификатор);
     ЗагрузитьДанные(АдресВременногоХранилища);
 
 
  // удаляем файл
  /////////////////////////////////////////////////
  ИмяФайлаККМ = "C:\CheckKKM\SalesDocumentIn.xml";
  ПолноеИмяФайла = Новый Файл(ИмяФайлаККМ);
  Если ПолноеИмяФайла.Существует() Тогда
   УдалитьФайлы(ПолноеИмяФайла);
  КонецЕсли;
 
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанные(АдресВременногоХранилища)
  ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
  ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
  ДвоичныеДанные.Записать(ИмяВременногоФайла);

  ТекстИзXML = Новый ТекстовыйДокумент;
  ТекстИзXML.Прочитать(ИмяВременногоФайла, КодировкаТекста.UTF8);
  ЗаполнитьДокументККМ(ТекстИзXML.ПолучитьТекст());
  Попытка
      УдалитьФайлы(ИмяВременногоФайла);
  Исключение
  КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДокументККМ(ТекстXML)// (ПолучитьТекст)
 ОбщаяСуммаДокумента     = 0;
 НовыйДокументККМ     = Документы.ЧекККМ.СоздатьДокумент();
     ВидЦены       = Справочники.ВидыЦен.НайтиПоНаименованию("РОЗНИЦА");
  НовыйДокументККМ.Валюта   = Справочники.Валюты.НайтиПоНаименованию("руб.");
  НовыйДокументККМ.Дата   = ТекущаяДата();
  НовыйДокументККМ.КассаККМ  = Справочники.КассыККМ.НайтиПоНаименованию("Фискальный регистратор (Склад НМ-ИП)");
  НовыйДокументККМ.Кассир   = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван");
  НовыйДокументККМ.Склад   = Справочники.Склады.НайтиПоНаименованию("Склад НМ-ИП");
  НовыйДокументККМ.Статус   = Перечисления.СтатусыЧековККМ.Отложен;
  НовыйДокументККМ.ВидЦены  = ВидЦены;
  НовыйДокументККМ.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС;
   //ТЧ Товары в Документе Чек ККМ
      ЧтениеXML = Новый ЧтениеXML;
      ЧтениеXML.УстановитьСтроку(ТекстXML);
      ПостроительDOM = Новый ПостроительDOM;
      ДокументDOM  = ПостроительDOM.Прочитать(ЧтениеXML);
      GOODS = ДокументDOM.ПолучитьЭлементыПоИмени("GOODS");
      НовыйДокументККМ.Товары.Очистить();
       Для Позиц=0 По GOODS.Количество()-1 Цикл
        ДочерниеУзлы = GOODS[Позиц].ДочерниеУзлы;
        Для Каждого Узел Из ДочерниеУзлы Цикл
         Если Узел.ИмяУзла = "NOMENCLATURE" Тогда
          НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию(Строка(Узел.ТекстовоеСодержимое));
         ИначеЕсли Узел.ИмяУзла = "REMAINS" Тогда
          ОстатокКоличество = Число(Узел.ТекстовоеСодержимое);
           //проверить на существование товара на данном "Склад НМ-ИП" складе
           Если ПроверкаНаНаличиеДаннойНоменклатуры(НоменклатураСсылка) Тогда
            ДобавитьСтрокуСТоваромВДокументе(НоменклатураСсылка,ОстатокКоличество,НовыйДокументККМ,ВидЦены,ОбщаяСуммаДокумента);
           КонецЕсли;
         КонецЕсли;
        КонецЦикла;
       КонецЦикла;
  НовыйДокументККМ.Комментарий  = "Произведено формирование данного документа ККМ из внешней обработки  " + Символы.ПС + "Дата :" + ТекущаяДата();
  НовыйДокументККМ.СуммаДокумента  = ОбщаяСуммаДокумента;
  // 08122016
  // Закоменчено из-за проверки Функция ВнесенаОплата()
  // Процедура ПередЗакрытиемЧека(Отказ, ОписаниеОповещения = Неопределено)
        // НовыйДокументККМ.ПолученоНаличными = ОбщаяСуммаДокумента;

  // установить ссылку нового документа с номеров и датой
  СсылкаНаОбъект = Документы.ЧекККМ.ПолучитьСсылку();
  НовыйДокументККМ.УстановитьСсылкуНового(СсылкаНаОбъект);
  НовыйДокументККМ.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
&НаСервере
Функция ПроверкаНаНаличиеДаннойНоменклатуры(НоменклатураСсылка)
 Запрос = Новый Запрос;
 Запрос.УстановитьПараметр("Номенклатура", НоменклатураСсылка);
 Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("Склад НМ-ИП"));
 Запрос.Текст = "ВЫБРАТЬ
     | СвободныеОстаткиОстатки.Склад,
     | СвободныеОстаткиОстатки.Номенклатура,
     | СвободныеОстаткиОстатки.ВНаличииОстаток,
     | СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток,
     | СУММА(СвободныеОстаткиОстатки.ВНаличииОстаток - СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток) КАК Остаток
     |ИЗ
     | РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
     |ГДЕ
     | СвободныеОстаткиОстатки.Склад = &Склад
     | И СвободныеОстаткиОстатки.Номенклатура = &Номенклатура
     |
     |СГРУППИРОВАТЬ ПО
     | СвободныеОстаткиОстатки.Склад,
     | СвободныеОстаткиОстатки.Номенклатура,
     | СвободныеОстаткиОстатки.ВНаличииОстаток,
     | СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток
     |
     |ИМЕЮЩИЕ
     | СУММА(СвободныеОстаткиОстатки.ВНаличииОстаток - СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток) > 0";
 РезультатЗапроса = Запрос.Выполнить();
 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 Если ВыборкаДетальныеЗаписи.Количество() <> 0 Тогда
  ВыборкаДетальныеЗаписи.Следующий();
  Если ВыборкаДетальныеЗаписи.Остаток > 0 Тогда
   Возврат Истина;
  Иначе
   Возврат Ложь;
  КонецЕсли;
 Иначе
  Возврат Ложь;
 КонецЕсли;
КонецФункции

Комментариев нет:

Отправить комментарий