+7 499 990-10-21

Попытка обмена с УТ11, формат АТОЛ\ШТРИХ

Re: Попытка обмена с УТ11, формат АТОЛ\ШТРИХ

Сообщение Бродяга_Джон » 19 мар 2013, 12:49

Код: Выделить всё
// Функция осуществляет загрузку отчета о продажах из ККМ, подключаемой в режиме Offline.
// (API v2.0)
//
// Параметры:
//  Объект                         - <*>
//                                 - Объект драйвера торгового оборудования.
//
//  Отчет                          - <ТаблицаЗначений>
//                                 - Выходной параметр; таблица, содержащая данные
//                                   о продажах за смену. Таблица содержит
//                                   следующие колонки:
//                                     Код        - <Число>
//                                                - Идентификатор проданного (возвращенного)
//                                                  товара.
//                                     Цена       - <Число>
//                                                - Цена за единицу товара.
//                                     Количество - <Число>
//                                                - Количество проданного (>0) или
//                                                  возвращенного (<0) товара.
//                                     Скидка     - <Число>
//                                                - Процент предоставленной скидки
//                                     Сумма      - <Число>
//                                                - Сумма позиции: >0 - продажа, <0 - возврат.
//
// Возвращаемое значение:
//  <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
//
Функция ЗагрузитьОтчет(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВыходныеПараметры)
    мРазделитель         = ПолучитьРазделитель();
   Результат              = Истина;
   НеизвестнаяТранзакция    = Ложь;
   НомерПоследнейСмены    = 0;

   Отчет    = Новый Массив;
   Чеки    = Новый Массив;
   Позиции = Новый Массив;
   
   Файл = Новый Файл(Параметры.ФайлОтчета);
   Если Не Файл.Существует() Тогда
      Индекс = Неопределено;
      Для Индекс = 1 По 10 Цикл
         ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Ожидание ответа кассы...'"));
         Пауза(5);
         Если Файл.Существует() Тогда
            Прервать;
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;

   Если Файл.Существует() Тогда
      Файл = Новый ТекстовыйДокумент();
      Попытка
         Файл.Прочитать(Параметры.ФайлОтчета);
      Исключение
         ВыходныеПараметры.Добавить(999);
         ОписаниеОшибки = НСтр("ru='Не удалось прочитать файл отчета по адресу: %Адрес%'");
         ВыходныеПараметры.Добавить(СтрЗаменить(ОписаниеОшибки, "%Адрес%", Параметры.ФайлОтчета));
         Результат = Ложь;
      КонецПопытки;
      Если Результат Тогда
         ТекущаяСтрока = Файл.ПолучитьСтроку(1);
         Если ТекущаяСтрока = "#" Тогда
            ИндексСтроки  = 4;
            ТекущаяСтрока = Файл.ПолучитьСтроку(ИндексСтроки);
            Пока Не ПустаяСтрока(ТекущаяСтрока) Цикл
               ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, мРазделитель, Символы.ПС);

               НомерТранзакцииСтр = СтрПолучитьСтроку(ТекущаяСтрока,  1);
               ТипТранзакцииСтр   = СтрПолучитьСтроку(ТекущаяСтрока,  4);
               НомерДокументаСтр  = СтрПолучитьСтроку(ТекущаяСтрока,  6);
               КодПричиныСтр      = СтрПолучитьСтроку(ТекущаяСтрока,  9);
               НомерСменыСтр      = СтрПолучитьСтроку(ТекущаяСтрока, 14);

               Попытка
                  ПолеОшибки = Нстр("ru='Номер транзакции (1)'");
                  НомерТранзакции    = Число(НомерТранзакцииСтр);
                  ПолеОшибки = Нстр("ru='Тип транзакции (4)'");
                  ТипТранзакции      = Число(ТипТранзакцииСтр);
                  ПолеОшибки = Нстр("ru='Номер документа (6)'");
                  НомерДокумента     = Число(НомерДокументаСтр);
                  ПолеОшибки = Нстр("ru='Номер смены (14)'");
                  НомерСмены         = Число(НомерСменыСтр);
               Исключение
                  ВыходныеПараметры.Добавить(999);
                  ВыходныеПараметры.Добавить(НСтр("ru='Неверный формат файла. Невозможно преобразовать к числу поле: '")+ПолеОшибки);
                  Результат = Ложь;
                  Прервать;
               КонецПопытки;

               Если НомерПоследнейСмены < НомерСмены Тогда
                  НомерПоследнейСмены = НомерСмены;
               КонецЕсли;

               Если ТипТранзакции =  1 Тогда
                  // Регистрация без учета кода товара
                  ВыходныеПараметры.Добавить(999);
                  ВыходныеПараметры.Добавить(НСтр("ru='Регистрация продаж без учета кода товара не допускается'"));
                  Результат = Ложь;
                  Прервать;
               ИначеЕсли ТипТранзакции = 11 Тогда
                  // Регистрация с учетом кода товара
                  КодСтр        = СтрПолучитьСтроку(ТекущаяСтрока,  8);
                  ЦенаСтр       = СтрПолучитьСтроку(ТекущаяСтрока, 10);
                  КоличествоСтр = СтрПолучитьСтроку(ТекущаяСтрока, 11);
                  СуммаСтр      = СтрПолучитьСтроку(ТекущаяСтрока, 16);
                  Артикул       = СтрПолучитьСтроку(ТекущаяСтрока, 18);
                  Попытка
                     ПолеОшибки = Нстр("ru='Код товара (8)'");
                     Код        = Число(КодСтр);
                     ПолеОшибки = Нстр("ru='Цена товара (10)'");
                     Цена       = Число(ЦенаСтр);
                     ПолеОшибки = Нстр("ru='Количество товара (11)'");
                     Количество = Число(КоличествоСтр);
                     ПолеОшибки = Нстр("ru='Сумма продажи (16)'");
                     Сумма      = Число(СуммаСтр);
                  Исключение
                     ВыходныеПараметры.Добавить(999);
                     ВыходныеПараметры.Добавить(НСтр("ru='Неверный формат файла. Невозможно преобразовать к числу поле: '")+ПолеОшибки);
                     Результат = Ложь;
                     Прервать;
                  КонецПопытки;
                  Врем                = Новый Структура("Код, Цена, Количество, Сумма, Артикул, НомерДокумента, НомерСмены");
                  Врем.Код            = Код;
                  Врем.Цена           = Цена;
                  Врем.Количество     = Количество;
                  Врем.Сумма          = Сумма;
                  Врем.Артикул        = Артикул;
                  Врем.НомерДокумента = НомерДокумента;
                  Врем.НомерСмены     = НомерСмены;
                  Позиции.Добавить(Врем);
               ИначеЕсли ТипТранзакции =  2 Или ТипТранзакции = 12 Тогда
                  // Сторнирование
                  СтруктураПоиска                = Новый Структура("НомерДокумента, НомерСмены");
                  СтруктураПоиска.НомерДокумента = НомерДокумента;
                  СтруктураПоиска.НомерСмены     = НомерСмены;
                  Врем                           = НайтиСтроки(Позиции, СтруктураПоиска);
                  Врем                           = Врем[Врем.Количество() - 1];
                  Позиции.Удалить(Врем.ИндексВМассиве);
               ИначеЕсли ТипТранзакции =  4 Или ТипТранзакции = 14 Тогда
                  // Налог
               ИначеЕсли ТипТранзакции =  5 Или ТипТранзакции = 15 Или ТипТранзакции =  7 Или ТипТранзакции = 17 Тогда
                  // Скидка на позицию
               ИначеЕсли ТипТранзакции =  6 Или ТипТранзакции = 16 Или ТипТранзакции =  8 Или ТипТранзакции = 18 Тогда
                  // Надбавка на позицию
               ИначеЕсли ТипТранзакции = 85 Или ТипТранзакции = 75
                       Или ТипТранзакции = 87 Или ТипТранзакции = 77 Тогда
                  // Распределенная скидка
               ИначеЕсли ТипТранзакции = 86 Или ТипТранзакции = 76
                       Или ТипТранзакции = 88 Или ТипТранзакции = 78 Тогда
                  // Распределенная надбавка
               ИначеЕсли ТипТранзакции = 60 Тогда
                  // X-отчет
               ИначеЕсли ТипТранзакции = 63 Тогда
                  // Z-отчет
               ИначеЕсли ТипТранзакции = 64 Тогда
                  // Документ открытия смены
               ИначеЕсли ТипТранзакции = 61 Тогда
                  // Закрытие смены
               ИначеЕсли ТипТранзакции = 62 Тогда
                  // Открытие смены
               ИначеЕсли ТипТранзакции = 40 Тогда
                  // Оплата с вводом суммы клиента
               ИначеЕсли ТипТранзакции = 41 Тогда
                  // Оплата без ввода суммы клиента
               ИначеЕсли ТипТранзакции = 42 Тогда
                  // Открытие чека
                  Врем = Новый Структура("НомерДокумента, НомерСмены, ЧекЗакрыт, Скидка");
                  Врем.НомерДокумента = НомерДокумента;
                  Врем.НомерСмены     = НомерСмены;
                  Врем.ЧекЗакрыт      = Ложь;
                  Врем.Скидка         = 0;
                  Чеки.Добавить(Врем);
               ИначеЕсли ТипТранзакции = 43 Тогда
                  // Распределение оплаты
               ИначеЕсли ТипТранзакции = 45 Тогда
                  // Закрытие документа в ККМ
               ИначеЕсли ТипТранзакции = 49 Тогда
                  // Закрытие документа по ГП
               ИначеЕсли ТипТранзакции = 50 Тогда
                  // Внесение
               ИначеЕсли ТипТранзакции = 51 Тогда
                  // Выплата
               ИначеЕсли ТипТранзакции = 55 Тогда
                  // Закрытие чека
                  СтруктураПоиска                = Новый Структура("НомерДокумента, НомерСмены");
                  СтруктураПоиска.НомерДокумента = НомерДокумента;
                  СтруктураПоиска.НомерСмены     = НомерСмены;
                  ВремПозиции                    = НайтиСтроки(Позиции, СтруктураПоиска);

                  СуммаПозиций                   = 0;
                  Для Каждого Позиция Из ВремПозиции Цикл
                     СуммаПозиций = СуммаПозиций + Позиция.Сумма;
                  КонецЦикла;

                  ВремЧеки = НайтиСтроки(Чеки, СтруктураПоиска)[0];
                  ВремЧеки.ЧекЗакрыт = Истина;
               ИначеЕсли ТипТранзакции = 56 Тогда
                  // Чек не закрыт на ККМ
                  СтруктураПоиска                = Новый Структура("НомерДокумента, НомерСмены");
                  СтруктураПоиска.НомерДокумента = НомерДокумента;
                  СтруктураПоиска.НомерСмены     = НомерСмены;
                  Врем                           = НайтиСтроки(Позиции, СтруктураПоиска);
                  Для Индекс = 1 По Врем.Количество() Цикл
                     ВремСтрока                 = Врем[Врем.Количество() - Индекс];
                     Позиции.Удалить(ВремСтрока.ИндексВМассиве);
                  КонецЦикла;
               ИначеЕсли ТипТранзакции = 57 Тогда
                  // Восстановление отложенного чека
               ИначеЕсли ТипТранзакции = 35 Или ТипТранзакции = 37 Тогда
                  // Скидка на чек
               ИначеЕсли ТипТранзакции = 36 Или ТипТранзакции = 38 Тогда
                  // Надбавка на чек
               ИначеЕсли ТипТранзакции = 21 Или ТипТранзакции = 23 Тогда
                  // Регистрация купюр по свободной цене
               ИначеЕсли ТипТранзакции = 22 Или ТипТранзакции = 24 Тогда
                  // Сторно купюр по свободной цене/из справочника
               Иначе
                  ОписаниеОшибки = НСтр("ru='Обнаружена неизвестная транзакция: %ТипТранзакции%. Данные по транзакции не были загружены!'");
                  ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрЗаменить(ОписаниеОшибки, "%ТипТранзакции%", Строка(ТипТранзакции)));
                  НеизвестнаяТранзакция = Истина;
               КонецЕсли;

               ИндексСтроки  = ИндексСтроки + 1;
               ТекущаяСтрока = Файл.ПолучитьСтроку(ИндексСтроки);
            КонецЦикла;

            Если НеизвестнаяТранзакция Тогда
               ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не все данные были загружены из отчета. Обратитесь к администратору системы!'"));
            КонецЕсли;
         ИначеЕсли ТекущаяСтрока = "@" Тогда
            ВыходныеПараметры.Добавить(999);
            ВыходныеПараметры.Добавить(НСтр("ru='Операция прервана. Отчет уже был загружен!'"));
            Результат = Ложь;
         Иначе
            ВыходныеПараметры.Добавить(999);
            ВыходныеПараметры.Добавить(НСтр("ru='Неверный формат данных или данные отсутствуют.'"));
            Результат = Ложь;
         КонецЕсли;
      КонецЕсли;
   Иначе
      ВыходныеПараметры.Добавить(999);
      ОписаниеОшибки = НСтр("ru='Файл отчета по адресу: %Адрес% не обнаружен'");
      ВыходныеПараметры.Добавить(СтрЗаменить(ОписаниеОшибки, "%Адрес%", Параметры.ФайлОтчета));
      Результат = Ложь;
   КонецЕсли;

   Если Результат Тогда
      СтруктураПоиска            = Новый Структура("ЧекЗакрыт");   
      СтруктураПоиска.ЧекЗакрыт  = Истина;
      Врем                       = НайтиСтроки(Чеки, СтруктураПоиска);
      Для Каждого Чек Из Врем Цикл
         СтруктураПоиска                = Новый Структура("НомерДокумента");
         СтруктураПоиска.НомерДокумента = Чек.НомерДокумента;
         ПозицииЧека = НайтиСтроки(Позиции, СтруктураПоиска);
         Для Каждого Позиция Из ПозицииЧека Цикл
            
            СкидкаВрем = (Позиция.Цена * Позиция.Количество) - Позиция.Сумма;
            Если Позиция.Сумма = 0  И  Позиция.Цена * Позиция.Количество > 0 Тогда
               СкидкаВрем = 100;
            ИначеЕсли Позиция.Цена * Позиция.Количество = 0 Тогда
               СкидкаВрем = 0;
            Иначе
               СкидкаВрем = Окр(СкидкаВрем / (Позиция.Цена * Позиция.Количество) * 100, 2);
            КонецЕсли;
            
            РезПозиция = Новый Структура("Код, Количество, Цена, Сумма, Скидка"
            , Позиция.Код
            , Позиция.Количество
            , Позиция.Цена
            , Позиция.Сумма
            , СкидкаВрем);
            Отчет.Добавить(РезПозиция);
         КонецЦикла;
      КонецЦикла;
      ВыходныеПараметры.Добавить(Отчет);
   КонецЕсли;

   Возврат Результат;

КонецФункции // ЗагрузитьОтчет()
Бродяга_Джон
 
Постов: 1263
Зарегистрирован: 12 окт 2010, 22:07
Откуда: Россия, Омск

Пред.

Вернуться в Интеграция с различным товароучетным ПО

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


cron

Кто сейчас на конференции

Сейчас посетителей на конференции: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (180) здесь было 29 апр 2024, 13:15

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1