Вопрос создания исполняемых файлов (EXE) непосредственно из среды 1С часто возникает у разработчиков, желающих расширить функционал системы или создать автономные утилиты, которые могли бы работать без явного запуска тяжелого клиентского приложения 1С:Предприятие. В рамках данной статьи мы подробно разберем, почему штатной кнопки «Сохранить как EXE» не существует, и какими обходными путями мы можем достичь желаемого результата.
Для начала проанализируем ситуацию с технической точки зрения. Платформа 1С:Предприятие использует так называемый P-Code (псевдокод). Когда мы пишем код в конфигураторе, он не превращается в набор машинных инструкций, понятных процессору (Native Code). Вместо этого он компилируется во внутреннее представление, которое исполняется виртуальной машиной 1С. Поэтому «чистая» компиляция кода 1С в независимый EXE-файл невозможна без включения в этот файл всей среды исполнения (Runtime), что сделает размер файла огромным.
Однако, если наша задача — именно сформировать файл с расширением .exe, который будет выполнять определенные действия, у нас есть несколько мощных инструментов. Рассмотрим их по порядку.
Это, пожалуй, самый элегантный и «честный» способ создания настоящего маленького EXE-файла. В состав практически любой ОС Windows входит .NET Framework, который содержит компилятор командной строки csc.exe. Мы можем заставить 1С написать исходный код на языке C#, сохранить его во временный файл и скомандовать системе собрать из него исполняемый бинарник.
Разберем этот процесс по шагам:
csc.exe в системных папках Windows.ЗапуститьПриложение.Посмотрим на пример кода в 1С, который реализует эту логику:
ТекстПрограммы =
"using System;
|class Program {
| static void Main() {
| Console.WriteLine(""Привет из 1С!"");
| Console.ReadLine();
| }
|}";
ПутьКФайлуИсходника = "C:\Temp\MyProg.cs";
ПутьКEXE = "C:\Temp\MyProg.exe";
// Сохраняем исходный код
ТекстовыйДок = Новый ТекстовыйДокумент;
ТекстовыйДок.УстановитьТекст(ТекстПрограммы);
ТекстовыйДок.Записать(ПутьКФайлуИсходника, КодировкаТекста.ANSI);
// Путь к компилятору (может меняться в зависимости от версии .NET)
ПутьККомпилятору = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe";
ПараметрыЗапуска = "/out:""" + ПутьКEXE + """ """ + ПутьКФайлуИсходника + """";
ЗапуститьПриложение(ПутьККомпилятору + " " + ПараметрыЗапуска, , Истина);
В результате выполнения этого кода в папке C:\Temp\ появится полноценный файл MyProg.exe, который при запуске откроет консольное окно с надписью. Мы использовали 1С как «сборочный цех» для управления системными ресурсами.
Рассмотрим более экстремальный вариант, упомянутый в дискуссии на форуме. Любой EXE-файл в Windows соответствует стандарту PE (Portable Executable). Если мы знаем структуру этого формата, мы можем буквально «склеить» файл по байтам, используя объект ДвоичныеДанные.
Проанализируем структуру простейшего PE-файла. Он должен начинаться с заголовка DOS (сигнатура 4D 5A или "MZ"). Далее следует заголовок PE, таблицы секций и, наконец, сам машинный код. Выясним причину, по которой это сложно: нам придется вручную подготавливать опкоды (машинные команды процессора x86). Это крайне трудозатратно для создания сложных программ, но вполне реально для простых утилит.
Пример записи простейшего заголовка:
МассивБайтов = Новый Массив;
МассивБайтов.Добавить(77); // M
МассивБайтов.Добавить(90); // Z
// ... далее заполнение всех обязательных полей заголовка PE ...
Буфер = Новый БуферДвоичныхДанных(МассивБайтов.Количество());
Для Индекс = 0 По МассивБайтов.Количество() - 1 Цикл
Буфер.Установить(Индекс, МассивБайтов[Индекс]);
КонецЦикла;
Результат = Новый ДвоичныеДанные(Буфер);
Результат.Записать("C:\Temp\Simple.exe");
Важный момент: Современные антивирусы крайне подозрительно относятся к EXE-файлам, созданным таким образом, так как это типичное поведение генераторов вредоносного ПО (червей). Поэтому данный метод скорее теоретический или исследовательский.
Если ваша цель — запускать код, написанный именно на языке 1С, в виде EXE-файла, то лучшим решением будет использование OneScript. Это независимый интерпретатор языка 1С, который позволяет выполнять скрипты вне среды «1С:Предприятие».
Разберем, как сделать из скрипта исполняемый файл:
script.os).ovm или специальные упаковщики (например, onec-packer), которые объединяют интерпретатор OneScript и ваш скрипт в один файл.Это решает проблему «тяжелого» рантайма, так как OneScript гораздо легче стандартной платформы. При этом сохраняется привычный синтаксис 1С.
Часто под «формированием EXE» подразумевают создание пакета, который при запуске распакуется и запустит определенную внешнюю обработку или скрипт. Мы можем реализовать это программно. Платформа 1С умеет работать с ZIP-архивами через объект ЗаписьZipФайла.
Алгоритм действий следующий:
v8i файл для подключения к базе или внешнюю обработку).Многие архиваторы поддерживают такой режим работы: они ищут начало ZIP-структуры с конца файла и умеют ее распаковывать. В итоге получается файл, который выглядит как программа, но внутри содержит ваши данные.
Хотя Native API обычно используется для создания DLL-компонент, расширяющих возможности 1С, мы можем хранить такие компоненты внутри макетов конфигурации как двоичные данные. Рассмотрим ситуацию: нам нужно выполнить сложный расчет на языке C++. Мы компилируем его заранее в DLL, помещаем в общий макет, а при необходимости 1С извлекает его на диск и запускает. Это не создает EXE-файл «с нуля», но позволяет 1С оперировать скомпилированным кодом с максимальной производительностью.
Подводя итог нашему анализу, можно сказать следующее: напрямую скомпилировать модуль 1С в EXE невозможно из-за архитектурных особенностей платформы. Однако 1С предоставляет достаточно инструментов для генерации таких файлов косвенными методами.
Основные выводы:
Таким образом, возможности 1С по работе с файловой системой и внешними приложениями позволяют реализовать практически любой полет фантазии разработчика, если понимать принципы работы операционной системы.