+7 499 990-10-21

Выгрузка на кассы

Выгрузка на кассы

Сообщение kedr19 » 09 дек 2014, 11:34

Делюсь своей методикой выгрузки на кассы
Это фрагмент кода. Если кому нужна вся внешняя обработка (находится в стадии доработки. Но выгрузка работает уже.) напишите почту вышлю.

Суть метода достичь логического понимания и прозрачности кода, основные вычисления перенести на сервер.

Данная процедура четко показывает что за чем идет и легко менять порядок не задумываясь ни о чем:
Код: Выделить всё
&НаСервереБезКонтекста
Процедура ПодготовитьТекст(СтруктураДанных)
   ТекстФайла = Новый ТекстовыйДокумент();
   ТекстФайла.ДобавитьСтроку("!!!DNCUPLOAD");
   ТекстФайла.ДобавитьСтроку("#UPLOADED_STATE");
   ТекстФайла.ДобавитьСтроку("not loaded");
   ТекстФайла.ДобавитьСтроку("#RECORD_COUNT");
   ТекстФайла.ДобавитьСтроку("1074"); // после выгрузки - заменить на реальное кол-во строк с командами и параметрами
   ТекстФайла.ДобавитьСтроку("!!!DELETEFIXDISCOUNTS"); //удалить все фиксированные скидки
   ТекстФайла.ДобавитьСтроку("!!!DELETEDISCSCHEMES");   //удалить все схемы скидок и условия в них
   ТекстФайла.ДобавитьСтроку("!!!DELETEPRICES");       //удалить все дополнительные типы цен и цены товаров (при перезагрузке)
   ТекстФайла.ДобавитьСтроку("!!!DELETEPROFILES");      //удалить все профили (кроме «Администратора») и пользователей (кроме пользователей с набором прав «Администратор»)
   ТекстФайла.ДобавитьСтроку("!!!DELETEUSERS");         //удалить всех пользователей, кроме «Администратора»
   ТекстФайла.ДобавитьСтроку("!!!ADDPROFILES");      //добавить профили пользователей
   ДобавитьADDPROFILES(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!ADDUSERS");         //добавить пользователей
   ДобавитьADDUSERS(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!ADDDISCSCHEMES");     //добавить схемы скидок
   ДобавитьADDDISCSCHEMES(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!ADDPRICETYPES");      //добавить дополнительные типы цен
   ДобавитьADDPRICETYPES(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!ADDDISCCONDITIONS");    //добавить правила (условия) применения скидок в схемы
   ДобавитьADDDISCCONDITIONS(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!ADDWAREGROUPS");       //добавить / заменить информацию о группах товаров
   ДобавитьADDWAREGROUPS(ТекстФайла);
   //Данные для выгрузку подготавливаются разными вариантами:
   //1. Недавно измененные из регистра оборотов за период с добавлением конечного остатка и последней цены.
   //2. Полный перечень остатков:
   //2.1 С заменой
   //2.1 С предварительным удалением. Проводить только или рано утром или после закрытия касс.
   ТекстФайла.ДобавитьСтроку("!!!REPLACEWARES");       //добавить / заменить всю информацию о товаре (с замещением остатков)
   ДобавитьREPLACEWARES(ТекстФайла,СтруктураДанных);
   ТекстФайла.ДобавитьСтроку("!!!ADDWAREBARCODES");   //Команда добавления штрих-кодов товаров
   ДобавитьADDWAREBARCODES(ТекстФайла,СтруктураДанных);
   ТекстФайла.ДобавитьСтроку("!!!ADDWAREPRICES");      //добавить дополнительные цены товаров
   ДобавитьADDWAREPRICES(ТекстФайла,СтруктураДанных);
   ТекстФайла.ДобавитьСтроку("!!!DELETEFIXDISCOUNTS");     //добавить / заменить информацию о фиксированных скидках
   ТекстФайла.ДобавитьСтроку("!!!ADDFIXDISCOUNTS");     //добавить / заменить информацию о фиксированных скидках
   ДобавитьADDFIXDISCOUNTS(ТекстФайла);
   ТекстФайла.ДобавитьСтроку("!!!DNCUPLOAD_END");
   СтруктураДанных.Вставить("ТекстФайла",ТекстФайла);
КонецПроцедуры // ВыгрузитьТовары()


Далее пример процедур добавления групп товаров и самих товаров. Группы добавляются с учет глубины иерархии 3, если более то запрос можно переписать через ВЫБОР где бедет проверятся родитель родителя и в зависимости от результат ставить глубину уровня, далее по ней сортировать и выгружать.

Код: Выделить всё
&НаСервереБезКонтекста
Процедура ДобавитьADDWAREGROUPS(ТекстФайла)
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   Номенклатура.Код КАК ВнутреннийКод,
      |   Номенклатура.Наименование,
      |   Номенклатура.Наименование КАК НаименованиеПечати,
      |   ВЫБОР
      |      КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
      |         ТОГДА """"
      |      ИНАЧЕ Номенклатура.Родитель.Код
      |   КОНЕЦ КАК РодительКод
      |ИЗ
      |   Справочник.Номенклатура КАК Номенклатура
      |ГДЕ
      |   Номенклатура.ЭтоГруппа
      |
      |УПОРЯДОЧИТЬ ПО
      |   РодительКод";
   
   Результат = Запрос.Выполнить().Выгрузить();
   ДобавитьСекцию(Результат,ТекстФайла,"ADDWAREGROUPS");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ДобавитьREPLACEWARES(ТекстФайла,СтруктураДанных)
   // Подготовим данные для выгрузки
   Если  СтруктураДанных.Остатки = Истина Тогда //выгрузим все остатки
      
      Запрос = Новый Запрос;
      Запрос.Текст =
         "ВЫБРАТЬ
         |   ТоварыВРозницеОстатки.Номенклатура,
         |   ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры,
         |   СУММА(ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0)) КАК Остаток,
         |   ТоварыВРозницеОстатки.Номенклатура.Родитель.Код КАК КодРодительскойГруппы,
         |   ТоварыВРозницеОстатки.Номенклатура.Код КАК Код,
         |   ЗначенияСвойствОбъектовСклад.Значение.Код КАК КодСклада,
         |   ЦеныНоменклатурыСрезПоследних.Цена
         |ПОМЕСТИТЬ СписокНоменклатуры
         |ИЗ
         |   РегистрНакопления.ТоварыВРознице.Остатки(, Склад = ЗНАЧЕНИЕ(Справочник.Склады.ВыстовочныйЗал)) КАК ТоварыВРозницеОстатки
         |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектовСклад
         |      ПО ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры = ЗначенияСвойствОбъектовСклад.Объект
         |         И (ЗначенияСвойствОбъектовСклад.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Склад))
         |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Розница)) КАК ЦеныНоменклатурыСрезПоследних
         |      ПО ТоварыВРозницеОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
         |
         |СГРУППИРОВАТЬ ПО
         |   ТоварыВРозницеОстатки.Номенклатура,
         |   ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры,
         |   ЗначенияСвойствОбъектовСклад.Значение.Код,
         |   ТоварыВРозницеОстатки.Номенклатура.Родитель.Код,
         |   ТоварыВРозницеОстатки.Номенклатура.Код,
         |   ЦеныНоменклатурыСрезПоследних.Цена
         |;
         |
         |////////////////////////////////////////////////////////////////////////////////
         |ВЫБРАТЬ
         |   СписокНоменклатуры.Код + "" "" + СписокНоменклатуры.КодСклада КАК ВнутреннийКодТовара,
         |   """" КАК ШтрихКоды,
         |   ""1"" КАК Коэффициент,
         |   ВЫРАЗИТЬ(СписокНоменклатуры.Номенклатура.НаименованиеПолное КАК СТРОКА(100)) КАК Наименование,
         |   СписокНоменклатуры.Номенклатура.Наименование КАК ТекстДляЧека,
         |   """" КАК Артикул,
         |   СписокНоменклатуры.Цена,
         |   СписокНоменклатуры.Остаток КАК Остаток,
         |   ""0,1,1,0,1,1,0,1"" КАК Флаги,
         |   """" КАК МинимальнаяЦена,
         |   """" КАК СрокГодности,
         |   СписокНоменклатуры.КодРодительскойГруппы КАК КодРодительскойГруппы,
         |   """" КАК КодНалоговойГруппы,
         |   """" КАК КоднабораДопХарактеристик,
         |   """" КАК НомерСекции,
         |   """" КАК КодОграничения,
         |   ""0"" КАК КодСАС,
         |   СписокНоменклатуры.Код КАК ПутьКартинки
         |ИЗ
         |   СписокНоменклатуры КАК СписокНоменклатуры";

      
      Результат = Запрос.Выполнить().Выгрузить();

   //бегаем по изменениям и собираем перечень изменившихся товаров
   ИначеЕсли СтруктураДанных.Обороты = Истина Тогда

      ДатаНачала = СтруктураДанных.ДатаНачала;
      ДатаКонца = СтруктураДанных.ДатаКонца;
      
      Запрос = Новый Запрос;
      Запрос.Текст =
         "ВЫБРАТЬ
         |   ТоварыВРозницеОбороты.Номенклатура,
         |   ТоварыВРозницеОбороты.ХарактеристикаНоменклатуры
         |ПОМЕСТИТЬ ОборотнаяНоменклатура
         |ИЗ
         |   РегистрНакопления.ТоварыВРознице.Обороты(&ДатаН, &ДатаК, , ) КАК ТоварыВРозницеОбороты
         |
         |СГРУППИРОВАТЬ ПО
         |   ТоварыВРозницеОбороты.ХарактеристикаНоменклатуры,
         |   ТоварыВРозницеОбороты.Номенклатура
         |;
         |
         |////////////////////////////////////////////////////////////////////////////////
         |ВЫБРАТЬ
         |   ОборотнаяНоменклатура.Номенклатура,
         |   ОборотнаяНоменклатура.ХарактеристикаНоменклатуры,
         |   СУММА(ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0)) КАК Остаток,
         |   ОборотнаяНоменклатура.Номенклатура.Родитель.Код КАК КодРодительскойГруппы,
         |   ОборотнаяНоменклатура.Номенклатура.Код КАК Код,
         |   ЗначенияСвойствОбъектовСклад.Значение.Код КАК КодСклада,
         |   ЦеныНоменклатурыСрезПоследних.Цена
         |ПОМЕСТИТЬ СписокНоменклатуры
         |ИЗ
         |   ОборотнаяНоменклатура КАК ОборотнаяНоменклатура
         |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектовСклад
         |      ПО (ОборотнаяНоменклатура.ХарактеристикаНоменклатуры = ЗначенияСвойствОбъектовСклад.Объект
         |            И ЗначенияСвойствОбъектовСклад.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Склад))
         |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРознице.Остатки(, Склад = ЗНАЧЕНИЕ(Справочник.Склады.ВыстовочныйЗал)) КАК ТоварыВРозницеОстатки
         |      ПО ОборотнаяНоменклатура.Номенклатура = ТоварыВРозницеОстатки.Номенклатура
         |         И ОборотнаяНоменклатура.ХарактеристикаНоменклатуры = ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры
         |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Розница)) КАК ЦеныНоменклатурыСрезПоследних
         |      ПО ОборотнаяНоменклатура.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
         |
         |СГРУППИРОВАТЬ ПО
         |   ЗначенияСвойствОбъектовСклад.Значение.Код,
         |   ЦеныНоменклатурыСрезПоследних.Цена,
         |   ОборотнаяНоменклатура.Номенклатура,
         |   ОборотнаяНоменклатура.ХарактеристикаНоменклатуры,
         |   ОборотнаяНоменклатура.Номенклатура.Родитель.Код,
         |   ОборотнаяНоменклатура.Номенклатура.Код
         |;
         |
         |////////////////////////////////////////////////////////////////////////////////
         |ВЫБРАТЬ
         |   СписокНоменклатуры.Код + "" "" + СписокНоменклатуры.КодСклада КАК ВнутреннийКодТовара,
         |   """" КАК ШтрихКоды,
         |   ""1"" КАК Коэффициент,
         |   ВЫРАЗИТЬ(СписокНоменклатуры.Номенклатура.НаименованиеПолное КАК СТРОКА(100)) КАК Наименование,
         |   СписокНоменклатуры.Номенклатура.Наименование КАК ТекстДляЧека,
         |   """" КАК Артикул,
         |   СписокНоменклатуры.Цена,
         |   СписокНоменклатуры.Остаток КАК Остаток,
         |   ""0,1,1,0,1,1,0,1"" КАК Флаги,
         |   """" КАК МинимальнаяЦена,
         |   """" КАК СрокГодности,
         |   СписокНоменклатуры.КодРодительскойГруппы КАК КодРодительскойГруппы,
         |   """" КАК КодНалоговойГруппы,
         |   """" КАК КоднабораДопХарактеристик,
         |   """" КАК НомерСекции,
         |   """" КАК КодОграничения,
         |   ""0"" КАК КодСАС,
         |   СписокНоменклатуры.Код КАК ПутьКартинки
         |ИЗ
         |   СписокНоменклатуры КАК СписокНоменклатуры";

         
      Запрос.УстановитьПараметр("ДатаН", ДатаНачала);
      Запрос.УстановитьПараметр("ДатаК", ДатаКонца);
      Результат = Запрос.Выполнить().Выгрузить();
      
   КонецЕсли;
   
   
   ДобавитьСекцию(Результат,ТекстФайла,"REPLACEWARES");
   
КонецПроцедуры



Далее окончательная процедура куда передаются результаты запроса и в ней формируются сами строки файла и проводится необходимая обработка данных типа Цен и кодов:

Код: Выделить всё
&НаСервереБезКонтекста
Процедура ДобавитьСекцию(Результат,ТекстФайла,НазваниеСекции)
   
   Колонки = Результат.Колонки;
   Для каждого Строка Из Результат Цикл
      СтрокаТекста = "";
      Для Каждого Колонка из Колонки Цикл
         Текст = СокрЛП(Строка[Колонка.Имя]);
         Если Колонка.Имя = "Цена" Тогда
            Попытка
               Текст = Формат(Число(Текст),"ЧЦ=8; ЧДЦ=2; ЧРД=.; ЧГ=0");
            Исключение
               Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
            КонецПопытки
         ИначеЕсли Колонка.Имя = "Остаток" Тогда
            Попытка
               Текст = Формат(Число(Текст),"ЧЦ=7; ЧДЦ=3; ЧРД=.; ЧН=0.000; ЧГ=0");
            Исключение
               Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
            КонецПопытки;
         ИначеЕсли Колонка.Имя = "ПутьКартинки" Тогда
            БазаТовара = Лев(Текст,2);
            Если БазаТовара = "11" Тогда
               КодТовараС5 = Формат(Число(Текст) - 11300000000,"ЧГ=0");
               Текст = "/mnt/db_image/games/" + КодТовараС5 + ".jpg";
            ИначеЕсли БазаТовара = "12" Тогда
               КодТовараС5 = Формат(Число(Текст) - 12300000000,"ЧГ=0");
               Текст = "/mnt/db_image/kanci/" + КодТовараС5 + ".jpg";
            ИначеЕсли БазаТовара = "13" Тогда         
               КодТовараС5 = Формат(Число(Текст) - 13300000000,"ЧГ=0");
               Текст = "/mnt/db_image/book/" + КодТовараС5 + ".jpg";
            КонецЕсли;
         ИначеЕсли Найти(Колонка.Имя, "КодВЧисло") > 0 Тогда
            Попытка
               Текст = Формат(Число(Текст),"ЧЦ=11; ЧДЦ=; ЧРД=.; ЧГ=0");
            Исключение
               Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
            КонецПопытки;
         Иначе   
         //   Текст = СтрЗаменить(Текст," ","*");
         КонецЕсли;
          Текст = СокрЛП(Текст);
           СтрокаТекста = СтрокаТекста + "" + Текст + ";";
      КонецЦикла;
      ТекстФайла.ДобавитьСтроку(СтрокаТекста);
   КонецЦикла;
   
КонецПроцедуры   



Код выложен как вариант подхода к выгрузке.

Загрузку так же выложу как получу все необходимые данные от Техподдержки.
kedr19
 
Постов: 587
Зарегистрирован: 24 окт 2011, 15:49
Откуда: г. Новосибирск

Re: Выгрузка на кассы

Сообщение den » 12 дек 2014, 15:47

В какой версии 1С тестируете разработку? Мы сейчас как раз в процессе формирования инфраструктуры обмена между 1С УТ 10.3 и кассами. Нужны данные для отчетов по чекам, а этого нет в стандартной обработке DNC_Kassa_v3.
Последний раз редактировалось den 12 дек 2014, 16:14, всего редактировалось 1 раз.
den
 
Постов: 20
Зарегистрирован: 26 ноя 2014, 15:46

Re: Выгрузка на кассы

Сообщение kedr19 » 12 дек 2014, 16:01

сейчас платформа 1С:Предприятие 8.3 (8.3.5.1186)

Продажи на ДЭНСИ загружаем в чеки, а отчеты о продажах уже делаем штаными механизмами. В таком режиме давно работаем, но старое решение уже устарело, вот сейчас все пытаюсь сделать внешней обработкой. без изменений в конфигурации.

Данный образец обработки работает по системе прайсовых цен, могу выслать для просмотра кода. По системе скидок на чек еще предстоит сделать.
kedr19
 
Постов: 587
Зарегистрирован: 24 окт 2011, 15:49
Откуда: г. Новосибирск

Re: Выгрузка на кассы

Сообщение monoreals » 25 апр 2015, 21:10

kedr19 писал(а):сейчас платформа 1С:Предприятие 8.3 (8.3.5.1186)

Продажи на ДЭНСИ загружаем в чеки, а отчеты о продажах уже делаем штаными механизмами. В таком режиме давно работаем.


Дружище! А не мог бы ты мне выслать на почту конфигурацию которая загружает продажи по чекам?? буду дико благодарен.. а то мне нужно почти онлайн остатки знать..
Если не сложно: monoreals@yandex.ru
monoreals
 
Постов: 17
Зарегистрирован: 24 ноя 2014, 13:00


Вернуться в Ваши предложения

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

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


cron

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

Сейчас посетителей на конференции: 2, из них зарегистрированных: 0, скрытых: 0 и гостей: 2 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (170) здесь было 16 май 2020, 01:50

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