Имя: Пароль:
1C
1C 7.7
v7: Честный знак и вывод из оборота
0 ChMikle
 
17.03.23
10:50
Нужен образец файла с данными о выводе из оборота товаров группы молочная продукция в xml формате для дальнейшего экспорта в ЭДО лайт и отправки в ЧЗ.
Решили фасованные головки сыров резать на части и продавать кусками, я так понял в Чз необходимо отправлять данные о выбытии в случае разрыва упаковки и деления на части ?
1 АгентБезопасной Нацио
 
17.03.23
11:16
<?xml version="1.0" encoding="UTF-8"?>
<withdrawal version="8">
  <trade_participant_inn>7777777777</trade_participant_inn>
  <withdrawal_type>DESTRUCTION</withdrawal_type>
  <withdrawal_date>2022-01-13</withdrawal_date>
  <primary_document_type>DESTRUCTION_ACT</primary_document_type>
  <primary_document_number>123</primary_document_number>
  <primary_document_date>2022-01-13</primary_document_date>
  <fias_id>8cccc9d6-05cc-4c53-c45c-cc0c6c3c5c44</fias_id>
  <products_list>
  <product>
  <cis>00000000000000hx00'HY</cis>
  </product>
  </products_list>
</withdrawal>
2 ChMikle
 
17.03.23
11:44
(1) Это рабочий пример ?
3 ChMikle
 
17.03.23
11:54
там вроде как номенклатура , количество, цена и сумма должны указываться ?
4 АгентБезопасной Нацио
 
17.03.23
12:01
(2) это из "Описание True API Версия 284.0"
Мы не режем.
5 ChMikle
 
17.03.23
12:27
(4) мне надо загрузить файл из внешнего файла в эдо-лайт данные для вывода из оборота
6 АгентБезопасной Нацио
 
17.03.23
12:42
ну и грузи. правила формирования файлов единые.
7 big
 
17.03.23
12:58
Зайдите в личный кабинет, там куча документации и примеров. Загружать можно из xml, xls, csv
8 ChMikle
 
17.03.23
14:08
(7) Спасибо , мил человек, но конкретный рабочий файл-пример был бы более продуктивен :) для меня.
9 ChMikle
 
21.03.23
09:00
(1) Спасибо !
10 MWWRuza
 
гуру
21.03.23
10:57
Я из 7.7 через True API, HTTP запросом отправкой JSON сделал. Работает.
Но, у меня авторизация, получение токена и т.п. было ранее сделано, еще для сигарет... Поэтому, с молочкой, списанием через расфасовку, проблем не возникло.
Вот такой документ:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-486.jpg

В принципе, у меня предусмотрена и второй вариант, когда API по каким-то причинам не доступен - формирование файла для ручной загрузки в ЛК. Там как раз XML формируется.
11 ChMikle
 
21.03.23
12:01
QR-коды так же , отрезал лишние хвосты ?
12 MWWRuza
 
гуру
21.03.23
17:19
Хм... Ну, если посмотреть по дате документа, можно понять, когда я это делал... Уже и не помню.
Сейчас в модуле посмотрю, отпишу...
13 MWWRuza
 
гуру
21.03.23
17:21
Отправляю так:

    Пока ПолучитьСтроку() = 1 Цикл
        ТзТов.НоваяСтрока();
        КИЗ                                = СокрЛП(Марка);
        ТзТов.cis                        = КИЗ;
        ТзТов.product_cost                = ЦенаЕд * 100;
    КонецЦикла;
14 MWWRuza
 
гуру
21.03.23
17:28
А марка в таблице документа так:
            СзШК                    = РазобратьШК(СканШК);
            ТипШК                    = СзШК.Получить("ТипЕд");
            ЕАН                        = СзШК.Получить("ЕАН");
            GTIN                    = СзШК.Получить("GTIN");
            ВесЕдВМарке                = ПолучитьВес(СканШК);
            КИЗ                        = ПолучитьКИЗ(СканШК);

****
НовМарка    = КИЗ;
****
Марка         = НовМарка;

