• 1C 8.3 под Linux — pg_catalog.like_escape(mvarchar, mvarchar) does not exist

    После разворачивания серверной 1С 8.3 на Linux-сервере с патченой постгрёй возникли проблемы — в произвольных местах 1с падает с вышеуказанной ошибкой.

    Нужно зайти в консоль постгреса и выполнить 2 SQL-запроса.

    # CREATE FUNCTION pg_catalog.like_escape(mvarchar, mvarchar) RETURNS mvarchar AS ‘$libdir/mchar’, ‘mvarchar_like_escape’ LANGUAGE C IMMUTABLE RETURNS NULL ON NULL INPUT;
    # CREATE FUNCTION pg_catalog.similar_escape(mvarchar, mvarchar) RETURNS mvarchar AS ‘$libdir/mchar’, ‘mvarchar_similar_escape’ LANGUAGE C IMMUTABLE RETURNS NULL ON NULL INPUT;

  • 1C 8.3 + FreeBSD 11.2 = черновик

    Стоит задача запустить сервер 1С под Фряхой. Пользуюсь статьёй: тыц и гуглом. Играюсь на виртуалке. Дополняю статью по мере продвижения к финалу. Немножко осложняется тем, что машина с фряхой не имеет доступа к Интернету.

    0. Ставим фряху
    x. echo linux64_load="YES" >>/boot/loader.conf
    echo linux_load="YES" >>/boot/loader.conf
    Перезагружаемся (ну или подгружаем оба два модуля через kldload). И потом ставим вот это:
    https://www.freshports.org/emulators/linux_base-c7/ (pkg install linux_base-c7)
    Принципиально важно ставить порт после того, как подключены модули, иначе что-то идёт не так
    x. Добавляем строки в /etc/fstab
    linprocfs /compat/linux/proc linprocfs rw 0 0
    linsysfs /compat/linux/sys linsysfs rw 0 0
    tmpfs /compat/linux/dev/shm tmpfs rw,mode=1777 0 0

    и перезагружаемся.
    x. Ставим порт: archivers/rpm4
    x. Берём архив rpm64.tar.gz жопы Одина, распаковываем.
    x. Про использование среды совместимости с CentOS 7 тутачки: клац
    Устанавливаем пакеты common и server командами:

    rpm -i --dbpath /var/lib/rpm --ignoreos --nodeps --relocate /=/compat/linux/ --badreloc 1C_Enterprise83-common-8.3.12-1529.x86_64.rpm

    rc-скрипт сервера одноэса ожидаемо обломался на фряхе.
    Вот исправленные скрипты:
    prein.sh:
    groupExists () {
    grep -q "^$1:" /etc/group
    }

    userExists () {
    grep -q "^$1:" /etc/passwd
    }

    userBelongsToGroup () {
    id "$1" | grep -q "($2)"
    }

    useLegacy82=""
    commonGroup="grp1cv8"

    if userExists usr1cv82; then
    useLegacy82=true
    fi

    if ! groupExists "$commonGroup"; then
    pw group add $commonGroup >/dev/null 2>&1 || :
    fi

    if [ ! -z "$useLegacy82" ]; then
    username=usr1cv82
    groupname=grp1cv82
    else
    username=usr1cv8
    groupname=grp1cv8

    if ! groupExists "$groupname"; then
    pw group add "$groupname" >/dev/null 2>&1 || :
    fi

    # create system user with home directory belong
    # to group grp1cv8 and $commonGroup
    # -r - system account (don't expire passwd)
    # -n don's auto create group with the same name as user
    if ! userExists $username; then
    pw user add $username -g "$groupname" -G "$commonGroup" \
    -m -c "1C Enterprise 8 server launcher" \
    >/dev/null 2>&1 || :
    fi
    fi

    if ! userBelongsToGroup "$username" "$commonGroup"; then
    pw user mod $username -G "$commonGroup"
    fi

    dir1CVar="/compat/linux/var/1C"
    licenseDir="$dir1CVar/licenses"
    if [ ! -d "$licenseDir" ]; then
    mkdir -p "$licenseDir"
    chown -R $username:$commonGroup "$dir1CVar"
    chmod -R g+w "$dir1CVar"
    fi

    В этот момент устанавливаем основной пакет сервера…
    rpm -i --dbpath /var/lib/rpm --ignoreos --nodeps --noscripts --relocate /=/compat/linux/ --badreloc 1C_Enterprise83-server-8.3.12-1529.x86_64.rpm

    затем запускаем postin.sh
    userExists () {
    grep -q "^$1:" /etc/passwd
    }

    chkconfig --add srv1cv83

    if userExists usr1cv82; then
    tmpfileName=`mktemp`
    startScript="/etc/init.d/srv1cv83"
    cat "$startScript" | sed "s/SRV1CV8_USER=usr1cv8/SRV1CV8_USER=usr1cv82/" > "$tmpfileName"
    mv "$tmpfileName" "$startScript"
    chmod +rx "$startScript"
    fi

    x. Создаём симлинк на bash:
    ln -s /usr/local/bin/bash /bin/bash

    x. Даём пользователю usr1cv8 bash в виде дефолтного шелла.
    pw user mod usr1cv8 -s /usr/local/bin/bash

    x. init-скрипт тоже не работает из коробки. Надо править.

    x. Патчим PostgreSQL 10.3 (в моём случае), взятый отсюда: https://www.postgresql.org/ftp/source/v10.3/, затем устанавливаем.

    Для сборки PostgreSQL 10.3 надо доставить порты:
    devel/readline
    gmake
    icu

    ./configure --with-includes=/usr/local/include
    make world
    make install
    pw user add postgres -d /tmp
    chown -R /usr/local/pgsql
    sudo -u postgres /usr/local/pgsql/bin/initdb -Upostgres -D/usr/local/pgsql/data
    mkdir /usr/local/etc/rc.d
    cp /contrib/start-scripts/freebsd /usr/local/etc/rc.d/postgresql
    chmod +x /usr/local/etc/rc.d/postgresql
    cp /contrib/online_analyze/online_analyze.so /usr/local/pgsql/lib
    cp /contrib/plantuner/plantuner.so /usr/local/pgsql/lib
    echo postgresql_enable=\"YES\" >>/etc/rc.conf
    service postgresql start