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

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

  1. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Объект.Серии.Выгрузить() означает работу с Таблицей Значений. На клиенте такое невозможно.

    В принципе, в целях оптимизации, нужно перевести в серверную процедуру(функцию) весь цикл работы с номенклатурой, начиная с
    Код:
     Для Каждого СтрокаТЧ Из Объект.Товары Цикл 
    Тут главное - передать туда используемые переменные (ТаблицаТоваров)
  2. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    А вот эти 2-а куска кода можно перевести на сервер и вернуть результат на клиент?
    Гарантия
    Код:
    пГарантия = "";
                            Для Каждого ДопРеквизит из СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты Цикл
                                Если ДопРеквизит.Свойство.Наименование = "Гарантия" Тогда
                                    пГарантия = Строка(ДопРеквизит.Значение);
                                КонецЕсли; 
                            КонецЦикла;
    И Серии
    Код:
    Объект.Серии.Выгрузить()
    пСерия = "";
                            Отбор = Новый Структура;
                            Отбор.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
                            мСерии = мСерийныеНомера.НайтиСтроки(Отбор);
                            пКоличество = СтрокаТЧ.Количество;
                            Пока пКоличество > 0 и мСерии.Количество() > 0 Цикл
                                пСерия = пСерия + ?(пСерия <> "", ",", "") + Строка(мСерии[0].Серия);
                                пКоличество = пКоличество - 1; 
                                мСерийныеНомера.Удалить(мСерийныеНомера.Найти(мСерии[0].НомерСтроки, "НомерСтроки"));
                                мСерии.Удалить(0);
                            КонецЦикла;
    Последнее редактирование: 20 дек 2015
  3. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Гарантию обязательно нужно. Ну и серию можно в придачу. Вообще, чем меньше серверных вызовов из клиентских, тем быстрее код выполнится. Поэтому нужно весь цикл обработки номенклатуры запихать на сервер, а не так что сперва запускается цикл, и уже из него для каждой позиции номенклатуры выполнятся серверный вызов.
  4. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Я понимаю, но тут дело в типовой конфигурации, я стараюсь как можно больше раздельно сделать изменения в типовой что бы легче было обновляться. так сказать блоками..
    Тем более что в чеке у нас всегда одна позиция,эти прыжки не значительно скажутся на производительности..Не накидаете пожалуйста примерчик как их на сервер и обратно принять? я пытался опыта не хватает :(
  5. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    При обновлении обычно замещаются целиком модули, а не блоки в процедурах, поэтому тут уже хоть как функцию целиком надо будет менять. Причем, можно функцию вычисления Артикула удалить.
    Вот это дело выносим в отдельную процедуру
    Код:
    &НаСервере
    Процедура ОбработкаНоменклатуры(ТаблицаТоваров)
    
            // ПЕРЕД ЦИКЛОМ ВЫГРУЖАЕМ СЕРИЙНЫЕ НОМЕРА
            мСерийныеНомера = Объект.Серии.Выгрузить();
    
          // САМ ЦИКЛ
         Для Каждого СтрокаТЧ Из Объект.Товары Цикл
              СтавкаНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС);
              Если Объект.ЦенаВключаетНДС Тогда
                   Сумма = СтрокаТЧ.Сумма;
              Иначе
              Сумма = СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС;
              КонецЕсли;
              СуммаСкидки = СтрокаТЧ.СуммаАвтоматическойСкидки + СтрокаТЧ.СуммаРучнойСкидки;
              ПроцентСкидки = СтрокаТЧ.ПроцентАвтоматическойСкидки + СтрокаТЧ.ПроцентРучнойСкидки;
              СтрокаТаблицыТоваров = Новый СписокЗначений();
              СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
    
            //СЮДА ВСТАВЛЯЕМ ОБРАБОТКУ СЕРИЙ  И ГАРАНТИЙ
               пГарантия = "";
               Для Каждого ДопРеквизит из СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты Цикл
                    Если ДопРеквизит.Свойство.Наименование = "Гарантия" Тогда
                         пГарантия = Строка(ДопРеквизит.Значение);
                    КонецЕсли;
               КонецЦикла;
               пСерия = "";
               Отбор = Новый Структура;
               Отбор.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
               мСерии = мСерийныеНомера.НайтиСтроки(Отбор);
               пКоличество = СтрокаТЧ.Количество;
               Пока пКоличество > 0 и мСерии.Количество() > 0 Цикл
                    пСерия = пСерия + ?(пСерия <> "", ",", "") + Строка(мСерии[0].Серия);
                    пКоличество = пКоличество - 1;
                    мСерийныеНомера.Удалить(мСерийныеНомера.Найти(мСерии[0].НомерСтроки, "НомерСтроки"));
                    мСерии.Удалить(0);
               КонецЦикла;
              
               //ТАК КАК МЫ НА СЕРВЕРЕ, ТО АРТИКУЛ УЖЕ НЕ ВЫЧИСЛЯЕМ, А ИЗВЛЕКАЕМ НАПРЯМУЮ
               НаименованиеТовара = СтрокаТЧ.Номенклатура.Артикул + ", " + СтрокаТЧ.Номенклатура.Наименование +
               ?(пГарантия <> "", ", гарантия "+пГарантия+" дн.", "") +
               ?(пСерия <> "", ", Сер.№"+пСерия, "");
    
    
               СтрокаТаблицыТоваров.Добавить(НаименованиеТовара)    // 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 - Наименование секции форматирования товарной строки
              ТаблицаТоваров.Добавить(СтрокаТаблицыТоваров);
    
               //ЗДЕСЬ  ЗАКАНЧИВАЮТСЯ СТАНДАРТНЫЕ КОМАНДЫ ЦИКЛА
     
    КонецЦикла;
    
    в клиентской процедуре заместо этого цикла вставляем
    Код:
     ОбработкаНоменклатуры(ТаблицаТоваров) 
    Примерно так все. Может, где ошибся, так как полную продуру не видел. Но это уже мелочи - поправить несложно.
  6. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Кстати
    Код:
    ДопРеквизит.Свойство.Наименование = "Гарантия"
    Может, правильнее будет не "Гарантия", а "Гарантия (Номенклатура (общие))" или как-то по-другому? Я так понял, конфа УТ 11.1, а там есть такой хитрый момент с допреквизитами!
  7. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Да, что то тут с Гарантией не то.. В Рознице 2.0 все работало,в УТ 11.1 какая то хитрость
    upload_2015-12-23_18-18-15.png
    --- Объединение сообщений, 23 дек 2015 ---
    Сделал вот как на скриншоте но он все равно не присваивает
    upload_2015-12-23_18-31-46.png

    Находит Номенклатура поставщика ,а гарантию что то нет...
    Последнее редактирование: 23 дек 2015
  8. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Ура вот так получилось!
    upload_2015-12-23_18-53-1.png
  9. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Не одна беда дак другая теперь, приложение 1С крэшится при таком варианте =\ на эмуляторе по крайней мере..
    А с сервера то надо возвращать результат то обратно в функцию?
    --- Объединение сообщений, 23 дек 2015 ---
    upload_2015-12-23_20-10-1.png
    Я может туплю или не догоняю =(
    Вот в итоге обе процедуры
    Код:
    &НаСервере
    Процедура ОбработкаНоменклатуры(ТаблицаТоваров)
       
        НомерСекции = 1;
        мСерийныеНомера = Объект.Серии.Выгрузить();
       
        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
            СтавкаНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС);
            Если Объект.ЦенаВключаетНДС Тогда
                Сумма = СтрокаТЧ.Сумма;
            Иначе
                Сумма = СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС;
            КонецЕсли;
            СуммаСкидки = СтрокаТЧ.СуммаАвтоматическойСкидки + СтрокаТЧ.СуммаРучнойСкидки;
            ПроцентСкидки = СтрокаТЧ.ПроцентАвтоматическойСкидки + СтрокаТЧ.ПроцентРучнойСкидки;
            СтрокаТаблицыТоваров = Новый СписокЗначений();
            СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
           
            Гарантия = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Гарантия");
            пГарантия = "";
            Для Каждого ДопРеквизит из СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты Цикл
                Если ДопРеквизит.Свойство.Наименование = Гарантия.Наименование Тогда
                    пГарантия = Строка(ДопРеквизит.Значение);
                КонецЕсли;
            КонецЦикла;
            пСерия = "";
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
            мСерии = мСерийныеНомера.НайтиСтроки(Отбор);
            пКоличество = СтрокаТЧ.Количество;
            Пока пКоличество > 0 и мСерии.Количество() > 0 Цикл
                пСерия = пСерия + ?(пСерия <> "", ",", "") + Строка(мСерии[0].Серия);
                пКоличество = пКоличество - 1;
                мСерийныеНомера.Удалить(мСерийныеНомера.Найти(мСерии[0].НомерСтроки, "НомерСтроки"));
                мСерии.Удалить(0);
            КонецЦикла;
           
            НаименованиеТовара = "Артикул:" +СтрокаТЧ.Номенклатура.Артикул+", "+СтрокаТЧ.Номенклатура.Наименование+
            ?(пГарантия <> "", ", Гарантия "+пГарантия+" мес.", "") +
            ?(пСерия <> "", ", Сер.№"+пСерия, "");
           
           
            СтрокаТаблицыТоваров.Добавить(НаименованиеТовара);          // 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 Тогда
           
            ТекстСообщения = НСтр("ru = 'Чек уже пробит на фискальном регистраторе!'");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
            Возврат Ложь;
           
        КонецЕсли;
       
        Если МенеджерОборудованияКлиент.ОбновитьРабочееМестоКлиента() Тогда // Проверка на определенность рабочего места ВО
       
            ИдентификаторУстройстваФР              = ПараметрыКассыККМ.ИдентификаторУстройства;
            ИспользоватьБезПодключенияОборудования = ПараметрыКассыККМ.ИспользоватьБезПодключенияОборудования;
           
            Если ЗначениеЗаполнено(ИдентификаторУстройстваФР) Или ИспользоватьБезПодключенияОборудования Тогда
               
                // Подключаем ФР
                Результат = МенеджерОборудованияКлиентПереопределяемый.ОборудованиеПодключено(ИдентификаторУстройстваФР);
               
                Если Результат Или ИспользоватьБезПодключенияОборудования Тогда
                   
                    Если Не ИспользоватьБезПодключенияОборудования Тогда
                       
                        // Готовим данные
                        ВходныеПараметры  = Новый Массив;
                        ВыходныеПараметры = Неопределено;
                       
                        НомерСекции = 1;
                       
                        // Подготовка таблицы товаров
                        ТаблицаТоваров = Новый Массив();
                       
                        //Выносим обработку заполнения на сервер
                        ОбработкаНоменклатуры(ТаблицаТоваров);
                       
                        // Подготовка таблицы оплат
                        ТаблицаОплат = Новый Массив();
                       
                        // Наличные
                        СтрокаОплаты = Новый СписокЗначений();
                        СтрокаОплаты.Добавить(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 = 'Предварительно необходимо выбрать рабочее место внешнего оборудования текущего сеанса.'");
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
           
        КонецЕсли;
       
        Возврат ЧекПробит;
       
    КонецФункции
    Последнее редактирование: 23 дек 2015
  10. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    А в каком именно месте ругается на неопределенную переменную НаименованиеТовара? А то вроде бы всё определено должно быть! Если через отладчик запустить, то при любой ошибке есть возможность посмотреть, где именно эта ошибка (кнопка "Подробнее").
  11. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Вот как только проходим наши изменения в отдельной процедуре на сервере,все наши значения исчезают..
    upload_2015-12-25_13-44-50.png
    Когда мы находимся в конце нашей новой процедуре на сервере то все нормально..
    upload_2015-12-25_13-47-12.png
    По шагам далее идет во всякие общие модули оборудования и.т.д и когда доходит до вывода в чек то крэшится приложение с ошибкой
    upload_2015-12-25_13-55-55.png
    "Подробнее" Вы имели ввиду на ошибке виндоус? простите не понял..
  12. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Я тоже не так понял. Думал, что сама программа ошибку выдает, но не вылетает. Тогда можно посмотреть, что за ошибка. Но когда программа вылетает, тогда это уже сложный момент.
    Кстати, при возврате из сервера на клиент, те переменные, которые на клиенте не задействованы, очищаются. Наверное, поэтому они и неопределены. Чтобы убедиться, что причина крэша не в этом, надо в клиентскую процедуру сразу же после вызова серверной добавить временный код с выводом сообщений о содержании полученной переменной ТаблицаТоваров и посмотреть результат (какие сообщения появятся).
    Код:
    Для каждого СтрокаТаблицыТоваров = 0 По ТаблицаТоваров.ВГраница() Цикл
         Для каждого ЭлементСтроки Из ТаблицаТоваров[СтрокаТаблицыТоваров] Цикл
              Сообщить("" + СтрокаТаблицыТоваров + " - " + Строка(ЭлементСтроки.Значение))
         КонецЦикла
    КонецЦикла
    
  13. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Что то не могу понять ошибку
    upload_2015-12-25_23-13-46.png
  14. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Наверное вот так правильно будет
    Код:
    Для СтрокаТаблицыТоваров = 0 По ТаблицаТоваров.ВГраница() Цикл
                 Для Каждого ЭлементСтроки Из ТаблицаТоваров[СтрокаТаблицыТоваров] Цикл
                         Сообщить("" + СтрокаТаблицыТоваров + " - " + Строка(ЭлементСтроки.Значение));
                 КонецЦикла;
    КонецЦикла;
    Вот что выдало
    upload_2015-12-26_1-9-8.png

    Результат вроде какой то странный, сперва идет просто наименование товара,а потом уже с доработками,как бы два раза отдает результат, может в этом дело?
  15. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    У вас в коде есть в начале процедуры
    Код:
    СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
    
    Из-за этого первая строчка сообщения такая. Не знаю, было ли это в оригинальном коде. Можно попробовать удалить. Если дело не в этом, то обратно добавить.
  16. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Ну это издевательство :) , ошибок теперь нет, но на чек не выводит гарантии и серии , и наименование то товара не полностью...
    upload_2015-12-26_13-49-30.png

    Немного сократил текст, может это уже настройки эмулятора что ле..
    upload_2015-12-26_13-56-28.png
    Посмотрел,он и раньше обрезал оказывается наименование,хмм...,как бы получается не переносит строки...
    Последнее редактирование: 26 дек 2015
  17. Flash-Dance
    Offline

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

    Регистрация:
    20 май 2012
    Сообщения:
    365
    Симпатии:
    42
    Баллы:
    54
    Посмотрел, программа помещает ТаблицуТоваров во ВходныеПараметры и их уже передает в ОбработчикДрайвера. Поэтому, да, скорее всего, дело в настройках драйвера!
  18. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Покапался отладчиком,выяснил что он до самого последнего передает все полностью, думаю это эмулятор обрезает, как в эмуляторе копаться я не знаю,где то обработка зарыта, остается опробовать на нормальном ККМ..
    upload_2015-12-26_19-23-43.png
  19. Flash-Dance
    Offline

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

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

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Фух,только добрался до конфигурации и смог проверить на реальном КММ, в общем все работает нормально! :)
    Немного под итожим по теме!
    Благодаря глубокоуважаемому Flash-Dance получилось добиться результата и выводить доп.реквизит номенклатуры серию и артикул товара вместе с наименованием!
    Поскольку гугление не приводило к похожим темам возможно кому то будет интересен итоговый результат!
    Проверено на УТ 11.1.10 ,возможно будет работать на РТ 2.1 (на РТ 2.0 все выполняется на сервере изначально)
    Документы.ЧекККМ.ФормаДокументаМастер находим Функция ПробитьЧекВыполнить() заменяем в ней
    Код:
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
                           
                            СтавкаНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС);
                           
                            Если Объект.ЦенаВключаетНДС Тогда
                                Сумма = СтрокаТЧ.Сумма;
                            Иначе
                                Сумма = СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС;
                            КонецЕсли;
                           
                            СуммаСкидки   = СтрокаТЧ.СуммаАвтоматическойСкидки   + СтрокаТЧ.СуммаРучнойСкидки;
                            ПроцентСкидки = СтрокаТЧ.ПроцентАвтоматическойСкидки + СтрокаТЧ.ПроцентРучнойСкидки;
                           
                            СтрокаТаблицыТоваров = Новый СписокЗначений();
                            СтрокаТаблицыТоваров.Добавить(Строка(СтрокаТЧ.Номенклатура));
                                                                                        //  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 - Наименование секции форматирования товарной строки
                           
                            ТаблицаТоваров.Добавить(СтрокаТаблицыТоваров);
                           
                        КонецЦикла;
    На
    Код:
    ОбработкаНоменклатуры(ТаблицаТоваров);
    Добавляем новую Процедуру на сервере
    Код:
    &НаСервере
    Процедура ОбработкаНоменклатуры(ТаблицаТоваров)
       
        НомерСекции = 1;
        мСерийныеНомера = Объект.Серии.Выгрузить();
       
        Для Каждого СтрокаТЧ Из Объект.Товары Цикл
            СтавкаНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(СтрокаТЧ.СтавкаНДС);
            Если Объект.ЦенаВключаетНДС Тогда
                Сумма = СтрокаТЧ.Сумма;
            Иначе
                Сумма = СтрокаТЧ.Сумма + СтрокаТЧ.СуммаНДС;
            КонецЕсли;
            СуммаСкидки = СтрокаТЧ.СуммаАвтоматическойСкидки + СтрокаТЧ.СуммаРучнойСкидки;
            ПроцентСкидки = СтрокаТЧ.ПроцентАвтоматическойСкидки + СтрокаТЧ.ПроцентРучнойСкидки;
            СтрокаТаблицыТоваров = Новый СписокЗначений();
           
            Гарантия = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Гарантия");
            пГарантия = "";
            Для Каждого ДопРеквизит из СтрокаТЧ.Номенклатура.ДополнительныеРеквизиты Цикл
                Если ДопРеквизит.Свойство.Наименование = Гарантия.Наименование Тогда
                    пГарантия = Строка(ДопРеквизит.Значение);
                КонецЕсли;
            КонецЦикла;
            пСерия = "";
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
            мСерии = мСерийныеНомера.НайтиСтроки(Отбор);
            пКоличество = СтрокаТЧ.Количество;
            Пока пКоличество > 0 и мСерии.Количество() > 0 Цикл
                пСерия = пСерия + ?(пСерия <> "", ",", "") + Строка(мСерии[0].Серия);
                пКоличество = пКоличество - 1;
                мСерийныеНомера.Удалить(мСерийныеНомера.Найти(мСерии[0].НомерСтроки, "НомерСтроки"));
                мСерии.Удалить(0);
            КонецЦикла;
           
            НаименованиеТовара = СтрокаТЧ.Номенклатура.Артикул+", "+СтрокаТЧ.Номенклатура.Наименование+
            ?(пГарантия <> "", ", Гар."+пГарантия+" мес.", "") +
            ?(пСерия <> "", ", Сер.№"+пСерия, "");
           
           
            СтрокаТаблицыТоваров.Добавить(НаименованиеТовара);          // 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 - Наименование секции форматирования товарной строки
            ТаблицаТоваров.Добавить(СтрокаТаблицыТоваров);
           
        КонецЦикла;
    КонецПроцедуры
    Все,после этого на Чеке КММ будет выводить Артикул,Наименование,Гарантия(доп.реквизит Номенклатуры),Серия

    Гарантия это дополнительный общий реквизит номенклатуры, его можно опустить из кода.А Серия Наименование,Артикул это типовые УТ механизмы без изменений.

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