Hare.ru @ Коллективный разум / Hare.ru @ Дикое место

Архив hare.ru 
Мысли, конвертированные в текст

Собственные руки TM


Все статьи раздела

Быстрая печать на матричных принтерах

Михаил Алексеев (апрель 2002)

Предыстория

На Hare.ru взял компоненту ExtPrint и обработку DOSPrint. Но писать отдельные процедуры для печати из DOS и Windows не хочется, тем более что конструкции типа приведенных ниже уж очень громоздки.

ТекстДОС.ДобавитьСтроку(AnsiToOem("
|     ПРИХОДНАЯ НАКЛАДНАЯ ¦ "+СокрЛП(НомерДок)+"
|   от "+Формат(ДатаДок, "ДДДММММГГГГ")+"
|"));
ТекстДОС.ДобавитьСтроку(AnsiToOem("Всего в гривнях: "+СуммаГрнПрописью+"
|   Всего НДС: "+СокрЛП(Формат(Итог("НДС")+ДопНДС,"Ч12.2"))+" грн.
|
|     Отгрузил:_______________   Получил__________";

Но самое главное, если в таблице MXL для текста можно установить опцию "Контроль" в "Переносить" или "Авто", то при формировании отчета DOS из языка это сделать затруднительно. Я имею в в виду такие отчеты, где высота строки варьируется в зависимости от длины текста, помещенного в ячейку.

Если кто знаком с FoxPro, то там это пара флагов "Stretch Vertically" и "Float As Band Stretches", впрочем подобные возможности есть почти в любом современном генераторе отчетов, в том числе и в 1С (та самая опция "Контроль").

Идея

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

Эту задачу и выполняет внешняя обработка MXL2TXT. Затем с помощью вызовов ExtPrint.dll, DosPrint.ert, или своих собственных утилит можно отправить результат на принтер.

Возможности

Поддерживает

  1. Контроль = Авто,Обрезать,Переносить (переносы делат по словам, если это возможно)
  2. Горизонтальное выравнивание (Левый край, Правый край, Центр)
  3. Эмуляцию рамок (правда без угловых символов, так что получаются не рамки, а линии [может заинтересованные лица допишут?])
  4. Контроль длины страницы
  5. Нумерацию страниц
  6. Вывод на каждой странице "шапки"
  7. Вывод сформированного файла для просмотра (в этом случае нужно установить для тектовых документов шрифт Courier, или другой моноширинный)
  8. Вывод в файл TXT в кодировке DOS и Windows
  9. Вызов как непосредственно, так и из языка
Не поддерживает
  1. Сложно-сочиненные таблицы типа накладной по форме ТОРГ-12 из Торговли 8.7
  2. Таблицы с объединенными ячейками (значения таких ячеек повторяются во всех них)
  3. Таблицы с текстовыми объектами (может даже зависнуть [прерывается по ESC]) и объектами OLE
  4. Вертикальное выравнивание (всегда по верхнему краю)
  5. Горизонтальное выравнивание по ширине
  6. Характеристики шрифта

Недостатки

Низкая скорость работы (таблица в 1000 строк конвертируется порядка 7 секунд на Celeron400). Я думаю, что это плата за обращение к методам и атрибутам Области таблицы + функция разбивки текста на куски с переносом по словам.

Использование

Непосредственно – открыть, заполнить параметры, нажать "Сформировать".

Важно! Обработка рассчитана на вызов из языка, поэтому корректность введенных значений не проверяется!

Из языка

При вызове из языка параметры передаются так:

Параметры=СоздатьОбъект("СписокЗначений");
// параметры передаются как список значений

Параметры.ДобавитьЗначение(Таб,"MXL");
// Таб-ссылка на объект типа таблица или строка,
// содержащая имя файла в формате MXL (default None)

Параметры.ДобавитьЗначение("c:\myfile.txt","TXT");
// имя файла куда записывать результат (default None)

Параметры.ДобавитьЗначение(0,"CODE_PAGE");
// кодировка выходного файла(0-Win,1-DOS) (default 1)

Параметры.ДобавитьЗначение("Список пациентов","TITLE");
// заголовок окна при просмотре

Параметры.ДобавитьЗначение(66,"LINES");
// число строк на странице (default 64, -1 – не делить на страницы)

Параметры.ДобавитьЗначение(2,"NUM_START");
// номер страницы, начиная с которой вверху
// указывается номер страницы (default 2)

Параметры.ДобавитьЗначение(2,"REPEAT_START");
// номер строки таблицы в которой начинается шапка (default 0)

Параметры.ДобавитьЗначение(2,"REPEAT_END");

// номер строки таблицы в которой заканчивается шапка (default REPEAT_END)

Параметры.ДобавитьЗначение(1,"BOX");
// способ эмуляции рамок (0 – без рамок, 1 – псевдографика(DOS),
// 2 – текст(Win)) (default 0)

Параметры.ДобавитьЗначение(1,"PREVIEW");
// показ конвертированного файла (default 1)

// !!! обязательными являются параметры MXL и TXT

// После это вызов конвертера:
// (после отработки алгоритма конвертации форма сама закроется,
// если она была вызвана из языка)
ОткрытьФорму("Обработка.MXL2TXT",Параметры,[ВашПуть]+"MXL2TXT.ert");
// или
ОткрытьФормуМодально("Обработка.MXL2TXT",Параметры,[ВашПуть]+"MXL2TXT.ert");

// Далее можно вызвать DosPrint.ert
Параметры=СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение("c:\myfile.txt");
ОткрытьФорму("Обработка.DosPrint",Параметры,[ВашПуть]+"DosPrint.ert");

// или ExtPrint.dll (в этом случае сохраняйте файл в кодировке Windows!!!)
t=CreateObject("ExtPrint.ExternPrint");
t.Init();
t.LoadFromFile("c:\myfile.txt");
t.Show();
t.Done();

Ограничения текущей версии

Текущая версия не претендует на универсальность (поэтому она и Light). Т.е. не всякую таблицу она может корректно преобразовать. Так, включенные в состав дистрибутива таблицы РасходнаяНакладная и СчетФактура были незначитально преобразованы в части форматировния (параметр Контроль) по сравнению с их исходными версиями от ТиС 8.7.

Однако, если печать из DOS для Вас действительно важна, то подогнать стандартную MXL к виду, корректно воспринимаемому конвертором значительно легче, по-моему, чем писать отдельный код для вывода того же самого в DOS.

Я подгоняю так:

  1. загружаю MXL2TXT
  2. Если в конфе таблицы защищены, то снимаю защиту (Константа.ФлагЗащитыТаблиц для Торговли 8.х)
  3. вывожу СчетФактуру (читай любой отчет)
  4. Выключаю Таблица-ТолькоПросмотр
  5. сохраняю таблицу в файл
  6. переключаюсь на конвертер
  7. конвертирую этот файл с возможностью просмотра
  8. смотрю результат
  9. Если результат не оправдал ожиданий, то перехожу к шагу 5, предварительно изменив параметры форматирования "плохой" части отчета
  10. Если результат=OK, то можно установить в конфе такое же форматирование для "плохой" части
Кроме того, разумно сделать развилку типа (Печать DOS/ПечатьWindows), тогда скопируйте исходную таблицу в новую, отформатируйте и добавьте в процедуру печати оператора типа:

Если ПечатьDOS=1 Тогда
   Таб.ИсходнаяТаблица("СчетФактураDOS");
Иначе
   Таб.ИсходнаяТаблица("СчетФактура");
КонецЕсли;

//... Заполнение таблицы (ничем не отличается в DOS и Windows!)

Если ПечатьDOS=1 Тогда
   // ... см. операторы вызова MXL2TXT выше
Иначе
   Таб.Показать();
КонецЕсли;

С Накладной и СчетФактурой возился не более 3-х минут на каждую!

Требования к компонентам: возможно использовать с любыми установленными у вас компонентами V7.

Требования к версии: 7.70.xxx

Тестировал на релизах 7.70.015, 7.70.018

Партнеры:


Также может быть интересно:

Канал Россия 1 на http://spbtvonline.ru/
   
 Сайт поддерживается за счет партнеров:
:::... Сайт содержит архив двух версий hare.ru Карта сайта