Имя: Пароль:
1C
1C 7.7
v7: Штрих-М Драйвер ФР
, ,
0 Volodja
 
21.08.22
09:21
Здравствуйте всем.
В аптеке стоит конфигурация "Штрих-М: Кассир" от НТЦ "Штрих-М" версия 1.9.0.3

Настроен драйвер ККМ:  Шрифт-М: Драйвер ФР
Чеки распечатываются со списком проданной номенклатуры.
Распечатывается QR-код
А вот сведения в налоговую попадают общей суммой.
Подскажите что нужно поправить, чтобы свев налоговую также попадал весь список проданной номенклатуры
1 Volodja
 
21.08.22
09:26
Версия файла DrvFR.dll - 4.6.0.244
2 MWWRuza
 
гуру
21.08.22
10:24
Тут просто "поправить" не получится...
Нужно смотреть, какими командами печатается чек... По Вашему, получается, что он печатается просто произвольным текстом, а регистрация идет одной строкой, суммой.
Я не знаю, что это за конфигурация, но, возможно очень старая, еще "доонлайн"...
И драйвер сейчас 5.хх...
Короче, просто "одним нажатием на кнопку", тут не получится, надо серьезно анализировать что у Вас там и как работает.
3 Volodja
 
21.08.22
10:32
Марка Фискального регистратора: "Штрих-ФР-Ф-KZ"
(2) Да.Очень древняя конфигурация.Они работают на ней еще с начала 2000-х.
Все их  устраивает по программе, не хотят переходить на 8-ку.

Вот функция печати строки чека:
Функция ПечатьСтроки(Стр,ЖирнаяСтрока=0,НеПечататьНаКонтрольке=0,ПриОшибке=0,НеВыводитьВПорт=0,ТолькоВПорт=0) Экспорт;
    Если Константа.ИспользоватьККМ=1 Тогда
        ФискальныйРегистратор.Caption=Стр;
        Пока 1=1 Цикл
            Рез=ОбработкаОшибок(ФискальныйРегистратор,"кассы",ФискальныйРегистратор.PrintString(),ПриОшибке);
            Если Рез>0 Тогда
                ОбновитьДисплейКассира();
                Возврат 0;
            ИначеЕсли Рез=0 Тогда
                Возврат 1;
            КонецЕсли;
        КонецЦикла;
    ИначеЕсли Константа.ИспользоватьККМ=2 Тогда
        Если ТолькоВПорт=1 Тогда
            Если Константа.РаботаСКэшКонтрол=1 Тогда
                КэшКонтрол.SendToCom(Стр);
            КонецЕсли;
            Возврат 1;
        КонецЕсли;
        ФискальныйРегистратор.Password=Число(Константа.ПарольСистемногоАдминистратора);
        ФискальныйРегистратор.UseReceiptRibbon=1;
        Если НеПечататьНаКонтрольке=2 Тогда
            ФискальныйРегистратор.UseReceiptRibbon=0;
        КонецЕсли;
        Если НеПечататьНаКонтрольке=1 Тогда
            ФискальныйРегистратор.UseJournalRibbon=0;
        Иначе
            ФискальныйРегистратор.UseJournalRibbon=1;
        КонецЕсли;
        ФискальныйРегистратор.StringForPrinting=Стр;
        Пока 1=1 Цикл
            Если ЖирнаяСтрока=0 Тогда
                ФискальныйРегистратор.PrintString();
            Иначе
                ФискальныйРегистратор.PrintWideString();
            КонецЕсли;
            Если ПриОшибке=1 Тогда
                Рез=0;
            Иначе
                Рез=ОбработкаОшибокФР();
            КонецЕсли;
            Если Рез>0 Тогда
                ОбновитьДисплейКассира();
                Возврат 0;
            ИначеЕсли Рез=0 Тогда
                Если (НеВыводитьВПорт=0) И (Константа.РаботаСКэшКонтрол=1) И (НеПечататьНаКонтрольке<>2) Тогда
                    КэшКонтрол.SendToCom(Стр);
                КонецЕсли;
                Возврат 1;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецФункции
4 MWWRuza
 
