Есть строковое поле в 1С 7.7 в справочнике товаров, в котором лежат коды символов Unicode, разделенные точкой с запятой, т.е. примерно так, «25163;25226;33014».
При печати дока в Excel, нужно вместо этой строки поставлять в ячейку строку, сложенную из этих символов, преобразованных из кодов уже в символы Unicode.
Сделать в VBA это можно функциями ChrW, AscW, т.е. после вывода дока в Excel из 1С (OLE), нужно запустить функцию VBA, которая пробежится по таким ячейкам и преобразует из кодов в символы эти строки.
Написать подобную функцию не проблема, но как ее запустить из 1С в конце вывода дока в Excel?
Если сохранить функцию в модуле personal.xls, и вызывать из 1С так:
Excel = СоздатьОбъект("Excel.Application");
//…
// Создаем книгу, листы, выводим документ на лист
РабочаяКнига = Excel.Workbooks.Add(); // Добавить рабочую книгу
РабочаяКнига.Activate();
//…
Excel.Visible = 1;
Предупреждение("Экспорт в Excel завершен.");
//…
Excel.Run("personal.xls!ИмяФункции");
То, во-первых, он выполняет нашу функцию, только если открыта какая-либо еще книга с макросами, если нет, то пишет:
---------------------------
Excel.Run("PERSONAL.XLS!MyDocFormat");
{Документ.ИмяДока.Форма.Модуль(178)}: Microsoft Office Excel: Не удалось найти 'PERSONAL.XLS'. Проверьте задание имени и местоположения файла.
При попытке открытия файла с использованием списка недавно использованных файлов из меню ''Файл'' убедитесь, что файл не был переименован, перемещен или удален.
---------------------------
Как подгрузить PERSONAL.XLS при выводе в Excel дока, тогда? Чтоб он всегда видел эту функцию? Как в нее передать значения книги и листа, по которому надо пробежаться и преобразовать коды в символы?
Или как бы создавать макрос сразу в выводимой из 1С книги и в конце запускать его? Что было бы лучше всего, так как не будет требовать наличия в PERSONAL.XLS у каждого пользователя необходимой функции. В общем, получается основной вопрос как выполнять из 1С Excel функции, создавать их из 1С, что было бы вообще хорошо, или допустим из PERSONAL.XLS, хотя бы….
(6) О, я счас подготовлю пример, ибо второй день бьюсь, не могу пробиться.... Уже подумывал отказываться от Excel и выводить в HTML, но это очень не желательно.... Excel - гораздо лучше и для пользователей привычней...
(9) В общем, в архиве SupportUnicode.rar, есть папка SupportUnicode - это база 1С 7.7. Там уже вбит документ "Приход товара" №1 от 03.02.10 в полном журнале (журнал в меню "Наше меню"). В этом доке есть кнопка, ПечатьВExcel. Выведется в Excel, как оно сейчас. Для примера это файлы ris-1.jpg и книга1.xls. А как должно быть - это ris-2.jpg и книга2.xls - все в том же архиве SupportUnicode.rar. Теперь собственно вопрос в том, как этого добиться?
(2) Хотел в личку вопрос даже задать, но потом подумал на форуме обсудить, в общем, например, в пятнашках, там при открытии книги процедура Excel выполняется, т.е. ее из 1С особо ты и не запускаешь, т.е. выводишь печ. таблицу в которой лежит OleОбъект - Лист Excel, но процедура то WorkBook_Open запускается сама, а не мы ее запускаем когда хотим....
но процедура то WorkBook_Open запускается сама, а не мы ее запускаем когда хотим....
так не проблема (это чтобы нагляднее было), давай создадим процедуру или функцию она будет доступна вообще во всех книгах
или как макрос или как функция для вставки в ячейку
в необходимый документ передаешь метку, а при открытии документа макрос сверяет метку с заранее заданным шаблоном - делает нужные операции , удаляет метку и сохраняет документ.
(12) Более того, я уже организовал возможность внесения, редактирования и просмотра эти символов Unicode в нужных полях, прямо на форме 1С, почти как с обычными полями;-) См. картинку;-) Осталось только печать в Excel победить;-)
(18) Порадую конструктивом;-) Вроде со всем разобрался, наконеццццто;-)
Во-первых, чтобы можно было программно генерить макросы в Excel (книге, листе, модуле) из 1С, надо, чтобы в Excel стояла галка Доверять доступ к Visual Basic Project (пункт меню Сервис -> Макрос -> Безопасность -> Вкладка надежные издатели). См. рис.
Дальше все примерно так:
Перем Excel, РабочаяКнига, РабочийЛист;
// Создаем все…
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.Application.Run(""+РабочаяКнига.CodeName+".MyTest","Hi,Venger!");
РабочийЛист.Cells(1,1).Value = "'Что-то выводим…";
// Ну и типа финиш
Сообщить("Экспорт в Excel успешно завершен.");
Показать
Т.е. все необходимое есть - и процедуру создать в книге с передаваемыми параметрами и запускать ее.
Остался вопрос, где в реестре для всех пользователей для Excel проставить галку Доверять доступ к Visual Basic Project (см. рис.)? Иначе при попытке создать программно функцию или процедуру из 1С в Excel будет выдавать ошибку: «Программный доступ к проекту Visual Basic не является доверены», а каждому пользователю в ручную ставить эту галку в Excel – это не фонтан…