На момент написания статьи, так уж получилось, что когда решил улучшить свою консоль запросов 4.0 - сделать замер выполнения запросов под 1с 8.2 на Linux. Оказалось что под 1с 8.2 (старше версии 13) на сервере нет возможности запустить приложение. Для Windows серверов такая проблема легко обходится - есть COM объекты, которые реализуют нужные процедуры.
Однако Linux не поддерживает технологию OLE и COM (тем не менее, попытки сделать компоненту для вызова классов NET под Linux принимались с определенным результатом). Для моего случая, данного результата оказалось недостаточно - слишком старые в поддержке дистрибутивы Linux поддерживает 1с 8.2.
Основы создания внешних компонент рассмотрены в другой статье, здесь автор ограничится настройкой оснастки.
Актуальная ссылка на скачивания шаблона компонент VNCOMP82 под платформы 8.2 и старая версия шаблона под платформу 8.3 (2014 год).
Шаблон VNCOMP82 с внесенными в него исправлениями под Linux находится по этой ссылке:
Скачать платформу 1С:Предприятие 8.2 (учебная версия, полный комплект). Сама ссылка ведет на архив ссылки в Webarchive и уже оттуда можно скачать этот бесплатный учебный диск.
Если стоит цель разработки под платформу 8.3 и под разные типы клиентов и браузеров, тогда имеет смысл скачать другие шаблоны в свободном доступе - так как они обновлены и представляют большее удобство разработчику.
Переходим к выбору дистрибутива Linux.
Почему Debian.
Не смотря на то, что Ubuntu и СentOS удобнее чем Debian (на первом этапе знакомства), у них есть главный недостаток: стремительный рост системных требований. Ubuntu в 2025 году отказалась от поддержки IA-32, требуя уже более 1ГБ ОЗУ. У CentOS ситуация похожая.
Debian 12, вышедший в 2023 году с установленным LXDE рабочим столом (не учить же в самом деле все команды 1С-нику) - как самая легковесная оболочка потреблял около 300 МБ ОЗУ (замеры проводил на Virtualbox). Это по меркам современности является пренебрежимо малой величиной, однако настроить окружение для сборки внешних компонент на этом дистрибутиве на самом деле задача тривиальная.
Самое главное, что нужно помнить всегда - Debian скачивается как DVD диск. В этом случае можно сразу установить GUI (для 1С разработчика без GUI очень неудобно). Хорошие сборки можно найти либо на сайте debian, или же на случай очень древних версий - webarchive (Debian до некоторых пор DVD не очень жаловал как установочный носитель).
Установка версии, начиная с версии Debian 4 и новее в целом идентична для виртуальной машины за маленьким отличием: в новых версиях есть возможность поставить LXDE рабочий стол, который легче, нежели Gnome рабочий стол. И естественно ставить мышь как ps/2 и диски ide для версий 4-8.
Настройка среды для сборки.
После того, как была произведена установка Debian, нужно разобраться с поддержкой пакетов. Если для тестового стенда выбраны последние актуальные версии debian, то все хорошо и настройку проводить не надо. Однако если дистрибутив устарел основательно, то нужно сначала тогда выполнить настройку для установки пакетов из архива.
Для этих целей подойдет следующий пакетный файл bash:
#!/bin/bash
# Проверка наличия русской локализации UTF-8
check_russian_locale() {
if locale -a | grep -qi "ru_RU.utf8" || locale -a | grep -qi "ru_RU.utf-8"; then
return 0
else
return 1
fi
}
# Установка русской локализации (по запросу)
install_russian_locale() {
echo -e "${YELLOW}Russian locale not found. Install? (y/N) ${NC}"
read -r answer
if [[ $answer = [Yy]* ]]; then
echo -e "${YELLOW}Installing Russian locale...${NC}"
apt-get update
apt-get install -y locales
sed -i '/ru_RU.UTF-8/s/^# //g' /etc/locale.gen
locale-gen ru_RU.UTF-8
update-locale LANG=ru_RU.UTF-8
set-locale LANG=ru_RU.UTF-8
export LANG=ru_RU.UTF-8
# Проверяем успешность генерации
if ! locale -a | grep -qi "ru_RU.utf"; then
echo -e "${YELLOW}Standard method failed, used dpkg-reconfigure...${NC}"
dpkg-reconfigure locales
fi
# Перенастравиваем пакеты:
echo -e "${GREEN}Russian locale installed successfully.${NC}"
return 0
else
echo -e "${YELLOW}Continuing with English locale.${NC}"
return 1
fi
}
# Инициализация языковых переменных
init_language() {
if check_russian_locale; then
# Русские тексты
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
MSG_TITLE="=== Менеджер архивных репозиториев Debian ==="
MSG_VERSION="Определена версия:"
MSG_UNSUPPORTED="ВНИМАНИЕ: Версия %s не поддерживается скриптом!"
MSG_OLD_WARNING="Внимание: Это очень старая версия Debian (%s)"
MSG_OLD_WARNING2="Некоторые пакеты могут быть недоступны или иметь ограниченную функциональность"
MSG_CONFIRM="Вы хотите добавить архивные репозитории для %s?"
MSG_WARNING="Внимание: Это заменит текущий /etc/apt/sources.list!"
MSG_PROMPT="Продолжить? (y/N) "
MSG_SUCCESS="Готово! Система настроена для работы с архивными репозиториями."
MSG_CANCEL="Операция отменена пользователем."
MSG_ERROR_ROOT="Ошибка: Требуются root-права! Запустите скрипт с sudo."
MSG_ERROR_BACKUP="Ошибка: Не удалось создать резервную копию."
MSG_ERROR_VERSION="Ошибка: Версия %s не поддерживается"
MSG_ERROR_DETECT="Ошибка: Не удалось определить версию Debian"
MSG_BACKUP="Создаем резервную копию: %s.bak"
MSG_ADD_REPO="Добавляем репозитории для %s..."
MSG_OLD_CONFIG="Настраиваем APT для очень старых версий..."
MSG_OLD_COMPAT="Настраиваем совместимость со старыми форматами пакетов..."
MSG_UPDATE="Обновляем список пакетов..."
NOTES_TITLE="Важные заметки для Debian %s:"
NOTES_1="1. Может потребоваться установка apt-transport-http:"
NOTES_2=" apt-get install apt-transport-http"
NOTES_3="2. Для работы с HTTPS может потребоваться:"
NOTES_4=" apt-get install openssl libssl0.9.8"
NOTES_5="3. Если возникнут ошибки GPG:"
NOTES_6=" apt-get install debian-archive-keyring"
NOTES_7=" apt-key add /usr/share/keyrings/debian-archive-keyring.gpg"
else
# Английские тексты
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
MSG_TITLE="=== Debian Archive Repository Manager ==="
MSG_VERSION="Detected version:"
MSG_UNSUPPORTED="WARNING: Version %s is not supported by this script!"
MSG_OLD_WARNING="Warning: This is a very old Debian version (%s)"
MSG_OLD_WARNING2="Some packages may be unavailable or have limited functionality"
MSG_CONFIRM="Do you want to add archive repositories for %s?"
MSG_WARNING="Warning: This will replace your current /etc/apt/sources.list!"
MSG_PROMPT="Continue? (y/N) "
MSG_SUCCESS="Done! System configured to use archive repositories."
MSG_CANCEL="Operation cancelled by user."
MSG_ERROR_ROOT="Error: Root privileges required! Please run with sudo."
MSG_ERROR_BACKUP="Error: Failed to create backup."
MSG_ERROR_VERSION="Error: Version %s is not supported"
MSG_ERROR_DETECT="Error: Failed to detect Debian version"
MSG_BACKUP="Creating backup: %s.bak"
MSG_ADD_REPO="Adding repositories for %s..."
MSG_OLD_CONFIG="Configuring APT for very old versions..."
MSG_OLD_COMPAT="Configuring compatibility with old package formats..."
MSG_UPDATE="Updating package list..."
NOTES_TITLE="Important notes for Debian %s:"
NOTES_1="1. You may need to install apt-transport-http:"
NOTES_2=" apt-get install apt-transport-http"
NOTES_3="2. For HTTPS support you may need:"
NOTES_4=" apt-get install openssl libssl0.9.8"
NOTES_5="3. If you get GPG errors:"
NOTES_6=" apt-get install debian-archive-keyring"
NOTES_7=" apt-key add /usr/share/keyrings/debian-archive-keyring.gpg"
# Предлагаем установить русскую локаль
install_russian_locale
# Если пользователь согласился и установка прошла успешно, перезагружаем скрипт
if check_russian_locale; then
echo -e "${GREEN}Restarting script with Russian locale...${NC}"
exec "$0" "$@"
fi
fi
}
# Функция для определения кодового имени Debian
get_debian_codename() {
# 1. Пробуем /etc/os-release (современные системы)
if [ -f "/etc/os-release" ]; then
codename=$(grep -oP 'VERSION_CODENAME=\K\w+' /etc/os-release 2>/dev/null)
if [ -n "$codename" ]; then
echo "$codename"
return 0
fi
fi
# 2. Пробуем lsb_release
if command -v lsb_release >/dev/null 2>&1; then
codename=$(lsb_release -c -s 2>/dev/null)
if [ -n "$codename" ]; then
echo "$codename"
return 0
fi
fi
# 3. Пробуем /etc/debian_version (для старых версий)
if [ -f "/etc/debian_version" ]; then
deb_version=$(cat /etc/debian_version)
case $deb_version in
"12"*) echo "bookworm" ;;
"11"*) echo "bullseye" ;;
"10"*) echo "buster" ;;
"9"*) echo "stretch" ;;
"8"*) echo "jessie" ;;
"7"*) echo "wheezy" ;;
"6"*) echo "squeeze" ;;
"5"*) echo "lenny" ;;
"4"*) echo "etch" ;;
"3.1"*) echo "sarge" ;;
"3.0"*) echo "woody" ;;
*) echo "unknown" ;;
esac
return 0
fi
echo "unknown"
return 1
}
# Функция для добавления архивных репозиториев
add_archive_repos() {
local codename="$1"
local sources_list="/etc/apt/sources.list"
# Проверяем root-права
if [ "$(id -u)" -ne 0 ]; then
echo -e "${RED}${MSG_ERROR_ROOT}${NC}" >&2
return 1
fi
# Резервное копирование
echo -e "${YELLOW}$(printf "${MSG_BACKUP}" "$sources_list")${NC}"
cp "$sources_list" "${sources_list}.bak" || {
echo -e "${RED}${MSG_ERROR_BACKUP}${NC}" >&2
return 1
}
# Добавляем репозитории в зависимости от версии
case "$codename" in
bookworm|bullseye|buster|stretch|jessie|wheezy|squeeze|lenny|etch)
echo -e "${GREEN}$(printf "${MSG_ADD_REPO}" "$codename")${NC}"
cat > "$sources_list" <<EOF
# Основной архивный репозиторий
deb http://archive.debian.org/debian/ $codename main contrib non-free
# Репозиторий безопасности
deb http://archive.debian.org/debian-security/ $codename/updates main contrib non-free
EOF
;;
woody)
echo -e "${GREEN}$(printf "${MSG_ADD_REPO}" "woody (Debian 3.0)")${NC}"
cat > "$sources_list" <<EOF
# Основной архивный репозиторий для woody
deb http://archive.debian.org/debian-archive/debian woody main contrib non-free
# Старые пакеты для woody
deb http://archive.debian.org/debian-archive/debian-030119 woody main contrib non-free
# Репозиторий безопасности для woody
deb http://archive.debian.org/debian-security woody/updates main contrib non-free
EOF
;;
sarge)
echo -e "${GREEN}$(printf "${MSG_ADD_REPO}" "sarge (Debian 3.1)")${NC}"
cat > "$sources_list" <<EOF
# Основной архивный репозиторий для sarge
deb http://archive.debian.org/debian-archive/debian sarge main contrib non-free
# Репозиторий безопасности для sarge
deb http://archive.debian.org/debian-security sarge/updates main contrib non-free
EOF
;;
*)
echo -e "${RED}$(printf "${MSG_ERROR_VERSION}" "$codename")${NC}" >&2
return 1
;;
esac
# Для очень старых версий отключаем проверки
if [[ "$codename" == "woody" || "$codename" == "sarge" ]]; then
echo -e "${YELLOW}${MSG_OLD_CONFIG}${NC}"
cat > /etc/apt/apt.conf.d/10-archive-settings <<EOF
Acquire::Check-Valid-Until "false";
Acquire::AllowInsecureRepositories "true";
Acquire::AllowDowngradeToInsecureRepositories "true";
EOF
echo -e "${YELLOW}${MSG_OLD_COMPAT}${NC}"
echo 'APT::Cache-Limit "12500000";' >> /etc/apt/apt.conf.d/10-archive-settings
echo 'Acquire::Languages "none";' >> /etc/apt/apt.conf.d/10-archive-settings
fi
# Обновляем APT
echo -e "${YELLOW}${MSG_UPDATE}${NC}"
apt-get update -o Acquire::Check-Valid-Until=false
}
# Инициализируем языковые переменные
init_language
# Основной скрипт
echo -e "\n${YELLOW}${MSG_TITLE}${NC}"
# Определение версии
codename=$(get_debian_codename) || {
echo -e "${RED}${MSG_ERROR_DETECT}${NC}" >&2
exit 1
}
echo -e "\n${MSG_VERSION} ${GREEN}${codename}${NC}"
# Проверка поддержки
supported_versions=("bookworm" "bullseye" "buster" "stretch" "jessie" "wheezy"
"squeeze" "lenny" "etch" "sarge" "woody")
if ! printf '%s\n' "${supported_versions[@]}" | grep -q "^$codename$"; then
echo -e "${RED}$(printf "${MSG_UNSUPPORTED}" "$codename")${NC}"
exit 2
fi
# Информация о версии
if [[ "$codename" == "woody" || "$codename" == "sarge" ]]; then
echo -e "${YELLOW}$(printf "${MSG_OLD_WARNING}" "$codename")${NC}"
echo -e "${YELLOW}${MSG_OLD_WARNING2}${NC}"
fi
# Запрос на подтверждение
echo -e "\n$(printf "${MSG_CONFIRM}" "${GREEN}${codename}${NC}")"
echo -e "${YELLOW}${MSG_WARNING}${NC}"
read -p "${MSG_PROMPT}" answer
if [[ $answer = [Yy]* ]]; then
add_archive_repos "$codename"
echo -e "${GREEN}\n${MSG_SUCCESS}${NC}"
# Дополнительные инструкции для старых версий
if [[ "$codename" == "woody" || "$codename" == "sarge" ]]; then
echo -e "\n${YELLOW}$(printf "${NOTES_TITLE}" "$codename")${NC}"
echo -e "${YELLOW}${NOTES_1}\n${NOTES_2}\n${NOTES_3}\n${NOTES_4}\n${NOTES_5}\n${NOTES_6}\n${NOTES_7}${NC}"
# Автоматическая установка необходимых пакетов
echo -e "\n${YELLOW}Installing required packages...${NC}"
apt-get install -y apt-transport-http openssl libssl0.9.8 debian-archive-keyring
fi
else
echo -e "${YELLOW}${MSG_CANCEL}${NC}"
fi
Если кратко - задача этого пакетного файла обеспечить работу пакетного менеджера. Пакетный файл был проверен на Debian 3.x выпусках и более новых версиях Debian7.x.
По итогам:
- Будет активирован необходимый архив пакетов.
- Установлена русская локализация UTF-8 (по запросу).
Кросс-компиляция внешних компонент под Debian.
После настройки установки пакетов Debian, необходимо настроить gcc таким образом, чтобы можно было собирать либо на AMD64 или на IA-32 компоненты под обе архитектуры (под остальные поддерживаемые 1С ничего сказать не смогу, под них не разрабатывал).
Для упрощения данной задачи воспользуется другим пакетным файлом со следующим содержимым:
#gcc installer tools bash tools for make binary:
apt-get -y install build-essential
apt-get -y install uuid-runtime
apt-get -y install uuid-dev
apt-get -y install gcc-multilib
apt-get -y install g++-multilib
# for oldest debian (without gcc-multilib)- install need this packages:
# Для 64-битной компиляции (на 32-битных системах)
apt-get -y install libc6-dev-amd64
apt-get -y install linux-libc-dev-amd64
apt-get -y install libc6-dev-x32
apt-get -y install lib64gcc1
apt-get -y install lib64stdc++6
apt-get -y install lib64stdc++6-dev
apt-get -y install lib64z1-dev
apt-get -y install lib64ncurses5-dev
# Для 32-битной компиляции (на 64-битных системах)
apt-get -y install libc6-dev-i386
apt-get -y install lib32gcc1
apt-get -y install lib32stdc++6
apt-get -y install lib32stdc++6-dev
apt-get -y install lib32z1-dev
apt-get -y install lib32ncurses5-dev
Смысл его в следующем: он устанавливает gcc и к нему необходимые библиотеки multilib, uuid. Если первой нет, то тогда устанавливаются пакеты, которые обеспечивают необходимую поддержку для старых версий GCC.
Теперь наконец-то можно и сделать файл компиляции под AMD64 пакета VNCOMP82. Для этого необходимо сделать 2 вещи:
- Скопировать Makefile в Make64 (исходный для IA-32 понадобится).
- В нем сделать 2 вещи: заменить название в переменной TARGET и заменить ключ -m32 на -m64.
После этого тестовый пример можно легко собрать компилятором следующей цепочкой:
make
-rm *.o *.d
make -f Make64
-rm *.o *.d
make
make -f Make64
На этом настройку можно считать завершенным. Наш дистрибутив debian теперь готов к разработке внешних компонент для Linux сервера. Для Windows достаточно просто установить Visual Studio 2008 express.
Пакетные файлы в виде файлов sh приложены к статье.
Вступайте в нашу телеграмм-группу Инфостарт