v7: Как эмулировать нажатие клавиши в режиме ожидания #653151


#0 by chuff
Всем добрый день. Проблема такая: при печати таблички через Таб.Напечатать выскакивает окно выбора принтера. Каким образом можно эмулировать нажатие Enter в данном случае? Печать через Таб.Напечатать не канает - либо уходит неизвестно куда, либо печатает с кривыми настройками принтера. SendKeys в данном случае не помогает, потому что программа не идет дальше, а если ставить SendKeys перед Таб.Напечатать, как советовали некоторые, эффекта нет никакого.
#1 by 1Сергей
окно выбора принтера показывать не надо, сразу печатать тоже нельзя - уходит непонятно куда...
#2 by Толич
Принтер обычный?
#3 by АЛьФ
2 Надо правильно задать параметры печати.
#4 by Попытка1С
В параметрах печати у тебя не верные настройки, задай другое имя параметров и юзай слеш для посылки печати на принтер по умолчанию.
#5 by chuff
Перед печатью устанавливается режим печати одно/двусторонний, лоток для бумаги. если показывать окно выбора - печатает как положено после нажатия Enter, как и запрограммировано. Принтер HP 2055D
#6 by chuff
Имя параметров для данного документа свое. Устанавливается через Опции. В реестре проверял - все опции прописываются перед печатью, если их нет, включая принтер, лоток и масштаб
#7 by ЧеловекДуши
Не спорь, гуру тебе прямо сказали, что настраивать нужно принтер по умолчанию... А если принтер по умолчанию не выбран, то уже другой вопрос... Нам от сюдова не видать :)
#8 by ЧеловекДуши
+ Имя принтера не должно содержать Кириллицу, пробелы и быть (желательно) не больше 8-ми символов :)
#9 by ЧеловекДуши
+Опции - это не настройка принтера... Как вариант рекомендую удалить ветку в реестре 1С - локального пользователя
#10 by Попытка1С
На почитай
#11 by Толич
Один раз сталкивался с тем, что приходилось перед печатью ветку реестра с настройками принтера менять.
#12 by chuff
я почему и говорю, что именно Enter нажимать - в окне выбора принтера стоИт именно тот, который выбран программно. Но из 1С невозможно указать все параметры для него - 2-стороннюю печать, в частности.
#13 by Shaman100M
сделать несколько "принтеров", с разными настройками (одно- двух-, лоток1, лоток2 и т.д.), далее указывать просто "имя" принтера в опциях, в 1с.
#14 by ЧеловекДуши
Это тоже решается ;) На самом деле параметры можно передать, где то на мисте это описывалось, знатное извращение :) 1С не умеет печатать с двух сторон!!! Дуплекс должен быть включен по умолчанию или выключен.. Обычно создают два принтера, один печатает дуплексом, другой обычно.
#15 by Ёпрст
или скармливать dat файлик с настройками принтёру перед печатью.
#16 by Ёпрст
Не п..и 1с прекрасно печатает дуплекс.
#17 by ЧеловекДуши
Печатает, только в параметрах нельзя указать, что есть дуплекс, а что печатать как обычно :)
#18 by Cap_1977
Если не конкретизировать с помощью .ПараметрыСтраницы то уходит печать с параметрами взятыми с последнего формирования печатной формы  ели в .Опции задан 5й параметр
#19 by ЧеловекДуши
Вот еще
#20 by ЧеловекДуши
+ Если поискать, вот...
#21 by Злопчинский
не получается. напечатать ведет себя немножко по-другому... в однйо из веток я расписывал что получается...
#22 by chuff
Объясню немного подробнее. Дуплекс - работает. Правда пусть кривым способом - путем записи напрямую в реестр установок принтера для пользователя. Причем из обработки я могу выбрать, печатать с нижнего лотка или верхнего, на одной стороне или обеих. НО: только через Напечатать. При этом в строке выбора принтера показан именно тот принтер, который я выбрал. Опции для печати данного документа свои, они создаются ДО печати напрямую в реестре. Проверял. Т.е. очередность такая: 1. УстановкаПараметровПринтера - неважно как, но они устанавливаются в реестре для необходимого принтера 2. СозданиеВеткиСОпциямиПечати(ОпцииПечати) - ветка в реестре тоже создается. Проверено. 3. Таб.Опции(,,,,ОпцииПечати) - применение опций 4. Таб.ПараметрыСтраницы(2,,,,,0,0,,,1,,ИмяПринтера) 5. Напечатать Жмешь Enter - всё чудесно. если же сделать 5. Напечатать - не печатает вообще никуда В чем прикол? Имена принтеров выбираю из реестра, не пишу вручную.
#23 by ЧеловекДуши
Напечатать(<?>); Синтаксис: Напечатать(<Флаг>) Назначение: Напечатать таблицу без предварительного просмотра (печать без открытия окна редактирования). Параметры: <Флаг> - необязательный параметр. Режим запроса диалога печати: 1 - запрашивать диалог печати (по умолчанию), 0 - не запрашивать. Замечание: Метод может использоваться при работе с таблицей в режиме ввода данных.
#24 by ЧеловекДуши
Настройки принтера ты криво передаешь :) Ты хоть по ссылкам пройдись, так то там не через реестр все делают, а подмену самих настроек.
#25 by ЧеловекДуши
+ >>> 1. УстановкаПараметровПринтера - неважно как, но они устанавливаются в реестре для необходимого принтера Очень важно... >>> СозданиеВеткиСОпциямиПечати(ОпцииПечати) - ветка в реестре тоже создается. Проверено. Ни разу не видывал сею конструкцию на мисте, ты первый... Но думается сея береберда и по этому не работает... Отдаленно напоминает про настройки печати и по сути настройками, к примеру того же Дуплекса, не является... т.е. не помнит он тонкие настройки про дуплекс :) >>> Таб.ПараметрыСтраницы(2,,,,,0,0,,,1,,ИмяПринтера) С именем принтера, народ тебе подсказывал, что нужно в системе ТУПО создать 2-ва принтера с разными настройками и уже при печати подсовывать имена принтеров... вот для чего имя принтера... По умолчанию всегда используется принтер по дефолту (есть заморочки в терминальном режиме через RDP)
#26 by Ёпрст
#27 by ЧеловекДуши
Спасибо :)
#28 by chuff
>>> 1. УстановкаПараметровПринтера - неважно как, но они устанавливаются в реестре для необходимого принтера >>>Очень важно... Могу сказать. Ты знаешь, где устанавливаются параметры конкретного принтера для конкретного пользователя на сервере? Можешь их установить, не заходя в свойства принтера? Я именно это и делаю, потому что их мне надо менять оперативно во время печати. По сути, применением предварительно записанных установок. В том числе и установка дуплекса там же находится. И к 1С это не имеет никакого отношения, потому что она этого не умеет делать. >>> СозданиеВеткиСОпциямиПечати(ОпцииПечати) - ветка в реестре тоже создается. Проверено. >>>Ни разу не видывал сею конструкцию на мисте, ты первый... >>>Но думается сея береберда и по этому не работает... Ты хоть раз интересовался, где лежат опции печати в 1С? Судя по всему - нет. А указать из 1С источник бумаги или тип бумаги в ПараметрахСтраницы или в Опциях пробовал? Нет? Но в ветке опций есть параметры Paper и PaperSource - как ты их сможешь установить? Выход один - напрямую записывать эти ключи в реестр в ветку пользователя конкретной базы. Как - если интересно, могу написать. Не надо говорить про то, чего не знаешь, что это "береберда", лучше сначала проштудировать вопрос. У меня код примерно такой же, завтра сравню точнее - уже с работы уехал. Мож где-то и накосячил, конечно. Одну разницу могу сказать - в ветке опций у меня DefaultPrinter прописывается (напрямую) заранее перед печатью. Ну и ещё пара параметров - PaperSource и FitToPage, так как источник перед каждой печатью может быть разным.
#29 by Torquader
На самом деле, проблема даже не в 1С, а в системе печати - если открывается диалог принтера, то он заполняется настройками, которые откуда-то из реестра берутся. Если диалог не открывается, то часть настроек просто не забирается - и так ведут себя не только 1С, но и многие другие программы. Что же касается нажатия на клавишу, то тут нет ничего сверхестественного - нужно просто запустить процесс (КомандаСистемы или ЗапуститьПриложение), который дождётся появления окна принтера и пошлёт WM_LBUTTONDOWN и WM_LBUTTONUP нужной кнопке. Когда открыт диалог 1С, то исполнение кода в 1С невозможно, если послать клавишу до, то система ожидания Ctrl+Break просто сбросит нажатие клавиши из буфера, так как в данный момент код ещё исполняется. Поэтому - нажимать нужно из отдельного процесса или хотя бы отдельного потока, если с процессом сложнее. P.S. некоторые OLE-объекты допускают выполнение сценария VbScript внутри себя, но работают в отдельном потоке.
#30 by chuff
Вот про это я и спрашивал - как нажать клавишу в режиме ожидания. Именно этот вопрос и задан в теме. Потому что все остальные варианты уже попробовал. Я вижу, что на момент начала печати все настройки (и принтера, и Опции 1С) установлены в те, что надо, но эффекта нет. Записи в реестре устанавливал те, которые меняются после вызова диалога Параметры страницы (через снимки). Возможно, какая-то запись и не попала в снимок, но это только предположение. Значит, остается только нажать клавишу. Принцип, что сделать надо, я понимаю, но такого не делал никогда. Может, дашь пример, или чуть подробнее объяснишь? не реагирует никак, окно остается на экране, как и
#31 by ЧеловекДуши
Дятел... Рад за вас, и огорчен за работодателя :)
#32 by ЧеловекДуши
+ Читать в до просветления :) Долго думать...
#33 by chuff
Ты, тормоз, ты хоть раз САМ пробовал нечто подобное делать? Ты вообще хоть понимаешь, о чем речь идет? Судя по всему, нет. У тебя своей дельной мысли не было ни одной. Ты день назад вообще не знал, что из 1С можно дуплекс использовать. Но от важности своей чуть не лопнул, пока знающие тебя не осадили.
#34 by ЧеловекДуши
"Дятел, птица гордая"... Тебе не даль только одного ответа... Когда висит модальное окно, вся твоя херь в перестает работать!!! :) Ты хоть отладчик запусти для наглядности... ... Но есть способ, который ты хочешь... это делается с помощью ВК FormeX... там есть метод "ОбработкаОжидания" Так вот он обрабатывается вне зависимости от того, открыто модальное окно или нет... ... "Ёжик плакал, но продолжал грызть кактус" (с) :)
#35 by ЧеловекДуши
+>>> Ты день назад вообще не знал, что из 1С можно дуплекс использовать.
#36 by chuff
"ОбработкаОжидания" не работает в данном случае, уже проверял. Видимо потому, что форма обработки не открыта, из которой печать идет. Поясню. В одной обработке подготавливаются документы для печати и вызывают внешнюю форму, в которой собственно находится сам макет и процедура печати. Форма не отображается, т.к. в ней в ПриОткрытии стоит СтатусВозврата. Ставил в неё ОбработкуОжидания - не срабатывает(
#37 by chuff
>>>Когда висит модальное окно, вся твоя херь в перестает работать!!! :) Это придумал как раз не я. Это такие советы давали. Я пробовал даже самые невероятные. А сетевой принтер 2 раза подключить не удастся, просто не создается копия.
#38 by ЧеловекДуши
Ты притворяешься (Д) или издеваешься? "ОбработкаОжидания" - все работает, даже в модальном исполнении :) ОбработкаОжидания(<?>,) Синтаксис: ОбработкаОжидания(<Имя>,<Интервал>) Назначение: Вызывает глобальную процедуру с заданным интервалом в милисекундах. ПРИМЕР: Сервис = СоздатьОбъект("Сервис"); Сервис.ОбработкаОжидания("глПолучитьНовыеЗаявки
#39 by ЧеловекДуши
+ Ты уперся, как баран на ворота, тебе нужно что бы работал код из , я тебе в описал про ВК (внешняя компонента) Формакс, она может поспособствовать...
#40 by ЧеловекДуши
+А уж как это использовать, додумай сам... Не можешь, так читай в , до просветления... И второй принтер можно назначать, просто ты и это не можешь :)
#41 by Ёпрст
Да, можно и в реестр писать всё, на нимфостарте даже готовое решение валяется, но неудобно это всё. Проще dat-файлик скармливать с настройками, его фоормировать тоже из 1с-ины, показывая юзеру окно настроек принтёра.
#42 by Ёпрст
Ибо тебе для каждой формы придётся искать ветку с мокселем и с оциями всегда.
#43 by chuff
Да, так оно и получается. Но тормозов незаметно. Вот примерно так: .............
#44 by chuff
А настройки принтера у меня сохранены в reg-файле, для разных параметров свой. И для установки их файлик импортируется (там бинарные данные и просто вписать их в ветку реестра не получается). Может через dat было бы проще, но так не пробовал никогда. Но с этим то проблем нет, параметры принтера устанавливаются верно. Изначально же вопрос не об этом был. Настройки принтера нормально встают, ненормально вызывается принтер.
#45 by Ёпрст
ща кину ..
#46 by Ёпрст
На вот.. Тут только возврат фокуса не оптимален, если есть вк - решаемо (красившее).
#47 by chuff
Спасибо. Ты не поверишь - по кнопке Печатаем - либо окошко "Невозможно завершить операцию", либо тишина... Чаще просто тишина. Если вызвать диалог печати - тогда печатает Видимо, нерешаемо это((
#48 by ЧеловекДуши
Спасибо!!! Я уже потерял подобное в своем архиве :) ... У тебя столько терпения, автор даже эту поделку использовал по принципу :)
#49 by Ёпрст
Это, задай уникальные опции печати и имена принтёрам жедательно англицские
#50 by Ёпрст
На счет печати, так еще пробуй:
#51 by Ёпрст
Ну, или так еще:
#52 by chuff
Имена задал уникальные, английские - не изменилось Попробовал - тот же эффект слеша до этого не было. Поставил - печатает. Но только на один принтер. Выяснил следующее: со слешем печатает на один и тот же принтер, независимо от того, какой указан в ПараметрахСтраницы. БЕЗ слеша - печатает на все остальные, кроме этого. Появилась следующая мысль - не ограничена ли длина имени сетевого принтера? Не псевдоним,сетевое имя, а именно то, как он обзывается локально на компе? Сетевые у всех короткие, а локальное у этого кривого - самое длинное.
#53 by Ёпрст
:) если че,"" это указание на то, что будет всегда печататься на принтёр по-умолчанию который задан.
#54 by Ёпрст
длина да, ограничена.
#55 by Ёпрст
сколько символов не помню, но ограничена.
#56 by chuff
Возможно тут собака то и порылась! Надо будет укоротить как можно больше все имена. Жаль сейчас не получится - активно используются. Но завтра с утра буду резать. Спасибо за ценную наводку!
#57 by chuff
Нашел сейчас ещё один принтер (матричный правда)), на который не отправляется печать. Полная длина имени этих принтеров(с путями) - 32 и 38 символов. Все остальные короче. Рекомендуется - до 31!!! Надеюсь, что проблема была только в этом. Спасибо!
#58 by Ёпрст
в этом-в этом, даже не сумневайся.
#59 by Ёпрст
зато будешь знать теперь, как вызвать диалог печати.. :)
#60 by chuff
Буду))) - инфа очень ценная. та же проблема решалась вот тут: Причем ты участвовал)))
#61 by Ёпрст
ага, я везде поучаствовал..
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С