Размещение произвольных файлов с данными в файлах .mxl и .ert



Добавляем произвольные файлы с данными (архивы, исполняемые файлы, dll, и прочее) прямо в нашу внешнюю обработку, по принципу "всё с собой", в итоге в передаваемом на сторону ert-файле с обработкой всё необходимое для её функционирования (например, архив с данными, или используемая внешняя dll-библиотека) уже есть внутри.

Данная проблема давно бередит умы одинэсников, и уже есть несколько очень неплохих разработок на эту тему. Из встреченных мной:
//infostart.ru/public/14459/
//infostart.ru/public/69202/
//infostart.ru/public/70304/

Однако во всех этих разработках есть одна общая деталь: исходный файл нужно специально кодировать, преобразовывать, и т.п., чтобы потом его можно было засунуть в лист Moxcel. Потом, после того, как извлекли новую сущность из листа Moxcel, производится обратное преобразование, и вуаля — перед нами исходный файл! Это, конечно, весьма интересный подход, но у меня, почему-то, возникло желание чего-то более простого и юзабельного, желательно, чтобы вот прямо в 1С, штатно, щёлкнул на файл, и чтобы он тут же в лист Moxcel и просочился, безо всяких хитромудрых упаковок в картинку и т.п.
И что вы думаете, я нашёл такую фичу! В контексте редактируемого листа Moxcel, в меню ТаблицаВставить рисунокОбъект я нашёл весьма любопытную возможность: опция «Создать из файла», где и можно, совершенно штатно, прямо из 1С, указав любой файл, поместить его в контейнер на листе. Тут же есть и мини-редактор этого контейнера (Объект: ПакетИзменить пакет), где можно изменить имя вложенного файла (ПравкаМетка), извлечь файл (ФайлСохранение содержимого), перезалить в пакет другой файл (ФайлИмпорт), и кое-что ещё, по мелочам.
Однако, довольно быстро пришло разочарование, ведь 1С не предоставляет этот замечательный контейнер в виде объекта, и в Таб.ТекущийОбъект — шиш с маслом. Но мы не сдадимся так просто, ведь правда?
Посмотрев в содержимое файла .ert, я увидел — ну вот же оно, содержимое моего файла, нужно только его ДОСТАТЬ. А достать, надо сказать, оказалось непросто: ведь содержимое файла вложено в Ole10Native, Ole10Native — в Compound, Compound — в объект 1С Moxcel, Moxcel — в, опять-таки, Compound. Но разве мифические трудности остановят настоящего программера? Вооружившись Гуглем, Конфигуратором, своей обработкой по низкоуровневому чтению Compound-файлов ( //infostart.ru/public/115207/ ), и напильником, я приступил к поиску и извлечению этой Кащеевой иглы. И вы знаете, не безуспешно! Результат своих изысканий и предоставляю на суд общественности.

13 Comments

  1. 010280

    Почему то не срабатывает приложение: ЗапуститьПриложение(«»»»+ПапкаИзвлечения+»7z.exe»» e -y «»-o»+ПапкаИзвлечения+»»» «»»+ПапкаИзвлечения+»gpl3.7z»» gpl3.txt»);

    Может не те ключи?

    7z.exe-есть, Gpl3.7z- тоже выгружен. Командной строкой тоже не получается.

    Reply
  2. andrewks

    (1) ключи точно те, проверено.

    а что пишет, если набирать из командной строки? может, антивирус блокирует?

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

    Reply
  3. lvictor58

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

    И без каких-то не понятно из чего высосаных ограничений.

    Одним словом: Хотели как лучше, а получилось — как всегда!

    От оценки воздержусь.

    Reply
  4. 010280

    (2)

    1) 7z.exe ? дает сообщение:

    7-Zip 9.20 Copyringht <c> 1999-2010 Igor Pavlov 2010-11-18

    Error:

    Incorrect command line

    2) 7z.exe? дает сообщение:

    «7z.exe?» не является внутренней или внешней командой, исполняемой или покетной

    Reply
  5. andrewks

    (4) а если перед

    ЗапуститьПриложение()

    вставить строчку: Сообщить(«<«+ПапкаИзвлечения+»>»);

    что выводится в строке сообщений? (желательно скопипастить сюда, может, дело в наименовании темп-папки)

    или ещё так можно попробовать:

    СтрокаЗапуска=»»»»+ПапкаИзвлечения+»7z.exe»» e -y «»-o»+ПапкаИзвлечения+»»» «»»+ПапкаИзвлечения+»gpl3.7z»» gpl3.txt»;

    Сообщить(«<«+СтрокаЗапуска+»>»);

    ЗапуститьПриложение(СтрокаЗапуска);

    желательно тоже скопипастить текст из окна сообщений

    Reply
  6. andrewks

    (3)

    «через эмуляцию картинки гораздо проже и понятней» проще? ну да. при той реализации, как там — конечно проще. поиск нужной строки-метки по тексту «в лоб», я тоже мог бы сделать поиск потоков ole10native так, уместилось бы всё про всё в 200 строк, но специально не стал так делать. потому как неправильно это. это называется «алгоритм, неустойчивый ко входным данным»

    «И без каких-то не понятно из чего высосаных ограничений. » это про что? не совсем понял

    «Одним словом: Хотели как лучше, а получилось — как всегда!» — ну, вы имеете право на своё мнение

    Reply
  7. Il

    На самом деле весьма оригинально!

    Reply
  8. lvictor58

    (6) «И без каких-то не понятно из чего высосаных ограничений. » — это я про надпись перед скачиванием:

    Ограничения на использование материалов для пользователей

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

    2. Пользователь не вправе воспроизводить и распространять материалы каким либо образом. Данное требование не распространяется на передачу материалов сотрудникам пользователя для использования их в связи с исполнением ими своих служебных обязанностей.

    3. При возникновении необходимости иного использования полученных материалов Пользователь обязан обратиться к Правообладателю для заключения договора на передачу имущественных прав на использование материалов.

    В случае обнаружения нарушения, пользователь будет незамедлительно заблокирован.

    Reply
  9. lvictor58

    (6) а п. №2 этого ограничения меня ва-а-ще в ступор вводит. Получается я сам не могу все это использовать, при изготовлении каких-либо отчетов-обработок для обслуживаемых мной клиентов, но вот если для этого найму батраков, то они смогут этм воспользоваться. Но при условии, что получат эти материалы от меня, а не (Боже упаси) проявят инициативу и скачают их с сайта. Только вот факт передачи надо ли будет заверять нотариально или моего честного слова для Вас будет достаточно?

    Reply
  10. andrewks

    (8) ну, так это не ко мне вопрос. я не являюсь ни автором этих надписей, ни хозяином этого ресурса.

    моя мини-лицензия помещена в двух строчках внутри обработки

    Reply
  11. soba

    ну вот и пришла пора вирусов в 1с

    Reply
  12. andrewks

    (11) я бы сказал, что эта пора уже давно, как ушла. тема не взлетела. а метод инкапсуляции бинарных файлов в макеты имеет другое, довольно прикладное значение — файл с данными (например, классификатор), нужная для функционирования обработки dll-ка, и т.п.

    Reply
  13. Rio3000

    Интересная вешь, +

    Reply

Leave a Comment

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