Возможно ли сформировать файл EXE силами 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему 1С не является компилятором

Для начала проанализируем ситуацию с технической точки зрения. Платформа 1С:Предприятие использует так называемый P-Code (псевдокод). Когда мы пишем код в конфигураторе, он не превращается в набор машинных инструкций, понятных процессору (Native Code). Вместо этого он компилируется во внутреннее представление, которое исполняется виртуальной машиной 1С. Поэтому «чистая» компиляция кода 1С в независимый EXE-файл невозможна без включения в этот файл всей среды исполнения (Runtime), что сделает размер файла огромным.

Однако, если наша задача — именно сформировать файл с расширением .exe, который будет выполнять определенные действия, у нас есть несколько мощных инструментов. Рассмотрим их по порядку.

Метод 1: Использование системного компилятора C# (csc.exe)

Это, пожалуй, самый элегантный и «честный» способ создания настоящего маленького EXE-файла. В состав практически любой ОС Windows входит .NET Framework, который содержит компилятор командной строки csc.exe. Мы можем заставить 1С написать исходный код на языке C#, сохранить его во временный файл и скомандовать системе собрать из него исполняемый бинарник.

Разберем этот процесс по шагам:

  1. Сформируем текст программы на языке C#.
  2. Сохраним этот текст в файл с расширением .cs.
  3. Найдем путь к csc.exe в системных папках Windows.
  4. Запустим компиляцию через метод ЗапуститьПриложение.

Посмотрим на пример кода в 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С как «сборочный цех» для управления системными ресурсами.

Метод 2: Низкоуровневая сборка через ДвоичныеДанные

Рассмотрим более экстремальный вариант, упомянутый в дискуссии на форуме. Любой EXE-файл в Windows соответствует стандарту PE (Portable Executable). Если мы знаем структуру этого формата, мы можем буквально «склеить» файл по байтам, используя объект ДвоичныеДанные.

Проанализируем структуру простейшего PE-файла. Он должен начинаться с заголовка DOS (сигнатура 4D 5A или "MZ"). Далее следует заголовок PE, таблицы секций и, наконец, сам машинный код. Выясним причину, по которой это сложно: нам придется вручную подготавливать опкоды (машинные команды процессора x86). Это крайне трудозатратно для создания сложных программ, но вполне реально для простых утилит.

Пример записи простейшего заголовка:


МассивБайтов = Новый Массив;
МассивБайтов.Добавить(77); // M
МассивБайтов.Добавить(90); // Z
// ... далее заполнение всех обязательных полей заголовка PE ...

Буфер = Новый БуферДвоичныхДанных(МассивБайтов.Количество());
Для Индекс = 0 По МассивБайтов.Количество() - 1 Цикл
    Буфер.Установить(Индекс, МассивБайтов[Индекс]);
КонецЦикла;

Результат = Новый ДвоичныеДанные(Буфер);
Результат.Записать("C:\Temp\Simple.exe");

Важный момент: Современные антивирусы крайне подозрительно относятся к EXE-файлам, созданным таким образом, так как это типичное поведение генераторов вредоносного ПО (червей). Поэтому данный метод скорее теоретический или исследовательский.

Метод 3: Использование OneScript и упаковка (ovm)

Если ваша цель — запускать код, написанный именно на языке 1С, в виде EXE-файла, то лучшим решением будет использование OneScript. Это независимый интерпретатор языка 1С, который позволяет выполнять скрипты вне среды «1С:Предприятие».

Разберем, как сделать из скрипта исполняемый файл:

Это решает проблему «тяжелого» рантайма, так как OneScript гораздо легче стандартной платформы. При этом сохраняется привычный синтаксис 1С.

Метод 4: Создание самораспаковывающихся архивов (SFX)

Часто под «формированием EXE» подразумевают создание пакета, который при запуске распакуется и запустит определенную внешнюю обработку или скрипт. Мы можем реализовать это программно. Платформа 1С умеет работать с ZIP-архивами через объект ЗаписьZipФайла.

Алгоритм действий следующий:

  1. Создаем ZIP-архив, содержащий нужные файлы (например, v8i файл для подключения к базе или внешнюю обработку).
  2. Берем готовый модуль-распаковщик (например, от 7-Zip), который является EXE-файлом.
  3. С помощью двоичного сложения прикрепляем наш ZIP-архив к концу этого EXE-файла.

Многие архиваторы поддерживают такой режим работы: они ищут начало ZIP-структуры с конца файла и умеют ее распаковывать. В итоге получается файл, который выглядит как программа, но внутри содержит ваши данные.

Метод 5: Технология Native API

Хотя Native API обычно используется для создания DLL-компонент, расширяющих возможности 1С, мы можем хранить такие компоненты внутри макетов конфигурации как двоичные данные. Рассмотрим ситуацию: нам нужно выполнить сложный расчет на языке C++. Мы компилируем его заранее в DLL, помещаем в общий макет, а при необходимости 1С извлекает его на диск и запускает. Это не создает EXE-файл «с нуля», но позволяет 1С оперировать скомпилированным кодом с максимальной производительностью.

Резюме и выводы

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

Основные выводы:

Таким образом, возможности 1С по работе с файловой системой и внешними приложениями позволяют реализовать практически любой полет фантазии разработчика, если понимать принципы работы операционной системы.

← На главную