Там где звездочки - куча всяких проверок и т. п., это "на вкус и цвет" :-)

В глобальном модуле у меня функция, сделана давно, еще когда только с ЕГАИС начинал работать потом, допиливал по чуть-чуть:

// Функция РазобратьШК(ШК) Экспорт - Возвращает тип отсканированного ШтрихКода
// 1     - EAN(13 или 8)    обычный ШК товара
// 2     - DataMatrix         пачки сигарет
// 3     - DataMatrix         блока сигарет
// 4     - PDF-417             алкоголь, старая марка
// 5     - DataMatrix         алкоголь,новая марка
// 6     - DataMatrix        алкоголь, старая марка, "маленький квадратик"
// 7    - DataMatrix         прочей упаковки сигарет
// 8    - Сокращенный код маркировки прочих товаров, в том числе молока
// МРЦ    - максимальная розничная цена сигарет
// Тип  - тип старой марки
// Сер    - серия старой марки
// Ном    - номер старой марки  
Функция РазобратьШК(Знач ШК) Экспорт
    СЗ            = СоздатьОбъект("СписокЗначений");
    СтрШК        = СокрЛП(ШК);
    Если СтрДлина(СтрШК) <= 13 Тогда
        СЗ.ДобавитьЗначение(1,         "ТипЕд");
        СЗ.ДобавитьЗначение(СтрШК,     "ЕАН");
        СЗ.ДобавитьЗначение(0);
    ИначеЕсли (СтрДлина(СтрШК) <= 29) И (СтрДлина(СтрШК) >= 21) Тогда
        СЗ.ДобавитьЗначение(2,         "ТипЕд");
        ВыдЕАН    = СокрЛП(Число(Лев(ШК, 14)));
        СЗ.ДобавитьЗначение(ВыдЕАН, "ЕАН");
        Если СтрДлина(СтрШК) >= 25 Тогда
            МРЦ    = ВернутьМРЦ(Сред(СокрЛП(СтрШК), 22, 4));    
        Иначе    
            МРЦ    = 0;    
        КонецЕсли;
        СЗ.ДобавитьЗначение(МРЦ, "МРЦ");
    ИначеЕсли СтрДлина(СтрШК) = 68 Тогда
        СЗ.ДобавитьЗначение(4,         "ТипЕд");
        СЗ.ДобавитьЗначение(СтрШК,     "ЕАН");
        СЗ.ДобавитьЗначение(0);
    ИначеЕсли СтрДлина(СтрШК) = 150 Тогда    
        СЗ.ДобавитьЗначение(5,         "ТипЕд");
        СЗ.ДобавитьЗначение(СтрШК,     "ЕАН");
        СЗ.ДобавитьЗначение(0);
    ИначеЕсли (СтрДлина(СтрШК) > 30) И (СтрДлина(СтрШК) < 68) Тогда    
        Если Сред(СтрШК,4,1)     = "-" Тогда
            Тип    = Лев(СтрШК,3);
            СтрТипа = "";
            СзТиповМарок    = ЗаполнитьСписокТиповМарок();
            Поз    = СзТиповМарок.НайтиЗначение(Число(Тип));            
            Если Поз     = 0 Тогда
                Предупреждение("Тип марки не найден!");
            Иначе
                СзТиповМарок.ПолучитьЗначение(Поз,СтрТипа);
            КонецЕсли;            
            Если Найти(СтрТипа,"ФСМ. ") > 0 Тогда
                ДлинаНомераМарки=9;
            Иначе
                ДлинаНомераМарки=8
            КонецЕсли;
             СЗ.ДобавитьЗначение(6, "ТипЕд");
            СЗ.ДобавитьЗначение(СтрШК);
            СЗ.ДобавитьЗначение(0);
            СЗ.ДобавитьЗначение(Лев(ШК,3), СокрЛП(СтрТипа));
            СЗ.ДобавитьЗначение(Сред(ШК,Найти(ШК,"-") + 1,3));
            СЗ.ДобавитьЗначение(Сред(ШК,Найти(ШК,"-") + 4,ДлинаНомераМарки));
        Иначе
            СтрШК                = СтрЗаменить(СтрШК, "(", "");
            СтрШК                = СтрЗаменить(СтрШК, ")", "");
            Если Лев(СтрШК, 2)     = "01"  Тогда
                Если Найти(СтрШК, Симв(29)) > 0 Тогда               // Марка полная, со сканера
                    СЗ.ДобавитьЗначение(7,         "ТипЕд");
                    GTIN        = Сред(СтрШК, 3, 14);    
                    ШК            = СокрЛП(Число(Сред(СтрШК, 3, 14)));
                    СЗ.ДобавитьЗначение(ШК,     "ЕАН");
                    СЗ.ДобавитьЗначение(GTIN,     "GTIN");
                    СЗ.ДобавитьЗначение(0,         "МРЦ");
                Иначе    
                    Если  Найти(СтрШК, "8005") = 0 Тогда
                        // Упаковка, отличная от блока
                        ШК    = СокрЛП(Число(Сред(СтрШК, 3, 14)));
                        МРЦ = 0;
                        СЗ.ДобавитьЗначение(7,         "ТипЕд");
                        СЗ.ДобавитьЗначение(ШК,     "ЕАН");
                        СЗ.ДобавитьЗначение(МРЦ,     "МРЦ");
                        СЗ.ДобавитьЗначение(ПривестиШкБлокаКВидуУПД(СтрШК), "ШКУПД");
                    ИначеЕсли Найти(СтрШК, "8005") >= 25 Тогда
                        ШК    = СокрЛП(Число(Сред(СтрШК, 3, 14)));
                        МРЦ = ВычислитьМРЦ_Блока(СтрШК);
                        СЗ.ДобавитьЗначение(3,         "ТипЕд");
                        СЗ.ДобавитьЗначение(ШК,     "ЕАН");
                        СЗ.ДобавитьЗначение(МРЦ,     "МРЦ");
                        СЗ.ДобавитьЗначение(ПривестиШкБлокаКВидуУПД(СтрШК), "ШКУПД");    
                    КонецЕсли;
                КонецЕсли;    
            КонецЕсли;  
        КонецЕсли;
    ИначеЕсли (СтрДлина(СтрШК) >= 19) И (СтрДлина(СтрШК) < 21) Тогда // Молочка и другой товар сокращенные
        ШК    = СокрЛП(Число(Сред(СтрШК, 3, 14)));
        СЗ.ДобавитьЗначение(8,                                 "ТипЕд");
        СЗ.ДобавитьЗначение(ШК,                             "ЕАН");
        СЗ.ДобавитьЗначение(0,                                 "МРЦ");
        СЗ.ДобавитьЗначение(ПривестиШкБлокаКВидуУПД(СтрШК), "ШКУПД");        
    КонецЕсли;    
    Возврат СЗ;
КонецФункции
// КонецФункци РазобратьШК(ШК
15 MWWRuza
 
гуру
21.03.23
17:29
СканШК - это ШтрихКод марки, как во внешнее событие со сканера прилетел.
16 MWWRuza
 
гуру
21.03.23
17:41
Да, кстати... В дополнение.
Хранить полный код марки в 1с77, в том виде, как он прилетает со сканера - нельзя, она этого не умеет.
Или хранить обрезанный код, до первого GS1, или менять этот симвод на что-то "допустимое".
Иначе при первом ТиИ, 1с удалит эти ШК, так как GS1 не является допустимым символом в полях DBF с точки зрения ТиИ 1с77 :-)
17 Злопчинский
 
22.03.23
00:42
да нормально в 77 это как-то victuan хранит
18 MWWRuza
 
гуру
22.03.23
10:21
Да как он хранит...
Скорее всего, перед записью подменяет символ GS1 на (29), или что-то подобное, а где используется сохраненная в справочнике марка - в строке заменяет эту сохраненную последовательность на Симв(29)...
Увидит - если не так, поправит.
Потому как, непечатные символы при первом же ТиИ будут безжалостно порезаны.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший