[РЕШЕНО] Вывод артикула,серии,доп.реквизита в чек на ККМ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем SkyNetYar, 16 дек 2015.

  1. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Добрый день! УТ 11.1.10 (8.3.7)
    Необходимо в Чек на ККМ (не путать с печатной формой(макетом) документа ЧекККМ) выводить вместе с наименованием товара еще и артикул, например:
    19864, Редиска цветная
    Сейчас выводится только Наименование, стал рыть набрел на
    Документ.ЧекККМ.ФормаДокументаМастер модуль содержит
    &НаКлиенте
    Функция ПробитьЧекВыполнить()
    Код:
    &НаКлиенте
    Функция ПробитьЧекВыполнить()
    
        ЧекПробит = Ложь;
    
        ОписаниеОшибки = "";
    
        Если Объект.НомерЧекаККМ <> 0 Тогда
       
            ТекстСообщения = НСтр("ru = 'Чек уже пробит на фискальном регистраторе!'");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
            Возврат Ложь;
       
        КонецЕсли;
    
        Если МенеджерОборудованияКлиент.ОбновитьРабочееМестоКлиента() Тогда // Проверка на определенность рабочего места ВО
    
            ИдентификаторУстройстваФР              = ПараметрыКассыККМ.ИдентификаторУстройства;
            ИспользоватьБезПодключенияОборудования = ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования;
       
            Если ЗначениеЗаполнено(ИдентификаторУстройстваФР) Или ИспользоватьБезПодключенияОборудования Тогда
           
                // Подключаем ФР
                Результат = МенеджерОборудованияКлиентПереопределяемый.ОборудованиеПодключено(ИдентификаторУстройстваФР);
           
                Если Результат Или ИспользоватьБезПодключенияОборудования Тогда
               
                    Если Не ИспользоватьБезПодключенияОборудования Тогда
                   
                        // Готовим данные
                        ВходныеПараметры  = Новый Массив;
                        ВыходныеПараметры = Неопределено;
                   
                        НомерСекции = 1;
                   
                        // Подготовка таблицы товаров
                        ТаблицаТоваров = Новый Массив();
                   
                        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
                       
                            СтавкаНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС);
                       
                            Если Объект.ЦенаВключаетНДС Тогда
                                Сумма = СтрокаТЧ.Сумма;
                            Иначе
                                Сумма = СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС;
                            КонецЕсли;
                       
                            СуммаСкидки   = СтрокаТЧ.СуммаАвтоматическойСкидки   + СтрокаТЧ.СуммаРучнойСкидки;
                            ПроцентСкидки = СтрокаТЧ.ПроцентАвтоматическойСкидки + СтрокаТЧ.ПроцентРучнойСкидки;
                       
                            СтрокаТаблицыТоваров = Новый СписокЗначений();
                            СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
                                                                                        //  1 - Наименование
                            СтрокаТаблицыТоваров.Добавить("");                          //  2 - Штрихкод
                            СтрокаТаблицыТоваров.Добавить("");                          //  3 - Артикул
                            СтрокаТаблицыТоваров.Добавить(НомерСекции);                 //  4 - Номер отдела
                            СтрокаТаблицыТоваров.Добавить(СтрокаТЧ.Цена);               //  5 - Цена за позицию без скидки
                            СтрокаТаблицыТоваров.Добавить(СтрокаТЧ.КоличествоУпаковок); //  6 - Количество
                            СтрокаТаблицыТоваров.Добавить("");                          //  7 - Наименование скидки/наценки
                            СтрокаТаблицыТоваров.Добавить(СуммаСкидки);                 //  8 - Сумма скидки/наценки
                            СтрокаТаблицыТоваров.Добавить(ПроцентСкидки);               //  9 - Процент скидки/наценки
                            СтрокаТаблицыТоваров.Добавить(Сумма);                       // 10 - Сумма позиции со скидкой
                            СтрокаТаблицыТоваров.Добавить(0);                           // 11 - Номер налога (1)
                            СтрокаТаблицыТоваров.Добавить(СтрокаТЧ.СуммаНДС);           // 12 - Сумма налога (1)
                            СтрокаТаблицыТоваров.Добавить(СтавкаНДС * 100);             // 13 - Процент налога (1)
                            СтрокаТаблицыТоваров.Добавить(0);                           // 14 - Номер налога (2)
                            СтрокаТаблицыТоваров.Добавить(0);                           // 15 - Сумма налога (2)
                            СтрокаТаблицыТоваров.Добавить(0);                           // 16 - Процент налога (2)
                            СтрокаТаблицыТоваров.Добавить("");                          // 17 - Наименование секции форматирования товарной строки
                       
                            ТаблицаТоваров.Добавить(СтрокаТаблицыТоваров);
                       
                        КонецЦикла;
                   
                        // Подготовка таблицы оплат
                        ТаблицаОплат = Новый Массив();
                   
                        // Наличные
                        СтрокаОплаты = Новый СписокЗначений();
                        СтрокаОплаты.Добавить(0);
                        СтрокаОплаты.Добавить(Объект.ПолученоНаличными);
                        СтрокаОплаты.Добавить("Наличная оплата");
                        СтрокаОплаты.Добавить("");
                        ТаблицаОплат.Добавить(СтрокаОплаты);
                   
                        // Безналичные
                        СтрокаОплаты = Новый СписокЗначений();
                        СтрокаОплаты.Добавить(1);
                        СтрокаОплаты.Добавить(Объект.ОплатаПлатежнымиКартами.Итог("Сумма"));
                        СтрокаОплаты.Добавить("Безналичная оплата");
                        СтрокаОплаты.Добавить("");
                        ТаблицаОплат.Добавить(СтрокаОплаты);
                   
                        // Сертификатом
                        СтрокаОплаты = Новый СписокЗначений();
                        СтрокаОплаты.Добавить(3);
                        СтрокаОплаты.Добавить(Объект.ПодарочныеСертификаты.Итог("Сумма"));
                        СтрокаОплаты.Добавить("Сертификатом");
                        СтрокаОплаты.Добавить("");
                        ТаблицаОплат.Добавить(СтрокаОплаты);
                   
                        // Подготовка таблицы общих параметров
                        ОбщиеПараметры = Новый Массив();
                        ОбщиеПараметры.Добавить(0);                      //  1 - Тип чека
                        ОбщиеПараметры.Добавить(Истина);                 //  2 - Признак фискального чека
                        ОбщиеПараметры.Добавить(Неопределено);           //  3 - Печать на подкладном документе
                        ОбщиеПараметры.Добавить(СуммаДокумента);         //  4 - Сумма по чеку без скидок/наценок
                        ОбщиеПараметры.Добавить(СуммаДокумента);         //  5 - Сумма по чеку с учетом всех скидок/наценок
                        ОбщиеПараметры.Добавить("");                     //  6 - Номер дисконтной карты
                        ОбщиеПараметры.Добавить("");                     //  7 - Текст шапки
                        ОбщиеПараметры.Добавить("");                     //  8 - Текст подвала
                        ОбщиеПараметры.Добавить(0);                      //  9 - Номер смены (для копии чека)
                        ОбщиеПараметры.Добавить(0);                      // 10 - Номер чека (для копии чека)
                        ОбщиеПараметры.Добавить(0);                      // 11 - Номер документа (для копии чека)
                        ОбщиеПараметры.Добавить(0);                      // 12 - Дата документа (для копии чека)
                        ОбщиеПараметры.Добавить("");                     // 13 - Имя кассира (для копии чека)
                        ОбщиеПараметры.Добавить("");                     // 14 - Пароль кассира
                        ОбщиеПараметры.Добавить(0);                      // 15 - Номер шаблона
                        ОбщиеПараметры.Добавить("");                     // 16 - Наименование секции форматирования шапки
                        ОбщиеПараметры.Добавить("");                     // 17 - Наименование секции форматирования подвала
                   
                        ВходныеПараметры.Добавить(ТаблицаТоваров);
                        ВходныеПараметры.Добавить(ТаблицаОплат);
                        ВходныеПараметры.Добавить(ОбщиеПараметры);
                   
                        // Печатаем чек.
                        Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
                            ИдентификаторУстройстваФР,
                            "PrintReceipt",
                            ВходныеПараметры,
                            ВыходныеПараметры);
                   
                        СписаноБонусныхБалловВВалюте   = Объект.Товары.Итог("СуммаБонусныхБалловКСписаниюВВалюте");
                        НачисленоБонусныхБалловВВалюте = Объект.Товары.Итог("СуммаНачисленныхБонусныхБалловВВалюте");
                   
                        Если ЗначениеЗаполнено(Объект.КартаЛояльности)
                            И (СписаноБонусныхБалловВВалюте <> 0) Тогда
                       
                            ТекстоваяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                                НСтр("ru = 'Списано бонусных баллов: %1 %2'"), СписаноБонусныхБалловВВалюте, Объект.Валюта);
                            ВходныеПараметры = Новый Массив;
                            ВходныеПараметры.Добавить(ТекстоваяСтрока);
                            Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
                                ИдентификаторУстройстваФР,
                                "PrintText",
                                ВходныеПараметры,
                                ВыходныеПараметры);
                       
                        КонецЕсли;
                   
                        Если ЗначениеЗаполнено(Объект.КартаЛояльности)
                            И (НачисленоБонусныхБалловВВалюте <> 0) Тогда
                       
                            ТекстоваяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                                НСтр("ru = 'Начислено бонусных баллов: %1 %2'"), НачисленоБонусныхБалловВВалюте, Объект.Валюта);
                            ВходныеПараметры = Новый Массив;
                            ВходныеПараметры.Добавить(ТекстоваяСтрока);
                            Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
                                ИдентификаторУстройстваФР,
                                "PrintText",
                                ВходныеПараметры,
                                ВыходныеПараметры);
                       
                        КонецЕсли;
                   
                    КонецЕсли;
               
                    Если Результат Или ИспользоватьБезПодключенияОборудования Тогда
                   
                        // Установить полученное значение номера чека реквизиту документа.
                        Если Не ИспользоватьБезПодключенияОборудования Тогда
                            Объект.НомерЧекаККМ = ВыходныеПараметры[1];
                        КонецЕсли;
                   
                        Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробит");
                        Объект.Дата   = ТекущаяДата();
                        Если Не ЗначениеЗаполнено(Объект.НомерЧекаККМ) Тогда
                            Объект.НомерЧекаККМ = 1;
                        КонецЕсли;
                   
                        Модифицированность = Истина;
                   
                        РезультатПроведения = Записать(Новый Структура("РежимЗаписи, РежимПроведения", РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный));
                   
                        Если РезультатПроведения = Истина Тогда
                            ЧекПробит = Истина;
                        КонецЕсли;
                   
                        ПересчитатьДокументНаКлиенте();
                        ПодключитьОбработчикОжидания("УстановитьТекущийЭлементНаКнопкуЗакрыть", 0.1, Истина);
                   
                    Иначе
                   
                        ТекстСообщения = НСтр("ru = 'При печати чека произошла ошибка.
                        |Чек не напечатан на фискальном регистраторе.
                        |Дополнительное описание:
                        |%ДополнительноеОписание%'");
                   
                        ТекстСообщения = СтрЗаменить(ТекстСообщения,
                        "%ДополнительноеОписание%",
                   
                        ВыходныеПараметры[1]);
                        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
                   
                    КонецЕсли;
               
                Иначе
               
                    ТекстСообщения = НСтр("ru = 'При подключении устройства произошла ошибка.
                    |Чек не напечатан на фискальном регистраторе.
                    |Дополнительное описание:
                    |%ДополнительноеОписание%'");
               
                    ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ДополнительноеОписание%", ОписаниеОшибки);
               
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
               
                КонецЕсли;
           
            Иначе
           
                ТекстСообщения = НСтр("ru = 'Не выбран фискальный регистратор.'");
                ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
           
            КонецЕсли;
       
        Иначе
       
            ТекстСообщения = НСтр("ru = 'Предварительно необходимо выбрать рабочее место внешнего оборудования текущего сеанса.'");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
       
        КонецЕсли;
    
        Возврат ЧекПробит;
    
    КонецФункции
    В ней есть код
    Код:
    СтрокаТаблицыТоваров.Добавить("");                          //  3 - Артикул
    Никак не пойму как он задействован ,может кто сталкивался подскажет?
    Неужели просто сделать типа ?:
    Код:
    Артикул = СтрокаТЧ.Артикул;
    СтрокаТаблицыТоваров.Добавить(Артикул);
    Последнее редактирование: 16 дек 2015
  2. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Знать бы, какие колонки содержит Объект.Товары, но если мыслить логически, то
    Код:
    СтрокаТаблицыТоваров.Добавить(СтрокаТЧ.Номенклатура.Артикул);          // 3 - Артикул 
    Или так, как вы написали.
  3. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Нет,не так и не так не работает,ошибка поле не найдено..
    upload_2015-12-17_8-51-36.png
    Судя по форме оно вроде бы вообще в другом месте
    upload_2015-12-17_8-53-18.png
  4. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    В отладчике смотрю
    upload_2015-12-17_13-47-42.png
    Может быть можно программно как то выбрать и добавить Номенклатура.Артикул ?
  5. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Подскажите пожалуйста,хочу сделать так
    Код:
    НаименованиеТовара = СтрокаТЧ.Номенклатура.Артикул + ", " + Строка(СтрокаТЧ.Номенклатура);
    СтрокаТаблицыТоваров.Добавить(НаименованиеТовара);          //  1 - Наименование
    
    Но как мне поместить в СписокЗначений Артикул ?
  6. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Понял. Сама функция выполняется на клиенте, поэтому Артикул не может вычленить из Номенклатуры.
    Надо добавить Серверную функцию (без контекста):
    Код:
    &НаСервереБезКонтекста
    Функция ПолучитьАртикул(Знач Номенклатура)
        Возврат Номенклатура.ПолучитьОбъект().Артикул
    КонецФункции
    
    А в клиентской сделать так:
    Код:
    Артикул = ПолучитьАртикул(СтрокаТЧ.Номенклатура)
    
    Последнее редактирование: 17 дек 2015
    SkyNetYar нравится это.
  7. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Не обязательно запрос, можно просто через точку
    Один хрен будет запрос в цикле =)
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    А можно узнать для каких целей получаем объект?
    Dem0lisher нравится это.
  9. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Ну чтобы в цикле не просто ссылки тянуть, а сами объекты =))
    Пусть будут =)
  10. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Когда сообщение писал, случайно нажал на отправить. Надеялся быстро исправить, пока никто не видит :)
  11. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    Все, мы тебя за руку поймали, за изнасилованием базы =)
  12. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Так, на всякий случай, чтобы уже наверняка получилось. :)
    Dem0lisher нравится это.
  13. Dem0lisher
    Offline

    Dem0lisher Профессионал в 1С

    Регистрация:
    4 авг 2009
    Сообщения:
    1.023
    Симпатии:
    51
    Баллы:
    54
    А по принципу - "Чем черт не шутит", может быть у объекта уже изменился артикул, а в кеше по ссылке старый =)
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Ну и если у нас вдруг значение другого типа - будем писать новую функцию :)
  15. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Воу ,как я не допер что дело в клиенте ..
    В общем все получилось! Вы супер ! Спасибо ограменное! -Happy-
    Код:
    Артикул = ПолучитьАртикул(СтрокаТЧ.Номенклатура);
    НаименованиеТовара = Артикул + ", " + Строка(СтрокаТЧ.Номенклатура);
    upload_2015-12-17_16-27-16.png
  16. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Что интересно ,если я вставляю как в конфигурации
    Код:
    СтрокаТаблицыТоваров = Новый СписокЗначений();
                           
                            Артикул = ПолучитьАртикул(СтрокаТЧ.Номенклатура);
    
                            НаименованиеТовара = Артикул + ", " + Строка(СтрокаТЧ.Номенклатура);
                            //СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
                            СтрокаТаблицыТоваров.Добавить(НаименованиеТовара);          //  1 - Наименование
                            СтрокаТаблицыТоваров.Добавить("");                          //  2 - Штрихкод
                            СтрокаТаблицыТоваров.Добавить(Артикул);                          //  3 - Артикул
    
    а именно
    Код:
    СтрокаТаблицыТоваров.Добавить(Артикул);                          //  3 - Артикул
    То в чеке Артикул нигде не фигурирует ,только там где я его с наименованием вставил.Видимо где то еще контролируется вывод строк в чек.
    Но это уже не суть, и так сойдет =)
    По тому же принципу можно уже вывести и серии и прочую номенклатурную утварь.
    upload_2015-12-17_16-49-43.png

    А по поводу ПолучитьОбъект
    Код:
    &НаСервереБезКонтекста
    Функция ПолучитьАртикул(Знач Номенклатура)
        Возврат Номенклатура.Артикул
    КонецФункции
    Так бы я выбрал бы только значение артикула и тоже бы работало?
  17. Flash-Dance
    Offline

    Flash-Dance Профессионал в 1С

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    По-идее, должно работать.
  18. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Да,так тоже работает!
    Спасибо еще раз! :)
  19. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Елки палки, задался целью туда еще и серии вывести и гарантию(доп.реквизит номенклатуры) опять заплелся с передачами между клиентом и сервером,помогите -Cat-

    Код примерно такой но с передачами о5 не могу справится..
    Код:
    мСерийныеНомера = Объект.Серии.Выгрузить();
                           
                            пГарантия = "";
                            Для Каждого ДопРеквизит из СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты Цикл
                                Если ДопРеквизит.Свойство.Наименование = "Гарантия" Тогда
                                    пГарантия = Строка(ДопРеквизит.Значение);
                                КонецЕсли;   
                            КонецЦикла;   
                           
                            пСерия = "";
                            Отбор = Новый Структура;
                            Отбор.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
                            мСерии = мСерийныеНомера.НайтиСтроки(Отбор);
                            пКоличество = СтрокаТЧ.Количество;
                            Пока пКоличество > 0 и мСерии.Количество() > 0 Цикл
                                пСерия = пСерия + ?(пСерия <> "", ",", "") + Строка(мСерии[0].Серия);
                                пКоличество = пКоличество - 1;   
                                мСерийныеНомера.Удалить(мСерийныеНомера.Найти(мСерии[0].НомерСтроки, "НомерСтроки"));
                                мСерии.Удалить(0);
                            КонецЦикла;
                            //Добавили Артикул
                            Артикул = ПолучитьАртикул(СтрокаТЧ.Номенклатура);
    
                            НаименованиеТовара = Артикул + ", " + Строка(СтрокаТЧ.Номенклатура)+
                                        ?(пГарантия <> "", ", гарантия "+пГарантия+" дн.", "") +
                                        ?(пСерия <> "", ", Сер.№"+пСерия, "");
    Ругается на метод Выгрузить() на клиенте не доступен мСерийныеНомера = Объект.Серии.Выгрузить();
    Потом думаю что будет ругаться на СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты
  20. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Нет нужно именно весь код выполнять на сервере а присылать на клиент :eek:
    Последнее редактирование: 18 дек 2015

Поделиться этой страницей