гуру
21.08.22
10:32
У меня у одних клиентов аналогичная конфа от Раруса - "Автозапчасти-Автосервис", тоже приобреталась в период, когда об онлайн кассах еще и не было речи, я ее допиливаю регулярно по мере изменений в законах, вплоть до того, что сейчас она со Штрихом уже по ФФД-1.2 работает, с онлайн-запросом проверки марок и т.п., (колесья, никуда от них не деться). А изначально, когда она еще под кассы с ЭКЛЗ была, вроде тоже так печатала, товарный состав произвольным текстом и регистрация одной суммой.
5 MWWRuza
 
гуру
21.08.22
10:36
Ну, разбираться с Вашей что-то не охота...

Вот, из моей конфы цикл по строкам чека:

    Пока ОбрДок.ПолучитьСтроку()    > 0 Цикл
        Если ОбрДок.Вид()        = "ЗаказНаряд" Тогда
            Если ОбрДок.Наличие    = 4 Тогда
                Продолжить;
            КонецЕсли;  
        КонецЕсли;
        
        ПредстЦена                                    = Окр((ОбрДок.Сумма + ОбрДок.НП) / ОбрДок.Количество, 2, 1);
        СуммаДокумента                                = СуммаДокумента + ОбрДок.Количество * ПредстЦена;
        
        Наим                                        = Лев(СтрокуНоменклатурыЧек(ОбрДок.Номенклатура.Наименование, ОбрДок.Номенклатура), 40);
        Если ОбрДок.Вид() <> "ЗаказНаряд" Тогда
            КТН     = СокрЛП(ОбрДок.КТН);
            Если ОбрДок.Касса.ФФД_ККТ = Перечисление.ФФД_ККТ.ФФД1_05 Тогда
                Если (ПустоеЗначение(КТН) = 0) И (ОбрДок.Касса.ПечПризнМарк = 1) Тогда
                    ФискальныйРегистратор.StringForPrinting    = "[M] " + Наим;
                Иначе
                    ФискальныйРегистратор.StringForPrinting    = Наим;
                КонецЕсли;
            Иначе
                ФискальныйРегистратор.StringForPrinting    = Наим;
            КонецЕсли;
        Иначе
            ФискальныйРегистратор.StringForPrinting    = Наим;
        КонецЕсли;
        
//        ФискальныйРегистратор.CheckType             = 1;
        
        ФискальныйРегистратор.Price                    = ПредстЦена;
        ФискальныйРегистратор.Quantity                = ОбрДок.Количество;
        
        ФискальныйРегистратор.Summ1Enabled          = 1;
        ФискальныйРегистратор.Summ1                 = ПредстЦена * ОбрДок.Количество;
        
        ФискальныйРегистратор.PaymentTypeSign         = 4;
          ФискальныйРегистратор.PaymentItemSign         = 1;
          
          ФискальныйРегистратор.MeasureUnit             = 0; // мера количества
          ФискальныйРегистратор.DivisionalQuantity     = 0; // без дробного количества
        
        Рез = ФискальныйРегистратор.FNOperation();
        
        Если ПустоеЗначение(ОбрДок.КТН) = 0 Тогда
            
            Если ОбрДок.Касса.ФФД_ККТ                 = Перечисление.ФФД_ККТ.ФФД1_2 Тогда
                ФискальныйРегистратор.BarCode         = СокрЛП(ОбрДок.КТН);
                Рез                                 = ФискальныйРегистратор.FNSendItemBarcode();                
            Иначе    
                GTIN                                 = Сред(КТН, 3, 14);                            
                SerialNumber                         = Сред(КТН, 19, 13);
                ФискальныйРегистратор.MarkingType   = 17485; //  Это "444D"    
                ФискальныйРегистратор.GTIN          = GTIN;
                ФискальныйРегистратор.SerialNumber    = SerialNumber;
                Рез                                 = ФискальныйРегистратор.FNSendItemCodeData(); // отправка тега маркировки    
            КонецЕсли;
        КонецЕсли;    
        
        Если ОбработкаОшибок() <> 0 Тогда
            Возврат;
        КонецЕсли;
    КонецЦикла;

Думаю, разберетесь, если захотите.
6 Volodja
 
21.08.22
10:49
(5) А какая команда здесь отвечает за регистрацию позиции в налоговой?
Не судите строго, только начинаю разбираться с ФР. Еще не нашел даже списка команд регистратора
7 Volodja
 
21.08.22
10:50
Или то, что присваивается ФискальныйРегистратор.StringForPrinting уходит в налоговую и на печать?
8 MWWRuza
 
гуру
21.08.22
13:04
Эээээ... Тут сложнее.
Перед циклом по строкам:

    Если ОбрДок.Вид() <> "ЗаказНаряд" Тогда
        Если ОбрДок.ЧекНаВозврат = 0 Тогда
            ФискальныйРегистратор.CheckType = 0;            
        Иначе
            ФискальныйРегистратор.CheckType    = 2;
        КонецЕсли;
    Иначе
        ФискальныйРегистратор.CheckType     = 0;
    КонецЕсли;

    Рез    = ФискальныйРегистратор.OpenCheck();
    
    Если СокрЛП(глПользователь.Сотрудник.ИНН) <> "" Тогда
        ФискальныйРегистратор.TagNumber                = 1203;
        ФискальныйРегистратор.TagType               = 7;
        ФискальныйРегистратор.TagValueStr            = СокрЛП(глПользователь.Сотрудник.ИНН);
        ФискальныйРегистратор.FNSendTag();
    КонецЕсли;

Потом цикл, я выше Вам его привел, там главная команда ФНОперация,

после цикла:

    Получено                        = Число(Расшифровка.Получить("Получено"));
    Если Получено <= 0 Тогда
        Получено                    = СуммаДокумента;
    КонецЕсли;
    Если (Получено > 0) И (Получено > СуммаДокумента) Тогда
        ФискальныйРегистратор.Summ1     = Окр(Получено,2,1);
        ФискальныйРегистратор.Summ2     = 0;
        ФискальныйРегистратор.Summ3     = 0;
        ФискальныйРегистратор.Summ4     = 0;
    ИначеЕсли Док.ВидОпл = Перечисление.ВидОплаты.Мир Тогда    
        ФискальныйРегистратор.Summ2         = Окр(СуммаДокумента,2,1);
        ФискальныйРегистратор.Summ1     = 0;
        ФискальныйРегистратор.Summ3     = 0;
        ФискальныйРегистратор.Summ4     = 0;
    ИначеЕсли Док.ВидОпл = Перечисление.ВидОплаты.Visa Тогда    
        ФискальныйРегистратор.Summ3         = Окр(СуммаДокумента,2,1);
        ФискальныйРегистратор.Summ1     = 0;
        ФискальныйРегистратор.Summ2     = 0;
        ФискальныйРегистратор.Summ4     = 0;
    ИначеЕсли Док.ВидОпл = Перечисление.ВидОплаты.Master Тогда    
        ФискальныйРегистратор.Summ4     = Окр(СуммаДокумента,2,1);
        ФискальныйРегистратор.Summ1     = 0;
        ФискальныйРегистратор.Summ3     = 0;
        ФискальныйРегистратор.Summ2     = 0;
    Иначе
        ФискальныйРегистратор.Summ1     = Окр(СуммаДокумента,2,1);
        ФискальныйРегистратор.Summ2     = 0;
        ФискальныйРегистратор.Summ3     = 0;
        ФискальныйРегистратор.Summ4     = 0;
    КонецЕсли;
    ФискальныйРегистратор.Summ5         = 0;
    ФискальныйРегистратор.Summ6         = 0;
    ФискальныйРегистратор.Summ7         = 0;
    ФискальныйРегистратор.Summ8         = 0;
    ФискальныйРегистратор.Summ9         = 0;
    ФискальныйРегистратор.Summ10         = 0;
    ФискальныйРегистратор.Summ11         = 0;
    ФискальныйРегистратор.Summ12         = 0;
    ФискальныйРегистратор.Summ13         = 0;
    ФискальныйРегистратор.Summ14         = 0;
    ФискальныйРегистратор.Summ15         = 0;
    ФискальныйРегистратор.Summ16         = 0;
    ФискальныйРегистратор.RoundingSumm  = 0; // Сумма округления
    ФискальныйРегистратор.TaxType         = 4; // Основная система налогообложения        
    
    ФискальныйРегистратор.StringForPrinting = " "; // Без этого, печатает повтором последнюю строку наименования товара
    Рез = ФискальныйРегистратор.FNCloseCheckEx();
    
    ВыданаСдача                            = ФискальныйРегистратор.Change;
    
    Ошибка=ФискальныйРегистратор.ResultCode;

По сути, упрощенно:
Открываем чек: Рез    = ФискальныйРегистратор.OpenCheck();
Потом в цикле, печатаем строки, туда наименование, количество, сумму и т.п., и обязательно команда, что это ФНОперация: Рез = ФискальныйРегистратор.FNOperation();
Потом, всякие оплаты, сдачи и т.п., и потом закрываем чек:
Рез = ФискальныйРегистратор.FNCloseCheckEx();

Драйвер должен быть посвежее чем у Вас, например 5.17.
9 Volodja
 
21.08.22
16:29
(8) Не подскажите, где можно скачать драйвер версии 5.17 ?
10 Злопчинский
 
21.08.22
16:33
11 Volodja
 
21.08.22
16:53
(10) А библиотеки DrvFR.dll  я там не нашел. Есть на сайте https://www.ais-soft.ru/programs онлайн-кассы для 1С 7.7 и там набор  обработок,защищенных КЗК-2, Но без библиотеки.
12 Злопчинский
 
21.08.22
17:11
(11) онлайнкасы из (10) встраиваются в любую конфигу, в т.ч. и нетиповую. демо - с кзак, покупленное - без кзк.
13 Volodja
 
21.08.22
17:17
(12) я вот и хотел найти там библиотеку DrvFR.dll посвежее, а то уменя она 4.6.0.244, а (8) говорит, что нужна посвежее, хотя бы 5.17
14 Volodja
 
21.08.22
17:18
(12) или этим обработкам не нужна библиотека?
15 MWWRuza
 
гуру
21.08.22
18:34
Блин... Ну как так-то??? Первая ссылка в поиске по "штрих-м драйвер ккт": https://www.shtrih-m.ru/support/download/?section_id=all&product_id=all&type_id=all&searchDownloads=Драйвер+ККТ
16 Volodja
 
21.08.22
18:43
(15). точно.Виноват.Посыпаю голову пеплом.
17 Volodja
 
21.08.22
18:47
(15) Я сейчас с документацией знакомлюсь. И нарыл в настройках ККМ есть параметр "Каждая позиция как отдельная регистрация"

Данный флаг становиться доступном в случае работы через «Штрих-М: Драйвер
ФР» и при режиме печати чека по закрытию. Если флаг установлен, то при закрытии чека
каждая позиция будет пробиваться на фискальном регистраторе в виде команды
регистрации. Это может понадобиться, например для того, чтобы в регистрах ФР-а
отвечающих за налоги, накапливалась верная информация. Если флаг не установлен, то
Руководство пользователя 43
формирование чека происходит печатью с трок с последующей единственной
регистрацией на всю сумму с учетом скидок. Начисление налогов в этом случае ведется
программой, а не ФР-ом.


Это похоже то, что мне нужно?
У них как раз этот флаг не установлен.
18 MWWRuza
 
гуру
21.08.22
18:54
Я с этим не заморачивался. Просто, как я понял, это два режима - добавляете в чек строку в программе, она сразу печатается на чек. Потом, общая команда на закрытие. Или второй режим - передаются все строки чека, ничего не печатается. Потом, одной командой печатается весь чек. У меня, именно второй режим, и я голову не морочу. А с точки зрения передачи в ОФД, ИМХО в обеих режимах должно все передаваться. У меня, построчно только марки проверяются, при добавлении(сканированием) в чек в программе. Печатается потом общей одной командой.
19 Volodja
 
21.08.22
19:07
(18) Скорее всего вы говорите о способе печати чека:

