Версия для печати темы (https://pro1c.org.ua/index.php?s=4fff944c70d8586608bb5c64d203ff10&showtopic=36630)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Формирование печатной формы этикетки

Автор: Yevhenii 14.04.17, 8:52

1С Предприятие 8.2 обычное приложение, обычная форма
Конфигурация "Управление торговым предприятием для Украины", редакция 1.2.

День добрый!


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 3,4
 

Автор: Bernet 14.04.17, 8:57

Yevhenii @ Сегодня, 9:52 * ,
в чем вопрос собственно?

Автор: Yevhenii 14.04.17, 9:14

1С Предприятие 8.2 обычное приложение, обычная форма
Конфигурация "Управление торговым предприятием для Украины", редакция 1.2.

День добрый!

Стоит задача печатать этикетки со штрихкодом. Код 13-значный. 10 цифр относительно уникальные, 3 цифры в конце должны меняться относительно количества напечатаных этикеток.

Алгоритм следующий:
Нажатие на кнопку -> Цикл от 1 до количества нужных этикеток -> Прорисовка самого макета на ТабДоке -> Печать(програмно, путём имитирования нажатия клавиш Сtrl+P или Ctrl+Shift+P -> Увеличиваю Счётчик на 1;

В итоге вижу отладчиком что код выполняется поэтапно так как нужно, и принтер печатает заданное количество этикеток, но все они идут с кодом который равен количеству печати.
Хотя процедура перерисовки вродь как срабатывает, т.е. програмно переназначает значение штрих коду на каждом этапе от 1 до 5 (к примеру до 5) т.е. Штрих код пять раз перерисовывается со значением от ХХХХХХХХХХ001 до ХХХХХХХХХХ005 а на печать вылазит 5 штук одинаковых со значением ХХХХХХХХХХ005.
Может кто что знает того что не знаю или не понимаю я? буду весьма благодарен за любые советы.

Код привожу

Нажатие на кнопку:

Процедура Кнопка1Нажатие(Элемент)
        ЧислоДо = ЭлементыФормы.ПолеВвода2.Значение;
        ЧислоОт =1;
        Пока ЧислоОт <=ЧислоДо Цикл
            Счётчик = ЧислоОт;
            НарисоватьМакет2();  // процедура перерисовки макета
            ПечатьЭтикетки();    // процедура печати        
            ЧислоОт=ЧислоОт+1;
        КонецЦикла;    
КонецПроцедуры


процедура перерисовки макета

Процедура НарисоватьМакет2()
    Макет = Обработки.ПечатьШтрихкодов.ПолучитьМакет("ПечатьНаклейки");
    ОбластьНадпись = Макет.ПолучитьОбласть("Надпись");
    ОбластьМодель = Макет.ПолучитьОбласть("Модель");
    ОбластьШтрихКод = Макет.ПолучитьОбласть("ШтрихКод");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ЭлементыФормы.ТабДок.ВерхнийКолонтитул.Выводить = Ложь;
    ЭлементыФормы.ТабДок.НижнийКолонтитул.Выводить = Ложь;
    ЭлементыФормы.ТабДок.АвтоМасштаб = Истина;
    ЭлементыФормы.ТабДок.ПолеСверху = 0;
    ЭлементыФормы.ТабДок.ПолеСнизу=0;
    ЭлементыФормы.ТабДок.ПолеСлева = 0;
    ЭлементыФормы.ТабДок.ПолеСправа = 0;
    ЭлементыФормы.ТабДок.РазмерКолонтитулаСверху = 0;
    ЭлементыФормы.ТабДок.РазмерКолонтитулаСнизу = 0;
    ЭлементыФормы.ТабДок.ИмяПринтера = "TSC TTP-244 Pro_Server";
    ЭлементыФормы.ТабДок.Очистить();
    ЭлементыФормы.ТабДок.Вывести(ОбластьНадпись);
    ОбластьМодель.Параметры.Модель  = Строка(ЭтотОбъект.Номенклатура.Наименование);
    ЭлементыФормы.ТабДок.Вывести(ОбластьМодель);
    РисунокШтрихкод  = ОбластьШтрихКод.Рисунки.КодРисунок;
    СтрШтрихКод=ШтрихКод+"000";
    Если Счётчик <=9 Тогда
        СШтрихКод = Лев(СтрШтрихКод,12)+Строка(Счётчик);
    ИначеЕсли Счётчик >9 И    Счётчик <=99 Тогда
        СШтрихКод = Лев(СтрШтрихКод,11)+Строка(Счётчик);
    ИначеЕсли  Счётчик >99 И    Счётчик <=899     Тогда
        СШтрихКод = Лев(СтрШтрихКод,10)+Строка(Счётчик);
    Иначе
        Сообщить("Напечатано 900 этикеток!!!");
    КонецЕсли;
    
    
    ОбластьШтрихКод.Рисунки.КодРисунок.Объект.ТипКода = 4;   // тип штрихкода Code-128
    ОбластьШтрихКод.Рисунки.КодРисунок.Объект.Сообщение = ?(ПустаяСтрока(""),СШтрихКод,"");
    ЭлементыФормы.ТабДок.Вывести(ОбластьШтрихКод);
    
    Если Флаг=Истина Тогда
        ОбластьПодвал.Параметры.Флаг = Строка("Ростовка");
    Иначе
        ОбластьПодвал.Параметры.Флаг = Строка("Вязка");
    КонецЕсли;
    ЭлементыФормы.ТабДок.Вывести(ОбластьПодвал);
    
    
    
КонецПроцедуры


процедура печати

Процедура ПечатьЭтикетки()
    ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабДок;
    Shell = Новый COMОбъект("WScript.Shell");
    //Shell.SendKeys("%+A+H)");
    Shell.SendKeys("^P"); //имитируем нажатие Ctr+Р   Предварительный просмотр
    //Shell.SendKeys("%фм");   //Параметры страницы
    ////· "Shift" - +;
    ////· "Ctrl" - ^;
    ////· "Alt" - %.
                          
КонецПроцедуры



Bernet @ Сегодня, 9:57 * ,

Сори, клацнул Enter в Теме в пустом посте, потом пришлось редактировать уже опубликованый)

Автор: Bernet 14.04.17, 9:41

Yevhenii @ Сегодня, 10:14 * ,
Ну на вскидку первое что приходит на ум:
когда я игрался со штрих-кодами, то была такая фигня с EAN-13: мне надо было также по порядку печатать какое-то количество этикеток, но там был прикол в том, что просто добавлением 1 в конце не обойдешься, т.к. BarCode в зависимости от типа штрих-кода должен по символьному представлению числа выдать нам сам штрих-код (расположение черных штрихов), так вот не каждое число он мог так нарисовать. Там должен быть определенный шаг по своему алгоритму. Если я правильно понял вы пытаетесь использовать тип штрих-кода CODE-128, я вот не помню точно, но мне кажется он 6-и значный (могу и ошибаться), может он просто не может представить ваши числа в штрих-кодированном представлении... Это предположение, попробуйте может просто с вашим алгоритмом распечатать 6-и значные этикетки пару штук и посмотрите будет ли итерироваться значение. Если да - значит с кодом все нормально и проблема с представлением штрих-кода, может не тот тип используете

Автор: Yevhenii 14.04.17, 10:13

Bernet @ Сегодня, 10:41 * ,

Штрих код правильный, тут все проверено. Т.е. печатает 13-значный код от ХХХХХХХХХХ001 до ХХХХХХХХХХ999 и сканируеться он без проблем из заданым значением.

Как я думаю, тут есть 2 зацепки, это собственное "родная" процедура печати в 1С и приоритет выполнения процедур, т.е. сама печать происходит после выполнения процедуры из которой она вызывается. т.е. программа не может передать управление в точку печати, а потом вернуть ее в обратно в цикл, таким образом команды печати накапливаются с параметрами и ссылками на макет для печати, но выполняются только когда идет выход с процедуры нажатия кнопки..... но это только домыслы...

Автор: Bernet 14.04.17, 10:16

Yevhenii @ Сегодня, 11:13 * ,
Выложите внешнюю обработку, может отладчиком потыкаю, авось что-то в голову прийдет

Автор: Yevhenii 14.04.17, 10:21

Нашел! Нашел где собака зарыта.
Присвоил счётчику при старте значение 1.
Залипил в новую кнопку

НарисоватьМакет2();
    ПечатьЭтикетки();
    Счётчик = Счётчик +1;


И вот что происходит, макет перерисовывается и печатается если на кнопку нажимать не очень быстро, если же быстро нажать пару раз "даблкликом" на мыше, то он напечатает 4 этикетки но с последним значением счётчика.

т.е. процедура печати работает медленее чем процедура перерисовки и сам цикл соответственно

теперь вопрос: как в 1С установить задержку? ну или таймер что б делать печать на каждый "тик" ???

Автор: Bernet 14.04.17, 10:26

Yevhenii @ Сегодня, 11:21 * ,
а зачем так сложно? не проще ли сформировать ваши этикетки, запихнуть их последовательно в один ТабДок и вызвать функцию "Напечатать" табличного документа? и пусть себе одной процедурой печати печатается

Автор: Yevhenii 14.04.17, 12:06

Bernet @ Сегодня, 11:26 * ,
не проще, так как принтер этикеток такая зараза, что я долго-долго подгонял под него макет и настраивал на нем печать нескольких копий.
а перекраивать макет это означает ещё долго добиваться правильной и ровной печати.

а так, поставил таймер на данный кусок кода и всё работает))) просто в С# кодил немного, то там с таймерами много интересностей можно сделать, и работа с ними довольно не сложная)

Автор: Bernet 14.04.17, 12:52

Yevhenii @ Сегодня, 13:06 * ,
Ну и я с принтерами этикеток игрался, печатал также свои макеты с штрих-кодами и нормально все было, подогнал размер, в свойствах самого принтера выбрал размер этикетки и вывожу каждую этикетку с нового листа, печаталось нормально сотнями. Ну это дело вкуса. А насчет таймера в 1С есть только Обработчик ожидания, где можно указать через сколько секунд выполнить какую-то процедуру, он вам поможет. Больше там ничего такого нет.

Автор: Yevhenii 14.04.17, 13:15

Bernet @ Сегодня, 13:52 * ,


Отлично, попробую попилить обработчик ожидания, а если не выйдет то тогда уж и с макетами повожусь)

спасибо!

Автор: logist 14.04.17, 13:50

Цитата(Yevhenii @ 14.04.17, 13:06) *
а перекраивать макет это означает ещё долго добиваться правильной и ровной печати.

Зачем перекраивать макет? Все формированные табдоки добавляются в один, с разделителями страниц.
И почему нельзя использовать стандартное "Напечатать" ? Тогда не надо изобретать костыли с обработчиками ожидания и т.п.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua