1С Предприятие 8.2 обычное приложение, обычная форма
Конфигурация "Управление торговым предприятием для Украины", редакция 1.2.
День добрый!
! | http://pro1c.org.ua/index.php?act=announce&id=2: 3,4 |
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" - %.
КонецПроцедуры
Yevhenii @ Сегодня, 10:14
,
Ну на вскидку первое что приходит на ум:
когда я игрался со штрих-кодами, то была такая фигня с EAN-13: мне надо было также по порядку печатать какое-то количество этикеток, но там был прикол в том, что просто добавлением 1 в конце не обойдешься, т.к. BarCode в зависимости от типа штрих-кода должен по символьному представлению числа выдать нам сам штрих-код (расположение черных штрихов), так вот не каждое число он мог так нарисовать. Там должен быть определенный шаг по своему алгоритму. Если я правильно понял вы пытаетесь использовать тип штрих-кода CODE-128, я вот не помню точно, но мне кажется он 6-и значный (могу и ошибаться), может он просто не может представить ваши числа в штрих-кодированном представлении... Это предположение, попробуйте может просто с вашим алгоритмом распечатать 6-и значные этикетки пару штук и посмотрите будет ли итерироваться значение. Если да - значит с кодом все нормально и проблема с представлением штрих-кода, может не тот тип используете
Bernet @ Сегодня, 10:41
,
Штрих код правильный, тут все проверено. Т.е. печатает 13-значный код от ХХХХХХХХХХ001 до ХХХХХХХХХХ999 и сканируеться он без проблем из заданым значением.
Как я думаю, тут есть 2 зацепки, это собственное "родная" процедура печати в 1С и приоритет выполнения процедур, т.е. сама печать происходит после выполнения процедуры из которой она вызывается. т.е. программа не может передать управление в точку печати, а потом вернуть ее в обратно в цикл, таким образом команды печати накапливаются с параметрами и ссылками на макет для печати, но выполняются только когда идет выход с процедуры нажатия кнопки..... но это только домыслы...
Yevhenii @ Сегодня, 11:13
,
Выложите внешнюю обработку, может отладчиком потыкаю, авось что-то в голову прийдет
Нашел! Нашел где собака зарыта.
Присвоил счётчику при старте значение 1.
Залипил в новую кнопку
НарисоватьМакет2();
ПечатьЭтикетки();
Счётчик = Счётчик +1;
Yevhenii @ Сегодня, 11:21
,
а зачем так сложно? не проще ли сформировать ваши этикетки, запихнуть их последовательно в один ТабДок и вызвать функцию "Напечатать" табличного документа? и пусть себе одной процедурой печати печатается
Bernet @ Сегодня, 11:26
,
не проще, так как принтер этикеток такая зараза, что я долго-долго подгонял под него макет и настраивал на нем печать нескольких копий.
а перекраивать макет это означает ещё долго добиваться правильной и ровной печати.
а так, поставил таймер на данный кусок кода и всё работает))) просто в С# кодил немного, то там с таймерами много интересностей можно сделать, и работа с ними довольно не сложная)
Yevhenii @ Сегодня, 13:06
,
Ну и я с принтерами этикеток игрался, печатал также свои макеты с штрих-кодами и нормально все было, подогнал размер, в свойствах самого принтера выбрал размер этикетки и вывожу каждую этикетку с нового листа, печаталось нормально сотнями. Ну это дело вкуса. А насчет таймера в 1С есть только Обработчик ожидания, где можно указать через сколько секунд выполнить какую-то процедуру, он вам поможет. Больше там ничего такого нет.
Bernet @ Сегодня, 13:52
,
Отлично, попробую попилить обработчик ожидания, а если не выйдет то тогда уж и с макетами повожусь)
спасибо!
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua