Бродяга_Джон » 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