ПЕЧАТЬ ИЕРОГЛИФОВ из 1С

Если Вам нужно печатать из 1С иероглифы, а Вы не знаете как — предлагаю один из вариантов решения. А если Вы знаете — предложите свой, буду премного благодарен.

Недавно на форуме был задан вопрос:

1С->Excel (Преобразовать из кодов в символы Unicode)

Я попытаюсь на него ответить (предложить свой вариант решения задачи)

Задача: Как преобразовать

из кодов (2 столбец 1 строчка)

в символы (2 столбец 2 строчка)

(см. рисунок)

Давайте попробуем пошагово решить задачку с помощью замечательной функции MS EXCEL (VBA) —  ChrW()

Создадим новую книгу   MS EXCEL

 

Перейдем в редактор VBA (Alt+F11) или меню Сервис->Макрос->Редактор VBA

Откроется редактор

Так выглядит «пустая»  книга. Нам нужно в меню Insert (Вставка)->Module

«Нам нужен холст, чтобы написать картину»(с)

Вот здесь мы и напишем нашу первую функцию

В принципе, код очень простой — получаем строковой параметр, удаляем из него все ненужные символы и преобразуем в символ. Как этим пользоваться ?

Переходим обратно на лист. Выбираем в меню ВставкаФункция 

 

и видим что в категориях добавился пункт «Определенные пользователем» , где мы можем выбрать функцию «ПереводВКитайский(Ind)» .

