пятница, 27 сентября 2019 г.

Загрузка данных в документ ККМ из XML



Загрузка данных в документ из XML




&НаКлиенте
Процедура ОбновитьСписок(Команда)
 //ЗагрузкаДанныхДляДокументаККМ.СформироватьДокументККМ();
 //ЭтаФорма.ОбновитьОтображениеДанных(ЧекиККМ);
 СформироватьДокументККМXML();
КонецПроцедуры



&НаСервере
Процедура СформироватьДокументККМXML()
  ЗагрузитьДанные();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанные()
 ПолноеИмяФайлаXML = "C:\pricexls1\SalesDocumentInOOO.xml";
 ВыбранныйФайл = Новый Файл(ПолноеИмяФайлаXML);
 Если Не ВыбранныйФайл.Существует() Тогда
  Возврат
 КонецЕсли;
 ТекстИзXML = Новый ТекстовыйДокумент;
 ТекстИзXML.Прочитать(ПолноеИмяФайлаXML, КодировкаТекста.UTF8);
 ЗаполнитьДокументККМ(ТекстИзXML.ПолучитьТекст());
 УдалитьФайлы(ПолноеИмяФайла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 Тогда
   Возврат Истина;
  Иначе
   Возврат Ложь;
  КонецЕсли;
 Иначе
  Возврат Ложь;
 КонецЕсли;
КонецФункции


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



&НаСервере
Процедура ДобавитьСтрокуСТоваромВДокументе(НоменклатураСсылка,ОстатокКоличество,НовыйДокументККМ,ВидЦены,ОбщаяСуммаДокумента)
  Если НЕ НоменклатураСсылка.Пустая() И НоменклатураСсылка <> НеОпределено Тогда
   ЦенаПолучить       = ПолучитьЦенуТовара(НоменклатураСсылка,ВидЦены);
   ТЧТовары         = НовыйДокументККМ.Товары.Добавить();
   ТЧТовары.Количество      = ОстатокКоличество;
   ТЧТовары.КоличествоУпаковок    = ОстатокКоличество;
   ТЧТовары.Номенклатура      = НоменклатураСсылка;
   ТЧТовары.Упаковка       = Справочники.УпаковкиНоменклатуры.НайтиПоНаименованию("шт."); //НоменклатураСсылка.ЕдиницаИзмерения;
   ТЧТовары.Цена        = ЦенаПолучить; //ПолучитьЦенуТовара(НоменклатураСсылка,ВидЦены);
   СуммаПозиции        = ЦенаПолучить * ОстатокКоличество;
   ТЧТовары.Сумма         = СуммаПозиции;
   ТЧТовары.СтавкаНДС       = Перечисления.СтавкиНДС.БезНДС;
   ТЧТовары.Продавец       = Справочники.Пользователи.НайтиПоНаименованию("... Пётр Михайлович");
   ОбщаяСуммаДокумента      = ОбщаяСуммаДокумента + СуммаПозиции;
  КонецЕсли;
КонецПроцедуры



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

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