В группе настроек «Способ печати чека» определяется в какой момент будет
происходить печать чека при регистрации продаж:
- После каждой регистрации (параллельная печать) – каждая позиция чека
печатается сразу после ее формирования. Это удобно при использовании медленных
(матричных) принтеров в магазинах с большим потоком покупателей.
- После закрытия чека (отложенная печать) – чек печатается только после
закрытия. Основное преимущество отложенной печати состоит в том, что при
использовании режима «объединять позиции с одинаковым товаром» экономится место на
чеке в случае регистрации позиций с одинаковым товаром. В случае использования
термопринтеров уменьшение пропускной способности при таком способе печати
незначительно, по сравнению с параллельной печатью.
20 MWWRuza
 
гуру
21.08.22
19:32
Ну, х.з.... Похоже. Тогда я не знаю, что это такое: "Каждая позиция как отдельная регистрация". Я на это просто даже не обращал внимания, все и так работает, понятия не имею, как там галочка стоит или нет...
21 ДедМорроз
 
22.08.22
09:41
У Штрих-М "Каждая позиция как отдельная регистрация" была еще при наличии бумажных контрольных лент,так что должно работать.
Вот только попадет наименование товара в эту регистрацию или нет - это уже нужно смотреть в коде.
На самом деле,оно достаточно просто дорабатывается,в отличие от современных конфигураций,где через xml
22 Volodja
 
22.08.22
12:51
Так и не получилось с помощью параметра "Каждая позиция как отдельная регистрация" отправлять в налоговую сведения о товаре.
Но нашел следующее:
Есть утилита Тест драйвера ККТ "Driver Test KKT 4.15.0.842"
c ее помощью заполняется поле Name. нажимаю кнопку Sale ,закрыть чек (Close receipt) и все ок. Данные уходят в налоговую в разрезе номенклатуры. А то что написано в Line (StringForPrinting) отображается на бумажном чеке
Вопрос. Как называется это свойство?
Скриншот теста драйвера. https://cloud.mail.ru/public/P7JH/zmQuQ62gN
Спасибо.
23 MWWRuza
 
гуру
22.08.22
13:11
Свойство вроде то-же самое, а вот метод - ФНОперация - ?
24 MWWRuza
 
гуру
22.08.22
13:15
Вот же я выше писал:

        ФискальныйРегистратор.StringForPrinting    = Наим;      
        ФискальныйРегистратор.Price                    = ПредстЦена;
        ФискальныйРегистратор.Quantity                = ОбрДок.Количество;
        ФискальныйРегистратор.Summ1Enabled          = 1;
        ФискальныйРегистратор.Summ1                 = ПредстЦена * ОбрДок.Количество;
        ФискальныйРегистратор.PaymentTypeSign         = 4;
        ФискальныйРегистратор.PaymentItemSign         = 1;
        ФискальныйРегистратор.MeasureUnit             = 0;// мера количества
        ФискальныйРегистратор.DivisionalQuantity     = 0;// без дробного количества
        
        Рез = ФискальныйРегистратор.FNOperation();

Это точно работает, все передается в ОФД и печатается на чеке.
25 Volodja
 
22.08.22
13:22
(24) Я тогда не пойму, почему во всей конфигурации "Штрих-М: Кассир" от НТЦ "Штрих-М" версия 1.9.0.3 вообще упоминания ФискальныйРегистратор.FNOperation() нет.
26 Volodja
 
22.08.22
14:37
(24) Похоже, что основные модуля по работе с ФР защищены в компоненте ShtrihContext.dll и чтобы выполнить ФискальныйРегистратор.FNOperation() видимо придется переписывать всю обработку РегистрацияПродаж.
27 MWWRuza
 
гуру
22.08.22
14:48
(25) версия 1.9.0.3 вообще упоминания ФискальныйРегистратор.FNOperation() нет.

А что, должно быть??? Походу, Вы думаете, что в начале 2000 годов предсказатели работали в Штрихе, и на тот момент уже знали, что в 2016(? если память не изменяет ?) придумают кассы онлайн и ФискальныеНакопители...

Я не знаю, что защищено в Вашей конфигурации, и что "спрятано" в длл, но, обычно процедуры/функции работы с оборудованием в них не прячут. Чаще всего, всякие интерфейсные дела, или какую-то логику учета... А работа с ККТ, обычно открыта. Так, как меняется часто, и каждый раз переписывать длл - накладно. Просто конфа старая, и этого всего просто в ней нет, там, как я уже в самом начале писал - все под "доисторический" ККМ с ЭКЛЗ заточено... Поэтому я и написал в самом начале - "просто поправить не получится, придется переписывать все процедуры работы с ККТ под новый драйвер"...
28 MWWRuza
 
гуру
22.08.22
14:51
На самом деле, там нет ничего сложного. Используя фрагменты тех кусков кода, что я выше привел - час делов вместе с отладкой. Но, естественно, только с живым ККТ. "На пальцах" не получится.
29 Volodja
 
22.08.22
15:27
(28) Я ошибся в (2) версия зарегистрированной DrvFR.dll - 4.15.0.842 от 25.03.2021
Просто (2) лежала в каталоге БД, и она старая ( 4.6.0.244)
Кроме метода FNOperation() нет также и Quantity и много еще чего.
Что интересно с конфигурацией в дистрибутиве идет внешняя обработка ПечатьПД.ert (подкладной документ) от 2005 года, там эти методы есть, кроме FNOperation(), но он не используется

И при вызове обработки РегистрацияПродаж выполняется такое:
    МодульОбработки.AssignContext(Контекст);
    МодульОбработки.Compile();
    КодНажатойКлавиши=-1;
    ФормаРегистрации=0;
    МодульОбработки.Execute();
30 Kigo_Kigo
 
22.08.22
15:39
(5) и Особенно в (8) вам все рассказали, только так и таком порядке будет все работать как надо
31 MWWRuza
 
гуру
22.08.22
22:02
(29) А компоненту Штриховскую, типа защита, лучще вырезать из этого модуля... Она там нафик не нужна, по крайней мере для взаимодействия с ККТ... Разобраться, что она там делает, и если этот функционал Вам нужен, оставить, а обработку обслуживания кассы переписать без нее, как у всех остальных сделано, а эсли без нее можно обойтись - то "Резать, не дожидаясь перитонита(С)"...

Если хотите, могу всю обработку обслуживания Штриха из своей конфы Рарусовской сохранить как внешнюю, и выложить куда-нибудь. Там, вся конфа тоже защитами через ВК, защищенную ключем, пронизана вся, но в этом месте ничего такого нет и близко, все чисто на языке 1С написано, без непонятных "черных ящиков"...
32 victuan1
 
24.08.22
10:19
(22) Поймите: для вашей конфигурации расстановка никаких галочек не поможет решить сабж.
Нужно вносить изменения в код программы и достаточно серьезные.
Если не можете сами, но есть бюджет на доработку, то обратитесь к программистам 1С.
33 Volodja
 
24.08.22
10:44
(32) К вам уже обратились
34 MWWRuza
 
гуру
24.08.22
10:48
+(32) Да, Виктор все правильно пишет. У меня эта конфа Рарусовская, на которую я ссылаюсь, тоже изначально была в таком-же состоянии - писалась Рарусом тогда, когда о кассах ОнЛайн даже в проектах разговоров не было. Было все на кассы с ЭКЛЗ заточено. Но, у меня организация эта на обслуге, я там получаю хоть копейки, но каждый месяц, и по мере необхолдимости что-то допиливаю потихоньку. Поэтому, я уже и не помню, в какой момент я решал именно проблему что и у Вас, но, точно допиливал и решил. Наверное, в далеком 2017 году... А сейчас, несколько месяцев назад, я в ее-же допилил под ФФД-1.2. И все это как-то постепенно, незаметно, без особой "революции", даже не заметно для пользователей. Хотя, последнюю доработку они скорее всего заметят - если при сканировании марки она не пройдет проверку в ЦРПТ, будет вопрос пользователю :-) Такое, сложно не заметить :-)
2 + 2 = 3.9999999999999999999999999999999...