7.7 Печать ценников

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем Bremo, 22 мар 2016.

  1. TopicStarter Overlay
    Bremo
    Offline

    Bremo

    Регистрация:
    20 апр 2014
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток!

    Подскажите пожалуйста, что добавить/исправить в обработке печать_ценников.ert, чтобы при Подборе товара из документа заполнялось количество такое же, как и в документе.

    Код:
    Перем ПечФирма;
    //******************************************************************************
    Функция ПолучитьЦену(Номенклатура,ДатаЦены)
        Цена=0;
        СпрЦ=СоздатьОбъект("Справочник.Цены");
        СпрЦ.ИспользоватьВладельца(Номенклатура);
        ТипЦен=Константа.РозничныйТипЦен;
        Если ПустоеЗначение(ТипЦен)=0 Тогда
            Если СпрЦ.НайтиПоРеквизиту("ТипЦен",ТипЦен,0)=1 Тогда
                Цена=СпрЦ.Цена.Получить(ДатаЦены);
                Если Цена=0 Тогда
                    Цена=СпрЦ.Цена.Получить(РабочаяДата());
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        Если Цена=0 Тогда
            Сообщить("Не удалось получить розничную цену товара '"+
                    Номенклатура.Код+" : "+СокрЛП(Номенклатура.Наименование)+"'","!!!");
        КонецЕсли;
        Возврат Цена;
    КонецФункции
    //******************************************************************************
    Функция ПолучитьКоличествоТоваров()
        Всего=Таб.КоличествоСтрок();
        Метки=СоздатьОБъект("ТаблицаЗначений");
        Таб.Выгрузить(Метки,,,"Метка,Количество");
        Отмечено=0;
        Ценников=0;
        Метки.ВыбратьСтроки();
        Пока Метки.ПолучитьСтроку()=1 Цикл
            Если Метки.Метка=2 Тогда
                Отмечено=Отмечено+1;
                Ценников=Ценников+Метки.Количество;
            КонецЕсли;
        КонецЦикла;
        Возврат "В списке всего товаров: "+Строка(Всего)
                +"; отмечено для печати товаров: "+Строка(Отмечено)
                +"; будет напечатано ценников: "+Строка(Ценников);
    КонецФункции
    //******************************************************************************
    
    Функция ДобавитьСлева( Стр1, Длн, Стр2 )
    
        Стр0 = Стр1;
    
        Пока СтрДлина( Стр0 ) <= Длн
        Цикл
            Стр0 = Стр2 + Стр0;
        КонецЦикла;
    
        Стр0 = Прав( Стр0, Длн );
       
        Возврат Стр0;
    
    КонецФункции
    
    Функция NumberToUpperChar( Num )
        UpperCharSet = "ABCDEFGHIJ";
        Num = Число(Прав(Num,1));
        Стр = Сред(UpperCharSet, Num + 1, 1);
        Возврат Стр;
    КонецФункции
    
    /////////////////////////////////////////////////////////////////////
    
    Функция NumberToLowerChar( Num )
        LowerCharSet = "abcdefghij";
        Num = Число(Прав(Num,1));
        Стр = Сред(LowerCharSet, Num + 1, 1);
        Возврат Стр;
    КонецФункции
    
    //////////////////////////////////////////////////
    
    //////////////////////////////////////////////////
    // Генерация строки, печатаемой как код EAN13
    
    Функция EAN13CodeGenerate(код)
    
        // Проверки
        Если ТипЗначения(код) <> 1
        Тогда
            Сообщить("Код для EAN13 должен числовым.");
            Возврат "";
        КонецЕсли;
       
        //Если СтрДлина(код) > 12
        //Тогда
        //    Сообщить("Код для EAN13 должен быть длинной не более 12 символов.");
        //    Возврат "";
        //КонецЕсли;              
    
        // Дополнение лидирующими пробелами
        код = ДобавитьСлева(Строка(код),13,"0");
    
        // Добавление кода четности - для кода, дополненого слева "0"
        //код = код + Строка(ParityCheck("0"+Код));
    
        //Разбор строки
        ПервыйФлаг = Число(Сред(код,1,1));
        левстр     = Сред(код,2,6);
        правстр    = Сред(код,8,6);
    
        правкод = "";
        Для Поз = 1 По 6
        Цикл
            правкод = правкод + NumberToLowerChar(Сред(правстр,Поз,1));
        КонецЦикла;
    
        //  Формирование левой части кода зависит от значениа ПервыйФлаг
        Если      ПервыйФлаг = 0
        Тогда
    //    0           A  A  A  A  A
            левкод = "#!" + Лев(левстр,1)
                + Сред(левстр,2,1)
                + Сред(левстр,3,1)
                + Сред(левстр,4,1)
                + Сред(левстр,5,1)
                + Сред(левстр,6,1);
        ИначеЕсли ПервыйФлаг = 1
        Тогда
    //    1           A  A  B  A  B  B
            левкод = "$!"
                + Лев(левстр,1)
                + Сред(левстр,2,1)
                + NumberToUpperChar(Сред(левстр,3,1))
                + Сред(левстр,4,1)
                + NumberToUpperChar(Сред(левстр,5,1))
                + NumberToUpperChar(Сред(левстр,6,1));
        ИначеЕсли ПервыйФлаг = 2
        Тогда
    //    2           A  A  B  B  A  B
            левкод = "%!"
                + Лев(левстр,1)
                + Сред(левстр,2,1)
                + NumberToUpperChar(Сред(левстр,3,1))
                + NumberToUpperChar(Сред(левстр,4,1))
                + Сред(левстр,5,1)
                + NumberToUpperChar(Сред(левстр,6,1));
        ИначеЕсли ПервыйФлаг = 3
        Тогда
    //    3           A  A  B  B  B  A
            левкод = "&!"
                + Лев(левстр,1)
                + Сред(левстр,2,1)
                + NumberToUpperChar(Сред(левстр,3,1))
                + NumberToUpperChar(Сред(левстр,4,1))
                + NumberToUpperChar(Сред(левстр,5,1))
                + Сред(левстр,6,1);
        ИначеЕсли ПервыйФлаг = 4
        Тогда
    //    4           A  B  A  A  B  B
            левкод = "'!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + Сред(левстр,3,1)
                + Сред(левстр,4,1)
                + NumberToUpperChar(Сред(левстр,5,1))
                + NumberToUpperChar(Сред(левстр,6,1));
        ИначеЕсли ПервыйФлаг = 5
        Тогда
    //    5           A  B  B  A  A  B
            левкод = "(!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + NumberToUpperChar(Сред(левстр,3,1))
                + Сред(левстр,4,1)
                + Сред(левстр,5,1)
                + NumberToUpperChar(Сред(левстр,6,1));
        ИначеЕсли ПервыйФлаг = 6
        Тогда
    //    6           A  B  B  B  A  A
            левкод = ")!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + NumberToUpperChar(Сред(левстр,3,1))
                + NumberToUpperChar(Сред(левстр,4,1))
                + Сред(левстр,5,1)
                + Сред(левстр,6,1);
        ИначеЕсли ПервыйФлаг = 7
        Тогда
    //    7           A  B  A  B  A  B
            левкод = "*!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + Сред(левстр,3,1)
                + NumberToUpperChar(Сред(левстр,4,1))
                + Сред(левстр,5,1)
                + NumberToUpperChar(Сред(левстр,6,1));
        ИначеЕсли ПервыйФлаг = 8
        Тогда
    //    8           A  B  A  B  B  A
            левкод = "+!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + Сред(левстр,3,1)
                + NumberToUpperChar(Сред(левстр,4,1))
                + NumberToUpperChar(Сред(левстр,5,1))
                + Сред(левстр,6,1);
        ИначеЕсли ПервыйФлаг = 9
        Тогда
    //    9           A  B  B  A  B  A
            левкод = ",!"
                + Лев(левстр,1)
                + NumberToUpperChar(Сред(левстр,2,1))
                + NumberToUpperChar(Сред(левстр,3,1))
                + Сред(левстр,4,1)
                + NumberToUpperChar(Сред(левстр,5,1))
                + Сред(левстр,6,1);
        КонецЕсли;
       
        // Получение строки - результата
        кодстр = левкод + "-" + правкод + "!";
       
        Возврат кодстр;
    
    КонецФункции
    
    Процедура ПоКнопкеПечать()
        НомерЦенника=0;
        Представление="";
        СтрПарам=Форматы.ПолучитьЗначение(Форматы.ТекущаяСтрока(),Представление);
        //Сообщить(СтрПарам);
        //Сообщить(Представление);
        СписПарам=СоздатьОбъект("СписокЗначений");
        СписПарам.ИзСтрокиСРазделителями(СтрПарам);
        ИсхТабл=СписПарам.ПолучитьЗначение(1);
        Ориентация=СписПарам.ПолучитьЗначение(2);
        ВСтроке=СписПарам.ПолучитьЗначение(3);
        НаСтранице=СписПарам.ПолучитьЗначение(4);
       
        Ценники=СоздатьОбъект("Таблица");
        Ценники.ИсходнаяТаблица(ИсхТабл);
        Таб.ВыбратьСтроки();
        Пока Таб.ПолучитьСтроку()=1 Цикл
            Если Таб.Метка=1 Тогда
                Продолжить;
            КонецЕсли;
            Номенклатура=Таб.Номенклатура;
            Количество=Таб.Количество;
            ПечРозн=СокрЛП(Формат(Таб.Цена,"Ч015.2, "))+" руб.";
            ПечФирма=СокрЛП(глПользователь.ОсновнаяФирма.Наименование);
            ПечНаименование=СокрЛП(?(ПустоеЗначение(Номенклатура.ПолнНаименование)=0,Номенклатура.ПолнНаименование,Номенклатура.Наименование));
            ПечЕдиница="за 1 "+СокрЛП(Номенклатура.БазоваяЕдиница.ОКЕИ.Наименование);
            ПечКодАрт="Код: "+Номенклатура.Код+?(ПустаяСтрока(Номенклатура.Артикул)=0,"  Арт.: "+СокрЛП(Номенклатура.Артикул),"");
            ПечАрт="Артикул: "+СокрЛП(Номенклатура.Артикул);
            ПечШтрихКод=СокрЛП(Номенклатура.БазоваяЕдиница.Штрихкод);
            ПечШК=EAN13CodeGenerate(Число(Номенклатура.БазоваяЕдиница.ШтрихКод));
            Для Инд=1 По Количество Цикл
               
                Если (НомерЦенника)/НаСтранице=Цел((НомерЦенника)/НаСтранице) Тогда
                    Ценники.НоваяСтраница();
                КонецЕсли;
                Если Цел(НомерЦенника/ВСтроке)=(НомерЦенника)/ВСтроке Тогда
                    Ценники.ВывестиСекцию("Товар|Ценник");
                Иначе
                    Ценники.ПрисоединитьСекцию("Товар|Ценник");
                КонецЕсли;
                НомерЦенника=НомерЦенника+1;
               
            КонецЦикла;
        КонецЦикла;
    //    Ценники.ПараметрыСтраницы(Ориентация,,,6,6,6,6);
        Ценники.ПараметрыСтраницы(Ориентация,,,0,0,0,0);
        Ценники.Показать("Ценники - "+Представление);
    КонецПроцедуры // ПоКнопкеПечать()разрывстроки
    //******************************************************************************
    Процедура СнятьВсеМетки()
        Таб.ВыбратьСтроки();
        Пока Таб.ПолучитьСтроку()=1 Цикл
            Таб.Метка=1;
        КонецЦикла;
    КонецПроцедуры
    //******************************************************************************
    Процедура УстановитьВсеМетки()
        Таб.ВыбратьСтроки();
        Пока Таб.ПолучитьСтроку()=1 Цикл
            Таб.Метка=2;
        КонецЦикла;
    КонецПроцедуры
    //******************************************************************************
    Процедура ОбратитьМетки()
        Таб.ВыбратьСтроки();
        Пока Таб.ПолучитьСтроку()=1 Цикл
            Таб.Метка=?(Таб.Метка=2,1,2);
        КонецЦикла;
    КонецПроцедуры
    //******************************************************************************
    Процедура УдалитьСтроку()
        КС=Таб.КоличествоСтрок();
        Если КС>0 Тогда
            ТС=Таб.ТекущаяСтрока();
            Таб.УдалитьСтроку(ТС);
            Если ТС=КС Тогда
                Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
            Иначе
                Таб.ТекущаяСтрока(ТС);
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    //******************************************************************************
    
    //******************************************************************************
    Функция Колво()
        Количество=0;
        ВвестиЧисло(Количество,"Количество",2,0,180);
        Если Количество<0 Тогда
            Количество=0;
        КонецЕсли;
        Возврат Количество;
    КонецФункции
    //******************************************************************************
    Процедура ЩелчокПоТаблице()
        Если Таб.КоличествоСтрок()=0 Тогда
            Возврат;
        КонецЕсли;
        ТС=Таб.ТекущаяСтрока();
        ТК=Таб.ТекущаяКолонка();
        Если ТК="Метка" Тогда
            Таб.Метка=?(Таб.Метка=1,2,1);
        ИначеЕсли ТК="Количество" Тогда
            Количество=Колво();
            Если Количество>0 Тогда
                Таб.Количество=Количество;
            КонецЕсли;
        ИначеЕсли ТК="Цена" Тогда
            Цена=Таб.Цена;
            Если ВвестиЧисло(Цена,"укажите цену",15,2,300)<>1 Тогда
                Возврат;
            КонецЕсли;
            Если Цена<=0 Тогда
                Возврат;
            КонецЕсли;
            Таб.Цена=Цена;
        КонецЕсли;
    КонецПроцедуры
    //******************************************************************************
    Процедура Подбор()
        Перем Фрм;
        Перем Тек;
        Если Таб.КоличествоСтрок()>0 Тогда
            Тек=Таб.Номенклатура;
        КонецЕсли;
        ОткрытьПодбор("Справочник.Номенклатура","ДляВыбора",Фрм,1,Тек);
        Фрм.ВыборГруппы(0);
    КонецПроцедуры
    //******************************************************************************
    Процедура ПодборИзДокумента()
        // получим виды документов с номенклатурой
        Виды=СоздатьОбъект("СписокЗначений");
        Для Инд=1 По Метаданные.Документ() Цикл
            Если Метаданные.Документ(Инд).РеквизитТабличнойЧасти()>0 Тогда// только документы с табличной частью
                Идентификатор=Метаданные.Документ(Инд).Идентификатор;
                Синоним=Метаданные.Документ(Инд).Синоним;
                Если глЕстьРеквизитМнЧ("Номенклатура",Идентификатор)=1 Тогда// если в ТЧ документа есть Номенклатура
                    Док=СоздатьОбъект("Документ."+Идентификатор);
                    Если Док.ВыбратьДокументы()=1 Тогда// незачем пополнять список документами, которых нет в базе
                        Виды.ДобавитьЗначение(Идентификатор,Синоним);
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        Вид="";
        Поз=0;
        Если Виды.ВыбратьЗначение(Вид,,Поз,300,1)<>1 Тогда
            Возврат;
        КонецЕсли;
        Конт="";
        ОткрытьПодбор("Документ."+Вид,"Журнал.ЖурналОбщий.ФормаСписка",Конт,1);
    КонецПроцедуры
    //******************************************************************************
    Процедура ОбработкаПодбора(Значение)
        Тип=ТипЗначенияСтр(Значение);
        Вид=Значение.Вид();
        Если Найти(Тип+"."+Вид,"Справочник.Номенклатура")>0 Тогда
            // подбор товара из Номенклатуры.
            // если не установлена галка "Запрашивать количество", добавляется по 1 шт.,
            // иначе добавляется введенное количество (целое двузначное число).
            // если подобранный товар уже есть в списке, введенное количество
            // добавляется к уже существующему количеству
            Количество=0;
            Если ЗапрашиватьКоличество=0 Тогда
                Количество=1;
            Иначе
                Количество=Колво();
            КонецЕсли;
            Если Количество=0 Тогда
                Возврат;
            КонецЕсли;
            Стр=0;
            Если Таб.НайтиЗначение(Значение,Стр,"Номенклатура")=0 Тогда
                Таб.НоваяСтрока();
                Таб.Метка=2;// 1 - не установлена, 2 - установлена
                Таб.Код=Значение.Код;
                Таб.ШтрихКод=Значение.БазоваяЕдиница.Штрихкод;
                Таб.Артикул=Значение.Артикул;
                Таб.Номенклатура=Значение;
                Таб.Количество=Количество;
                Таб.Цена=ПолучитьЦену(Значение,РабочаяДата());
                Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
            Иначе
                Таб.УстановитьЗначение(Стр,"Количество",Таб.ПолучитьЗначение(Стр,"Количество")+Количество);
                Таб.ТекущаяСтрока(Стр);
            КонецЕсли;
        ИначеЕсли
            Найти(Тип+"."+Вид,"Документ.")>0 Тогда// подбор не из Номенклатуры. из документов, например
            Значение.ВыбратьСтроки();
            Пока Значение.ПолучитьСтроку()=1 Цикл
                Ном=Значение.Номенклатура;
                Стр=0;
                Если Таб.НайтиЗначение(Ном,Стр,"Номенклатура")=0 Тогда
                    Таб.НоваяСтрока();
                    Таб.Метка=2;
                    Таб.Код=Ном.Код;
                    Таб.ШтрихКод=Ном.БазоваяЕдиница.Штрихкод;
                    Таб.Артикул=Ном.Артикул;
                    Таб.Номенклатура=Ном;
                    Таб.Количество=1;
                    Таб.Цена=ПолучитьЦену(Ном,Значение.ДатаДок);
                    Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецПроцедуры
    //******************************************************************************
    // Предопределенная процедура
    //
    Процедура ПриОткрытии()
        Таб.НоваяКолонка("Метка","Число",1,0,"",2);
        Таб.НоваяКолонка("Код","Строка",8,,,7);
        Таб.НоваяКолонка("ШтрихКод","Строка",13,,"Штрих Код",10);
        Таб.НоваяКолонка("Артикул","Строка",25,,"Арт",10);
        Таб.Новаяколонка("Номенклатура","Справочник.Номенклатура",,,,25);
        Таб.НоваяКолонка("Цена","Число",8,2,,6);
        Таб.НоваяКолонка("Количество","Число",2,0,"К-во",1.5);
        Таб.ВыводитьПиктограммы("Метка",1);
       
        ПараметрыФормата=СоздатьОбъект("СписокЗначений");
        Форматы.УдалитьВсе();
       
        ПараметрыФормата.УдалитьВсе();
        ПараметрыФормата.ДобавитьЗначение("ц40х30");// имя шаблона таблицы ценника
        ПараметрыФормата.ДобавитьЗначение("1");// ориентация: 1 - портрет, 2 - ландшафт
        ПараметрыФормата.ДобавитьЗначение("4");// ценников в строке
        ПараметрыФормата.ДобавитьЗначение("36");// ценников на странице
        Параметры=ПараметрыФормата.ВСтрокуСРазделителями();
        Форматы.ДобавитьЗначение(Параметры,"4 х 3 см");
    КонецПроцедуры // ПриОткрытии()
    //******************************************************************************
    //******************************************************************************
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    если обработка вызывается из документа - получайте контекст документа через параметр формы
  3. TopicStarter Overlay
    Bremo
    Offline

    Bremo

    Регистрация:
    20 апр 2014
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Обработка из документа не вызывается. В ней есть кнопка подбора товара из документа, так вот при подборе номенклатуры из документа в колонке количество указывается 1шт. независимо от того сколько штук в документе.

    [​IMG]
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    выложите саму обработку
  5. TopicStarter Overlay
    Bremo
    Offline

    Bremo

    Регистрация:
    20 апр 2014
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Вот сама обработка.

    Вложения:

  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    процедура ОбработкаПодбора
    строка 418
    заменить
    Таб.Количество=1;
    на
    Таб.Количество=Значение.Количество;
    Bremo нравится это.
  7. TopicStarter Overlay
    Bremo
    Offline

    Bremo

    Регистрация:
    20 апр 2014
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Все работает, Огромное спасибо за помощь!
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не за что... Обращайтесь
    Andrey_Ka нравится это.
  9. Andrey_Ka
    Offline

    Andrey_Ka

    Регистрация:
    6 ноя 2016
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    классная обработка, без танцев с бубном, вот добавил свою версию ценника
    Вместо названия магазина, решил штрих код поставить, но название товара необходимо в ручную укорачивать если необходимо артикул влезал.
    так как я собираю ценники с каждого продаваемого товара, с них же можно набивать заявку поставщику через сканер.

    Снимок.JPG

    надеюсь моя идея с таким ценником кому пригодится.

    Вложения:

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