Сделаем это и укажем ячейку с нашими символами (или можно их прямо тут и ввести и сразу увидим результат.

 

 

Итог: мы только что с вами внедрили в книгу нашу функцию. В этой книге будет все работать на ура.

Минус — а что делать в других книгах?

При открытии будет вылезать окно «Отключить макросы или нет ?»»

Пойдем дальше….

Для этого сохраним нашу книгу, на как книгу (*.xls) а как надстройку (*.xla)

Меню Файл -> Сохранить как… 

Сохранили, закрываем все открытые книги. Снова заходим в MS EXCEL (создадим новую книгу)

В меню  Сервис->Надстройки-> Обзор выберем нашу  надстройку TranslChina.xla

Должно появится окошко:

Ставим галочку, закрываем. Теперь нашу функция  «ПереводВКитайский(Ind)» будет доступна в любых документах …. но только на этом компьютере.


Но мы же с вами тут за 1С говорим …

Дальше вам понадобится прочитать статью:

«Троянский конь» или «скрытые» возможности таблиц 1С

Не буду про нее повторятся, но !!!

При выводе на экран в 1С

 

мы увидим кракозяблы…  они нам НЕ НУЖНЫ, а вот если кликнуть на внедренный объект, то получим то, что хотели.

 

 

 

В прикрепленной обработке я немного дописал алгоритм, но это шаблон рыба (только направление)

Смысл : во внедренном объекте формируем «наш перевод» сохраняем на диске как файл и уже потом открываем (или печатаем) нужный нам файл.

Во вложении:

— внешняя обработка с внедренным объектом MS EXCEL

—  книга1.xls с нашей функцией

— готовая надстройка TranslChina.xla 

28 Comments

  1. Tatitutu

    ну шо китай, япония — бойтесь…1С идет к вам ))))

    Reply
  2. Трактор

    Сурово! Боюсь что таким способом делать печатные формы весьма затруднительно 😐

    Китай может остаться не завоёванным.

    Кстати, товарищ недавно размышлял на тему написания международной конфигурации для разных вьетнамов и африк. Говорит рынок пустоват и САП с Ораклом не счастье в жизни, а нечто менее удобное чем 1С.

    Reply
  3. venger

    (1) Н-да, и так для каждого пользователя на каждом компе?

    А так? Ну понятно, что вместо макроса «MyTest» создаем то, что нам нужно, и выводим реальные данные и т.п. А галку в реестре, после можно и снимать, тоже программно, если уж так не нравится разрешенный доступ к VBA из других приложений для пользователя…. Зато никакого гемарроя с внешними файлами, настройками для каждого пользователя, версиями офисов и т.п. Никаких вопросов пользователю не задается, ничего настраивать не надо…

    Перем Excel, РабочаяКнига, РабочийЛист;
    
    Попытка
    // Устанавливаем для пользователя галку программного доступа к VBA
    // Подветки 11.0, 10.0 — зависят от версии Office…
    WScriptShell = СоздатьОбъект(«WScript.Shell»);
    ВерсияОфиса = СокрЛП(WScriptShell.RegRead(«HKEY_LOCAL_MACHINESOFTWAREClassesExcel.ApplicationCurVer»));
    ВерсияОфиса=Прав(ВерсияОфиса,СтрДлина(ВерсияОфиса)-Найти(ВерсияОфиса,».»));
    ВерсияОфиса=Прав(ВерсияОфиса,СтрДлина(ВерсияОфиса)-Найти(ВерсияОфиса,».»));
    ВерсияОфиса=ВерсияОфиса+».0″;
    WScriptShell.RegWrite(«HKEY_CURRENT_USERSoftwareMicrosoftOffice»+ВерсияОфиса+»­ExcelSecurityAccessVBOM»,1, «REG_DWORD»);
    WScriptShell = 0;
    Исключение
    КонецПопытки;
    
    // Создаем все…
    Excel = СоздатьОбъект(«Excel.Application»);
    Excel.Visible = 1;
    РабочаяКнига = Excel.Workbooks.Add();
    РабочаяКнига.Activate();
    РабочийЛист =РабочаяКнига.WorkSheets(1);
    РабочийЛист.Select();
    
    // Текст процедуры с передаваемым параметром
    ТекстПроцедуры = «Sub MyTest(V)» + РазделительСтрок +  » MsgBox(V)» + РазделительСтрок + «End sub»;
    
    Попытка
    // Вставляем процедуру в рабочую книгу
    РабочаяКнига.VBProject.VBComponents.Item(«»+РабочаяКнига.CodeName).CodeModule.AddFromString(ТекстПроцедуры);
    Исключение
    Сообщить(«Экспорт в Excel не удался.»,»i»);
    Сообщить(«»+ОписаниеОшибки()+». Обратитесь к администратору.»,»i»);
    Возврат;
    КонецПопытки;
    
    // Вызываем процедуру с передаваемым ей параметром, если их несколько, то через запятую указываем остальные параметры
    Excel.Application.Run(«»+РабочаяКнига.CodeName+».MyTest»,»Hi,Venger!»);
    
    РабочийЛист.Cells(1,1).Value = «‘Что-то выводим…»;
    
    // Ну и типа финиш
    Сообщить(«Экспорт в Excel успешно завершен.»);
    

    Показать

    Reply
  4. tango

    на Китае настоящий БГ обломился, а уж 1С…

    ну не было в Китае Луки Пачолли. не нужен он им

    Reply
  5. Tatitutu
    Сурово! Боюсь что таким способом делать печатные формы весьма затруднительно

    да ладно…в статье описаны три разных способа.

    а третий вообще готовая «рыба» засунь в нее список значений , отредактируй макет и все

    Reply
  6. Styvi
    «Кофигурации: 1С: Предприятие 7.7, 1С:Бюджет муниципального образования 7.7, 1С:Бухгалтерия 7.7, 1С:Зарплата и кадры 7.7, 1С:Комплексная 7.7, 1С:Торговля и склад 7.7, 1С:Производство+Услуги+Бухгалтерия

    Внешний отчет, обработка для 1С: Бухгалтерский учет 7.7; 1С: Оперативный учет 7.7; 1С: Расчет 7.7; 1C: OpenConf 7.7″

    Ну, Юрий, — за широту мысли… ПЛЮС … 😉

    … и за полезное чтиво — разумеется…

    Reply
  7. Styvi

    (3)

    Александр, Ваши труды тоже были замечены на форуме…

    (аналогичные благодарности)…

    Только плюсануть нечгде было…

    😉

    Reply
  8. Tatitutu

    (3) Сань не трогай реестр — горе это….будет , такая дыра — если ты оставишь офис хоть на минуту не прикрытым от других макросов и дашь доверенный доступ к VBA — это просто мечта вирусолога.

    я тебе давал ссылку как обойти запрос на макросы.

    что мешает:

    при запуске обработки

    создаем (пересохраняем) персонал.xls с нужными формулами

    создаем лист EXCEL новый ,форматируем переводим, сохраняем

    удаляем персонал.

    Работы написать на полчаса. и ничего спрашивать не будет и пользователь и знать не будет.

    Reply
  9. venger

    (7) Чувствую придется писать статью о поддержке Unicode и иероглифов на форме 1С (вставке, редактировании, хранении и отображении в 1С), как тут;-) Это с помощью АктивИкса Internet Explorer на форме, с некоторыми хитростями, конечно;-) Как же без этого;-)

    Reply
  10. venger

    (8) > создаем (пересохраняем) персонал.xls с нужными формулами

    Создать personal.xls и положить куда надо не проблема, но как в personal.xls записать программно макрос и потом его вызвать из 1С? Можно просто кусок кода простого, типа как в 3-м посте, т.е. чтобы MyTest запустился без вопросов прямо из 1С, без всяких дополнительных телодвижений пользователя или админа?

    Reply
  11. venger

    (8) +10, ну и сразу с созданием personal.xls, конечно, простенько, но чтобы смысл был понятен….

    Reply
  12. venger

    (8) +11, уж извини, если напрягаю;-)

    Reply
  13. Tatitutu

    (10)ты не внимательный ))))

    Запусти коня )))

    внедряешь объект как в пятнашках, в нем уже заранее пишешь макрос

    при запуске этот объект сохраняешь как personal.xls

    потом создаешь новую книгу и вот в ней уже будут доступны все твои макросы и функции

    сохраняешь книгу , убиваешь personal.xls

    все. финиш.

    Reply
  14. venger

    (13) Во-первых, даже если файла PERSONAL.XLS нет, то все равно не хочет его сохранять:

    //*******************************************
    Функция Лист(Объект)
    Скрипт=СоздатьОбъект(«WScript.Network»);
    ИмяПапки=»С:Documents and Settings»+Скрипт.UserName+»Application DataMicrosoftEXCELXLSTART»;
    ИмяФайла=ИмяПапки+»PERSONAL.XLS»;
    Объект.SaveAs(ИмяФайла);
    КонецФункции // Лист
    

    Показать


    Доступ к файлу невозможен. Проверьте следующее:

    • имеется ли указанная папка;

    • папка, содержащая этот файл, доступна для записи;

    • в имени файла не содержатся знак

    Reply
  15. Tatitutu

    (14) какая версия офиса у тебя ?

    сообщить(ИмяФайла) что возвращает ?

    Reply
  16. venger

    (13) И как теперь из personal.xls вызвать функцию в 1С (допустим она лежит в книге, не листе или модуле, а в книге personal.xls) при создании второй книги?

    Reply
  17. Tatitutu

    (16) как обыкновенную формулы в ячейке

    получаешь результат, копируешь и оставляешь как значение (текст)

    что и требовалось доказать

    P/s перед функцией если в книге напиши Public

    Reply
  18. venger

    (17) Удалить personal.xls старый не могу, если он уже есть, то до свидания, обратиться к функции из personal.xls из 1С нормально в создаваемой книге новой тоже не могу, не видит он pesonal.xls, даже если он лежит в нужном месте при создании новой книги программно…. И т.д. и т.п. Фиг знает что, в общем, кусочка кода или малюхонькой обработочки, я так понимаю не будет с конкретным примером… Ходим вокруг да около…. Ладно, поиграюсь сам…

    Reply
  19. Tatitutu
    в общем, кусочка кода или малюхонькой обработочки, я так понимаю не будет с конкретным примером…

    а чем тебя обработка приложенная к статье смущает ? Она же полностью рабочая (вместо одной строки запихай туда ТЗ и играйся как тебе нужно

    Reply
  20. venger

    (19) Да это я из вредности ворчу просто;-)

    Reply
  21. Свой

    интересно, как выглядит иероглиф «внедрение ERP» ? 🙂

    Reply
  22. Tatitutu

    (21) «И мальчик Хуан объяснил на пальцах , как его зовут» (с) 😀 😀 😀

    Reply
  23. Myti

    😀 Хороший Замутик Tatitutu

    Reply
  24. tanbohu

    你们好

    Смотрю я на это и удивляюсь!

    а что просто установить в компе китайскую раскладку не вариант?

    Reply
  25. Tatitutu

    (24) вариант для чего ?Поясни пожалуйста, будь так любезен

    Reply
  26. tanbohu

    вариант для писания иероглифов в винде где бы то нибыло. хотя, конечно, в 1с с этом проблема.

    Reply
  27. Tatitutu

    (26) Так это понятно. тут вопрос в другом …

    в екселе есть иероглифы читаются , печатаются….

    но нужно их сохранить в 1С

    а 1С такая сякая их не понимает (ну не хочет она китайский изучать)

    разложили иероглифы на коды символов в юникоде и сохранили в строке с разделителями

    отлично. Отлично , а как распечатать ?

    Вот вариант печати здесь и предложен.

    Reply
  28. venger

    (27), (26) А вот и предистория с которой все началось 😉

    Отображение и редактирование на формах, и хранение в базе, Unicode-строк в 1С 7.7

    З.Ы. Только сейчас дошли руки оформить 😳

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *