1c: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Переопределить настройки по умолчанию для ОС Альт)
(Шаг 3. Добавление команды и программного кода)
 
(не показано 29 промежуточных версий 2 участников)
Строка 11: Строка 11:
  
 
  su -
 
  su -
  apt-get install -f alt-tour firefox libwebkit2gtk 1c-preinstall-full libglui
+
  apt-get install -f alt-tour evince firefox libwebkit2gtk 1c-preinstall-full libglui
  
 
===Включить sudo su===
 
===Включить sudo su===
Строка 40: Строка 40:
 
  sudo ./setup-training-8.5.1.1150-x86_64.run
 
  sudo ./setup-training-8.5.1.1150-x86_64.run
  
Далее следуем инструкциям установщика. В установщике необходимо выбрать пункт "Установить ярлыки".
+
Далее следуем инструкциям установщика. В установщике необходимо выбрать пункты "Установить ярлыки" и "Зависимости".
  
 
Установщик сам переключится в режим текстового интерфейса, если не найдёт дисплей (например, при установке по ssh). А вообще он имеет графический интерфейс...
 
Установщик сам переключится в режим текстового интерфейса, если не найдёт дисплей (например, при установке по ssh). А вообще он имеет графический интерфейс...
Строка 82: Строка 82:
 
===Переопределить настройки по умолчанию для ОС Альт===
 
===Переопределить настройки по умолчанию для ОС Альт===
  
====umask====
+
====Каталог для файловых баз данных платформы 1С и sgid-bit====
  
Задать параметры umask на уровне системы
+
Поскольку полный путь до каталога с файловой базой данных будет фигурировать в конфигурационных файлах веб-сервера, его рекомендуется сделать отличным от пути по умолчанию, который предлагает платформа 1С (потому что в пути по умолчанию могут быть пробелы и кириллица).
 +
 
 +
Например, так:
 +
 
 +
mkdir ~/bases
  
sudo sed -i 's/umask 022/umask 002/g' /etc/profile
 
  
Перезагрузиться
+
При публикации базы данных через веб-сервер необходимо чтобы у процесса веб-сервера, запущенного от пользователя
  
====Каталог для файловых баз данных платформы 1С и sguid-bit====
+
apache2
  
Поскольку полный путь до каталога с файловой базой данных будет фигурировать в конфигурационных файлах веб-сервера, его рекомендуется сделать отличным от пути по умолчанию, который предлагает платформа 1С.
+
был доступ на чтение и запись в каталог с базой данных конфигурации 1С.
  
Например, так:
+
Один из вариантов это сделать следующий:
  
mkdir ~/bases
+
1. Разрешаем членам группы-владельца каталога чтение и запись
  
Если параметры umask настроены корректно, то права на созданный каталог должны выглядеть примерно так (на группе должны быть rwx):
+
sudo chmod g+rwx /home/user/bases -R
  
1
+
2. Устанавливаем sgid бит на каталог
  
При публикации базы данных через веб-сервер необходимо чтобы у процесса веб-сервера, запущенного от пользователя apache2 был доступ на чтение и запись в каталог с базой данных конфигурации 1С.
+
sudo chmod g+s /home/user/bases -R
  
Один из вариантов это сделать следующий:
+
3. Добавляем пользователя apache2 в группу-владельца каталога
  
1.
+
sudo usermod -aG user apache2
  
 
==Публикация REST/Odata на веб-сервере==
 
==Публикация REST/Odata на веб-сервере==
Строка 121: Строка 124:
 
Для скриптов платформы 1С это важно...
 
Для скриптов платформы 1С это важно...
  
  ln -s /sbin/httpd2 /sbin/httpd
+
  sudo ln -s /sbin/httpd2 /sbin/httpd
  
 
===Публикуем командой===
 
===Публикуем командой===
Строка 159: Строка 162:
 
</pre>
 
</pre>
  
 +
===Исправляем группу-владельца на файл ===
 +
 +
По каким-то причинам после выполнения публикации утилитой webinstt файл:
 +
 +
/var/www/odata_base/default.vrd
 +
 +
имеет группу-владельца:
 +
 +
apache
 +
 +
(привет разработчикам платформы 1С, ориентирующимся, поди, на Ubuntu, а не на ОС из реестра минцифры)...
 +
 +
Исправляем:
 +
 +
sudo chgrp apache2 /var/www/odata_base/default.vrd
  
 
===Исправляем параметр в конфигурации сервиса===
 
===Исправляем параметр в конфигурации сервиса===
Строка 164: Строка 182:
 
Исправляем значение параметра:
 
Исправляем значение параметра:
  
  sed -i 's/ProtectHome=yes/ProtectHome=no/g' /lib/systemd/system/httpd2.service
+
  sudo sed -i 's/ProtectHome=yes/ProtectHome=no/g' /lib/systemd/system/httpd2.service
  
После этого перезагрузим демона systemd
+
После этого перезагрузим демона systemd и сервис httpd2
 +
 
 +
sudo systemctl daemon-reload
 +
sudo systemctl restart httpd2
 +
 
 +
Перед редактированием конфигурации необходимо передать права на папку публикации самому веб-серверу. По умолчанию она может быть закрыта для него. Если этого не сделать, веб-сервер не сможет прочитать файл настроек default.vrd и вернет ошибку доступа при обращении к базе через браузер.
 +
<pre>
 +
chown -R apache2: /var/www/odata_base
 +
chmod -R 755 /var/www/odata_base
 +
</pre>
 +
 
 +
Домашние каталоги пользователей (например, /home/user/) по умолчанию полностью изолированы от системных служб. Чтобы веб-сервер apache2 смог добраться до папки с базой данных, ему нужно дать разрешение на «транзитный проход» сквозь вышестоящие директории. Флаг +x для папок как раз открывает эту возможность, не нарушая при этом приватность остальных личных файлов пользователя.
 +
<pre>
 +
sudo chmod a+x /home/user/
 +
sudo chmod a+x /home/user/bases/
 +
</pre>
  
systemctl daemon-reload
+
Перед конфигурацией OData необходимо также предоставить веб-серверу права на чтение и запись внутри папки с самой базой. Чтобы не нарушать логику прав Linux и оставить пользователя владельцем файлов, мы добавляем apache2 в его группу и выставляем права 775 совместно с флагом SGID. Это позволит платформе беспрепятственно создавать файлы блокировок (.1CL), а новые файлы будут автоматически наследоваться группой.
 +
<pre>
 +
sudo chmod -R 2775 /home/user/bases/base1/
 +
</pre>
  
 
===Перезапускаем веб-сервер===
 
===Перезапускаем веб-сервер===
  
  systemctl restart httpd2
+
  sudo systemctl restart httpd2
  
 
===Проверяем публикацию===
 
===Проверяем публикацию===
 +
Идём браузером по адресу:
 +
 +
<pre>
 +
http://localhost/odata_base/
 +
</pre>
 +
 +
Однако данная веб-страница возвращает внутреннюю ошибку платформы 1С. По всей видимости, в текущем режиме совместимости конфигурации графический модуль для отображения данного стандартного окна не генерируется веб-сервером (отсутствуют необходимые JS-скрипты для рендеринга интерфейса).
 +
 +
<pre>
 +
{"#exception":"{http://v8.1c.ru/8.2/virtual-resource-system}Exception","exception":{"clsid":"580392e6-ba49-4280-ac67-fcd6f2180121","reason":404,"descr":"HTTP: Not found\nError executing the query GET to resource /en/scripts/mod_bootstrap_bootstrap.js:","category":"00000000000000000000000000","creationStack":"mngsrvt:0x0000000000252DF5 mngsrvt:0x000000000024F8F4 vrsbaset:0x00000000006D7791 vrsbaset:0x00000000006540C5 vrsbaset:0x00000000006EBDE6 vrsbaset:0x00000000006D2A9C vrsbaset:0x00000000006EC4A9 vrsbaset:0x00000000006ED4A0 core85t:0x00000000008D4EBF core85t:0x00000000006B238C libc.so:0x0000000000000000 libc.so:0x0000000000000000 "}}
 +
</pre>
 +
 +
(ещё один привет разработчикам платформы 1С, по всей видимости, совсем не ориентирующимся на ОС на базе GNU/Linux, раз в учебной версии под GNU/Linux с веб-интерфейсом что-то не так).
 +
 +
НО!
 +
 +
Это не помешает нам работать с OData REST!
 +
 +
===Включение поддержки OData===
  
Идём браузером по адресу:
+
Любым текстовым редактором открываем конфигурационный файл публикации:
 +
<pre>
 +
nano /var/www/odata_base/default.vrd
 +
</pre>
 +
 
 +
Внутри тега <standardOdata> меняем значение параметра enable с false на true:
 +
<pre>
 +
<standardOdata enable="true"
 +
</pre>
 +
 
 +
Итоговый вид файла default.vrd:
 +
<pre>
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
 +
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
 +
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 +
                base="/odata_base"
 +
                ib="File=/home/user/bases/base1;">
 +
        <ws pointEnableCommon="true"/>
 +
        <standardOdata enable="true"
 +
                        reuseSessions="autouse"
 +
                        sessionMaxAge="20"
 +
                        poolSize="10"
 +
                        poolTimeout="5"/>
 +
        <analytics enable="true"
 +
                        sessionMaxAge="1200"
 +
                        poolSize="500"
 +
                        poolTimeout="5"/>
 +
</point>
 +
</pre>
 +
 
 +
В блоке
 +
 
 +
<pre>
 +
<standardOdata enable="true"
 +
                        reuseSessions="autouse"
 +
                        sessionMaxAge="20"
 +
                        poolSize="10"
 +
                        poolTimeout="5"/>
 +
</pre>
 +
 
 +
увеличьте значение параметра
 +
 
 +
sessionMaxAge
 +
 
 +
до
 +
 
 +
1200
 +
 
 +
чтобы доступ к REST на учебной версии платформы не блокировался (при нескольких запросах с малым значением параметра sessionMaxAge платформа будет создавать более одной сессии, а учебная версия предусматривает только одну сессию!).
 +
 
 +
После изменения конфигурации перезапускаем службу веб-сервера для применения настроек:
 +
<pre>
 +
sudo systemctl restart httpd2
 +
</pre>
 +
 
 +
Для проверки доступности интерфейса OData отправляем GET-запрос по адресу:
 +
<pre>
 +
http://localhost/odata_base/odata/standard.odata?$format=json
 +
</pre>
 +
 
 +
Пример успешного ответа (корневой контейнер для пустой информационной базы):
 +
<pre>
 +
<service xml:base="http://localhost/odata_base/odata/standard.odata">
 +
<workspace>
 +
<atom:title>Default</atom:title>
 +
</workspace>
 +
</service>
 +
</pre>
 +
 
 +
===Внесение объектов в OData===
 +
====Шаг 1. Создание внешней обработки====
 +
Запустите Конфигуратор 1С, выберите в главном меню '''Файл''' -> '''Новый...''' и в открывшемся списке выберите '''Внешняя обработка'''.
 +
 
 +
[[Файл:1c-1.png|thumb|center|900px|Создание новой внешней обработки в Конфигураторе]]
 +
 
 +
[[Файл:1c-2.png|thumb|center|900px|Выбор типа создаваемого документа]]
 +
 
 +
====Шаг 2. Настройка свойств и создание формы====
 +
В открывшемся окне свойств новой обработки выполните следующие действия:
 +
# '''Имя''': Задайте понятное имя (например, `НастройкаOData`).
 +
# '''Создание формы''': Перейдите на вкладку '''Формы''' и нажмите на кнопку «Добавить», чтобы создать основную форму обработки. На этой форме мы разместим кнопку и пропишем логику внесения объектов в OData.
 +
 
 +
[[Файл:1c-3.png|thumb|center|900px|Настройка имени обработки и инициализация создания формы]]
 +
 
 +
====Шаг 3. Добавление команды и программного кода====
 +
В редакторе формы перейдите на вкладку '''Команды''' (в правой части экрана) и добавьте новую команду формы, задав ей имя (например, `ВыполнитьНастройку`).
 +
 
 +
Перетащите созданную команду мышкой в левую верхнюю часть окна — в структуру элементов формы, чтобы она превратилась в физическую кнопку.
 +
 
 +
После этого нажмите правой кнопкой мыши по кнопке в левой части, выберите пункт '''Действие команды''' и в выпадающем меню выберите вариант: '''Создать на клиенте и процедуру на сервере без контекста'''.
 +
 
 +
[[Файл:1c-4.png|thumb|center|900px|Проектирование интерфейса формы и привязка клиент-серверного действия к кнопке]]
 +
 
 +
* '''1''' — Кнопка добавления на вкладке «Команды» в правой панели, с помощью которой создается новая команда формы.
 +
* '''2''' — Элемент формы в левой панели (структура элементов), получившийся в результате перетаскивания команды мышкой из правой части.
 +
* '''3''' — Пункт контекстного меню '''Действие команды''', открывающийся по правому клику мыши на перенесенном элементе для генерации шаблонов процедур.
 +
 
 +
В модуле формы замените сгенерированные шаблоны процедур следующим кодом:
 +
 
 +
<pre>
 +
&НаКлиенте
 +
Процедура ВыполнитьНастройку(Команда)
 +
    ВыполнитьНастройкуНаСервере();
 +
КонецПроцедуры
 +
 
 +
&НаСервереБезКонтекста
 +
Процедура ВыполнитьНастройкуНаСервере()
 +
    // 1. Создаем массив для объектов, которые пойдут в веб-сервис
 +
    МассивОбъектов = Новый Массив;
 +
   
 +
    // 2. Добавляем в массив необходимый справочник (например, Сотрудники)
 +
    МассивОбъектов.Добавить(Метаданные.Справочники.Сотрудники);
 +
   
 +
    // 3. Передаем этот массив платформе для регистрации в OData
 +
    УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектов);
 +
КонецПроцедуры
 +
</pre>
 +
 
 +
====Шаг 4. Сохранение обработки====
 +
Закройте окна редактора формы и программного модуля. Вернувшись в основное окно создания внешней обработки, нажмите кнопку '''Закрыть'''. Платформа автоматически предложит сохранить изменения — выберите удобный каталог на диске и сохраните файл обработки (с расширением `.epf`).
 +
 
 +
[[Файл:1c-5.png|thumb|center|900px|Процесс сохранения внешней обработки на диск]]
 +
 
 +
====Шаг 5. Запуск обработки в режиме предприятия====
 +
Запустите 1С:Предприятие. В главном меню выберите '''Файл''' -> '''Открыть...''', найдите сохраненную ранее внешнюю обработку и откройте её. Если система безопасности выдаст предупреждение о потенциальной опасности подключаемого модуля, согласитесь с рисками и подтвердите открытие.
 +
 
 +
[[Файл:1c-6.png|thumb|center|900px|Открытие файла внешней обработки через пользовательский интерфейс 1С]]
 +
 
 +
====Шаг 6. Инициализация OData====
 +
На экране появится созданная нами форма. Нажмите на ней кнопку '''Выполнить настройку'''. В этот момент отработает заложенная нами серверная логика, и состав стандартного интерфейса OData обновится. После этого обработку и само приложение 1С можно закрывать.
 +
 
 +
[[Файл:1c-7.png|thumb|center|900px|Финальное выполнение логики обработки по нажатию кнопки]]
 +
 
 +
====Шаг 7. Проверка доступности объектов в OData====
 +
Чтобы убедиться, что внешняя обработка успешно зарегистрировала наши метаданные в веб-сервисе, откройте браузер и повторно отправьте GET-запрос по уже знакомому адресу:
  
 
<pre>
 
<pre>
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/e1csys/vrscore/exception.xslt?sysver=8.5.1.1150"?><exception xmlns="http://v8.1c.ru/8.2/virtual-resource-system" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Exception" clsid="580392e6-ba49-4280-ac67-fcd6f2180121" reason="500"><descr xmlns="http://v8.1c.ru/8.1/data/core">Error loading file-based infobase support components</descr><inner xmlns="http://v8.1c.ru/8.1/data/core" xsi:type="Exception" clsid="d294e384-7ea6-49c6-be96-f3a6e3de1242"><descr>Error when loading component 'help'</descr><inner xsi:type="Exception" clsid="9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3"><descr>File access error '/home/user'. 13(0x0000000D): Permission denied</descr><data>77u/ew0KezlkYjFmYTM3LWI0NTUtNGYzZi1iOGRkLTdkZTBlYTdkNmRhMywiRmls
+
http://localhost/odata_base/odata/standard.odata
 
</pre>
 
</pre>
 +
 +
Если всё сделано правильно, в ответе от сервера (в формате JSON или XML, в зависимости от настроек) вместо пустого корневого контейнера вы увидите структуру метаданных, содержащую зарегистрированный нами справочник.
 +
 +
Внутри тега `<workspace>` появится коллекция доступных сущностей (EntitySet), среди которых будет фигурировать URL для работы со справочником сотрудников: `Catalog_Сотрудники`.
  
 
==Автоматизация резервного копирования информационных баз==
 
==Автоматизация резервного копирования информационных баз==

Текущая версия на 12:19, 13 июня 2026

Содержание

В GNU/Linux

Установка учебной платформы 8.5.x на ОС Альт Стартеркит p11 GNOME

Обновить ОС и ядро

su -
apt-get update -y && apt-get dist-upgrade -y && update-kernel -y

Поставить пакеты

su -
apt-get install -f alt-tour evince firefox libwebkit2gtk 1c-preinstall-full libglui

Включить sudo su

Раскоментировать в файле:

/etc/sudoers

строчку:

WHEEL_USERS ALL=(ALL:ALL) ALL

или строчку:

WHEEL_USERS ALL=(ALL:ALL) NOPASSWD: ALL

(если необходимо выполнять sudo su без пароля)

Установить платформу

Предполагается, что есть файл установки платформы:

setup-training-8.5.1.1150-x86_64.run

Тогда установка осуществляетс следующим образом:

chmod +x setup-training-8.5.1.1150-x86_64.run
sudo ./setup-training-8.5.1.1150-x86_64.run

Далее следуем инструкциям установщика. В установщике необходимо выбрать пункты "Установить ярлыки" и "Зависимости".

Установщик сам переключится в режим текстового интерфейса, если не найдёт дисплей (например, при установке по ssh). А вообще он имеет графический интерфейс...

Починить запуск платформы (актуально для ОС Альт веток p10 и p11 как минимум)

Пробуем запустить:

/opt/1cv8t/x86_64/8.5.1.1150/1cv8t

Получилось? Если да, то странно... Должна быть такая ошибка:

/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libwebkit2gtk-4.0.so.37)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by /lib64/libwebkit2gtk-4.0.so.37)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libwebkit2gtk-4.0.so.37)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.31' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libjavascriptcoregtk-4.0.so.18)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib64/libicuuc.so.74)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib64/libjxl.so.0.11)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1: version `GCC_12.0.0' not found (required by /lib64/libhwy.so.1)
/opt/1cv8t/x86_64/8.5.1.1150/1cv8t: /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1: version `GCC_13.0.0' not found (required by /lib64/libhwy.so.1)

Не такая ошибка? Если да, то вы точно все пункты до этого выполнили (точно пакеты все установлены, которые выше в команде установки пакетовв перечислены)?


Если ошибка такая, то чиним:

sudo rm -f /opt/1cv8t/x86_64/8.5.1.1150/libstdc++.so.6
sudo rm -f /opt/1cv8t/x86_64/8.5.1.1150/libgcc_s.so.1


Пробуем запустить ещё раз:

/opt/1cv8t/x86_64/8.5.1.1150/1cv8t

Всё должно работать. Теперь можно запускать платформу посредством ярлыков (кнопок меню приложений)

По прежнему не запускается? Если да, то спешим на встречу новым приключениям!

Переопределить настройки по умолчанию для ОС Альт

Каталог для файловых баз данных платформы 1С и sgid-bit

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

Например, так:

mkdir ~/bases


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

apache2

был доступ на чтение и запись в каталог с базой данных конфигурации 1С.

Один из вариантов это сделать следующий:

1. Разрешаем членам группы-владельца каталога чтение и запись

sudo chmod g+rwx /home/user/bases -R

2. Устанавливаем sgid бит на каталог

sudo chmod g+s /home/user/bases -R

3. Добавляем пользователя apache2 в группу-владельца каталога

sudo usermod -aG user apache2

Публикация REST/Odata на веб-сервере

Предполагается что до этого были выполнены все действия в предыдущем разделе...

Устанавливаем и включаем веб-сервер apache2

sudo apt-get install -y apache2
sudo systemctl enable --now httpd2

Создаём симлинк для httpd2

Для скриптов платформы 1С это важно...

sudo ln -s /sbin/httpd2 /sbin/httpd

Публикуем командой

Сначала создаём файл (оно само не может):

sudo touch /etc/httpd2/conf/sites-enabled/1c_odata.conf

Потом публикуем:

sudo HOME=/home/user /opt/1cv8t/x86_64/8.5.1.1150/webinstt -apache24 -wsdir odata_base -dir /var/www/odata_base -connstr "File=/home/user/bases/base1;" -confPath /etc/httpd2/conf/sites-enabled/1c_odata.conf

В ответ должно прийти что-то типа этого:

Публикация выполнена

или этого:

Публикация обновлена

Примерное содержимое файла в контексте конфигурационных файлов веб-сервера apache2:

cat /etc/httpd2/conf/sites-enabled/1c_odata.conf
LoadModule _1cws_module "/opt/1cv8t/x86_64/8.5.1.1150/wsap24t.so"

# 1c publication
Alias "/odata_base" "/var/www/odata_base/"
<Directory "/var/www/odata_base/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "/var/www/odata_base/default.vrd"
</Directory>

Исправляем группу-владельца на файл

По каким-то причинам после выполнения публикации утилитой webinstt файл:

/var/www/odata_base/default.vrd

имеет группу-владельца:

apache

(привет разработчикам платформы 1С, ориентирующимся, поди, на Ubuntu, а не на ОС из реестра минцифры)...

Исправляем:

sudo chgrp apache2 /var/www/odata_base/default.vrd

Исправляем параметр в конфигурации сервиса

Исправляем значение параметра:

sudo sed -i 's/ProtectHome=yes/ProtectHome=no/g' /lib/systemd/system/httpd2.service

После этого перезагрузим демона systemd и сервис httpd2

sudo systemctl daemon-reload
sudo systemctl restart httpd2

Перед редактированием конфигурации необходимо передать права на папку публикации самому веб-серверу. По умолчанию она может быть закрыта для него. Если этого не сделать, веб-сервер не сможет прочитать файл настроек default.vrd и вернет ошибку доступа при обращении к базе через браузер.

chown -R apache2: /var/www/odata_base
chmod -R 755 /var/www/odata_base

Домашние каталоги пользователей (например, /home/user/) по умолчанию полностью изолированы от системных служб. Чтобы веб-сервер apache2 смог добраться до папки с базой данных, ему нужно дать разрешение на «транзитный проход» сквозь вышестоящие директории. Флаг +x для папок как раз открывает эту возможность, не нарушая при этом приватность остальных личных файлов пользователя.

sudo chmod a+x /home/user/
sudo chmod a+x /home/user/bases/

Перед конфигурацией OData необходимо также предоставить веб-серверу права на чтение и запись внутри папки с самой базой. Чтобы не нарушать логику прав Linux и оставить пользователя владельцем файлов, мы добавляем apache2 в его группу и выставляем права 775 совместно с флагом SGID. Это позволит платформе беспрепятственно создавать файлы блокировок (.1CL), а новые файлы будут автоматически наследоваться группой.

sudo chmod -R 2775 /home/user/bases/base1/

Перезапускаем веб-сервер

sudo systemctl restart httpd2

Проверяем публикацию

Идём браузером по адресу:

http://localhost/odata_base/

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

{"#exception":"{http://v8.1c.ru/8.2/virtual-resource-system}Exception","exception":{"clsid":"580392e6-ba49-4280-ac67-fcd6f2180121","reason":404,"descr":"HTTP: Not found\nError executing the query GET to resource /en/scripts/mod_bootstrap_bootstrap.js:","category":"00000000000000000000000000","creationStack":"mngsrvt:0x0000000000252DF5 mngsrvt:0x000000000024F8F4 vrsbaset:0x00000000006D7791 vrsbaset:0x00000000006540C5 vrsbaset:0x00000000006EBDE6 vrsbaset:0x00000000006D2A9C vrsbaset:0x00000000006EC4A9 vrsbaset:0x00000000006ED4A0 core85t:0x00000000008D4EBF core85t:0x00000000006B238C libc.so:0x0000000000000000 libc.so:0x0000000000000000 "}}

(ещё один привет разработчикам платформы 1С, по всей видимости, совсем не ориентирующимся на ОС на базе GNU/Linux, раз в учебной версии под GNU/Linux с веб-интерфейсом что-то не так).

НО!

Это не помешает нам работать с OData REST!

Включение поддержки OData

Любым текстовым редактором открываем конфигурационный файл публикации:

nano /var/www/odata_base/default.vrd

Внутри тега <standardOdata> меняем значение параметра enable с false на true:

<standardOdata enable="true"

Итоговый вид файла default.vrd:

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                base="/odata_base"
                ib="File=/home/user/bases/base1;">
        <ws pointEnableCommon="true"/>
        <standardOdata enable="true"
                        reuseSessions="autouse"
                        sessionMaxAge="20"
                        poolSize="10"
                        poolTimeout="5"/>
        <analytics enable="true"
                        sessionMaxAge="1200"
                        poolSize="500"
                        poolTimeout="5"/>
</point>

В блоке

<standardOdata enable="true"
                        reuseSessions="autouse"
                        sessionMaxAge="20"
                        poolSize="10"
                        poolTimeout="5"/>

увеличьте значение параметра

sessionMaxAge

до

1200

чтобы доступ к REST на учебной версии платформы не блокировался (при нескольких запросах с малым значением параметра sessionMaxAge платформа будет создавать более одной сессии, а учебная версия предусматривает только одну сессию!).

После изменения конфигурации перезапускаем службу веб-сервера для применения настроек:

sudo systemctl restart httpd2

Для проверки доступности интерфейса OData отправляем GET-запрос по адресу:

http://localhost/odata_base/odata/standard.odata?$format=json

Пример успешного ответа (корневой контейнер для пустой информационной базы):

<service xml:base="http://localhost/odata_base/odata/standard.odata">
<workspace>
<atom:title>Default</atom:title>
</workspace>
</service>

Внесение объектов в OData

Шаг 1. Создание внешней обработки

Запустите Конфигуратор 1С, выберите в главном меню Файл -> Новый... и в открывшемся списке выберите Внешняя обработка.

Создание новой внешней обработки в Конфигураторе
Выбор типа создаваемого документа

Шаг 2. Настройка свойств и создание формы

В открывшемся окне свойств новой обработки выполните следующие действия:

  1. Имя: Задайте понятное имя (например, `НастройкаOData`).
  2. Создание формы: Перейдите на вкладку Формы и нажмите на кнопку «Добавить», чтобы создать основную форму обработки. На этой форме мы разместим кнопку и пропишем логику внесения объектов в OData.
Настройка имени обработки и инициализация создания формы

Шаг 3. Добавление команды и программного кода

В редакторе формы перейдите на вкладку Команды (в правой части экрана) и добавьте новую команду формы, задав ей имя (например, `ВыполнитьНастройку`).

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

После этого нажмите правой кнопкой мыши по кнопке в левой части, выберите пункт Действие команды и в выпадающем меню выберите вариант: Создать на клиенте и процедуру на сервере без контекста.

Проектирование интерфейса формы и привязка клиент-серверного действия к кнопке
  • 1 — Кнопка добавления на вкладке «Команды» в правой панели, с помощью которой создается новая команда формы.
  • 2 — Элемент формы в левой панели (структура элементов), получившийся в результате перетаскивания команды мышкой из правой части.
  • 3 — Пункт контекстного меню Действие команды, открывающийся по правому клику мыши на перенесенном элементе для генерации шаблонов процедур.

В модуле формы замените сгенерированные шаблоны процедур следующим кодом:

&НаКлиенте
Процедура ВыполнитьНастройку(Команда)
    ВыполнитьНастройкуНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНастройкуНаСервере()
    // 1. Создаем массив для объектов, которые пойдут в веб-сервис
    МассивОбъектов = Новый Массив;
    
    // 2. Добавляем в массив необходимый справочник (например, Сотрудники)
    МассивОбъектов.Добавить(Метаданные.Справочники.Сотрудники);
    
    // 3. Передаем этот массив платформе для регистрации в OData
    УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектов);
КонецПроцедуры

Шаг 4. Сохранение обработки

Закройте окна редактора формы и программного модуля. Вернувшись в основное окно создания внешней обработки, нажмите кнопку Закрыть. Платформа автоматически предложит сохранить изменения — выберите удобный каталог на диске и сохраните файл обработки (с расширением `.epf`).

Процесс сохранения внешней обработки на диск

Шаг 5. Запуск обработки в режиме предприятия

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

Открытие файла внешней обработки через пользовательский интерфейс 1С

Шаг 6. Инициализация OData

На экране появится созданная нами форма. Нажмите на ней кнопку Выполнить настройку. В этот момент отработает заложенная нами серверная логика, и состав стандартного интерфейса OData обновится. После этого обработку и само приложение 1С можно закрывать.

Финальное выполнение логики обработки по нажатию кнопки

Шаг 7. Проверка доступности объектов в OData

Чтобы убедиться, что внешняя обработка успешно зарегистрировала наши метаданные в веб-сервисе, откройте браузер и повторно отправьте GET-запрос по уже знакомому адресу:

http://localhost/odata_base/odata/standard.odata

Если всё сделано правильно, в ответе от сервера (в формате JSON или XML, в зависимости от настроек) вместо пустого корневого контейнера вы увидите структуру метаданных, содержащую зарегистрированный нами справочник.

Внутри тега `<workspace>` появится коллекция доступных сущностей (EntitySet), среди которых будет фигурировать URL для работы со справочником сотрудников: `Catalog_Сотрудники`.

Автоматизация резервного копирования информационных баз

Предполагается, что платформа "1С Предприятие" работает на GNU/Linux системе и скрипт резервного копирования выполняется от пользователя

administrator

, графическое окружение которого автоматически запускается после загрузки компьютера.

Дело в том, что по каким-то причинам, разработчики платформы "1С Предприятие" не заложили в систему запуск резервного копирования в headless-режиме, поэтому платформе необходим дисплей X-сервера.

Также предполагается, что файл с паролем от пользователя платформы "1С Предприятие", которому разрешено выполнять резервное копирование, хранится в файле

/home/administrator/.1c-cluster-infobases-backup.pass

и рекомендуемые права на этот файл

0400


Подготовка каталога для скриптов

mkdir /opt/1c_backup_scripts

Базовый скрипт

При необходимости, в тексте скрипта, отредактируйте строчку

bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8"

, указав путь до конкретной версии платформы "1С Предприятие".

Ниже предоставлен текст, который можно выделить, скопировать в текстовый редактор, при необходимости поправить, затем весь этот текст можно бросить в консоль для создания файла посредством heredoc-синтаксиса:

cat << 'EOF' > /opt/1c_backup_scripts/backup_infobase_1c_generic.sh 
#!/bin/bash
export LANG=ru_RU.UTF-8

NON_ROOT_USER="administrator"
DISPLAY=":0"
STORAGE="${1}"
SRV="${2}"
REF="${3}"
LOGIN="${4}"
PASSWORD_FILE="${5}"
KEEP_BACKUPS_FOR_LAST_DAYS="${6}"
BACKUP_TIMEOUT_SEC="${7}"
TIMEOUT_COUNTER=0
LOCK_FILE_PATH="/home/usr1cv8/.1cv8/1C/1cv8/reg_1541/snccntx8e79a393-c2af-4fd7-b25a-af6b5ed19bfa/snccntx.dat"
#-----------------------------
export DISPLAY="${DISPLAY}"
bin1c="/opt/1cv8/x86_64/8.3.23.1912/1cv8"
PASSWORD=`cat ${PASSWORD_FILE} | head -1`
infobase_suffix="$(date +%Y-%m-%d-%H-%M-%S).dt"
TMP_STORAGE="/opt/1c_backup_scripts/tmp_storage"
ib_tmp_filepath="${TMP_STORAGE}/${REF}__${infobase_suffix}"
ib_tmp_log="${ib_tmp_filepath}.log"
ib_filepath="${STORAGE}/${REF}__${infobase_suffix}"
ib_log="${ib_filepath}.log"

function rotate_backups(){
filenames_cmd="${STORAGE}/${REF}*"
current_unixtime=`date +%s --date="$(date +%Y-%m-%d) 00:00:00"`
test_unixtime=$(($current_unixtime-$KEEP_BACKUPS_FOR_LAST_DAYS*60*60*24))

for f in $(/bin/ls $filenames_cmd); do
#echo "f=$f"
datetime_from_file=`echo ${f} | awk -F '__' {'print $2'} | awk -F '.' {'print $1'}`
#echo "datetime_from_file=${datetime_from_file}"

#2023-12-24-22-01-02
Y=`echo ${datetime_from_file} | awk -F '-' {'print $1'}`
M=`echo ${datetime_from_file} | awk -F '-' {'print $2'}`
D=`echo ${datetime_from_file} | awk -F '-' {'print $3'}`
h=`echo ${datetime_from_file} | awk -F '-' {'print $4'}`
m=`echo ${datetime_from_file} | awk -F '-' {'print $5'}`
s=`echo ${datetime_from_file} | awk -F '-' {'print $6'}`

unixtime_from_file=`date +%s --date="${Y}-${M}-${D} ${h}:${m}:${s}"`

if [[ $unixtime_from_file -lt $test_unixtime ]]; then
  echo "delete file: ${f}"
  /bin/rm ${f}
else
  echo "keep file: ${f}"
fi
done
}

function wait(){

  if [[ $TIMEOUT_COUNTER -ge $BACKUP_TIMEOUT_SEC ]]; then
    kill -9 ${1}
  fi

  if [ ! -d /proc/${1}/ ]; then
    nice_text="Выгрузка информационной базы успешно завершена"
    res_text=$(grep -o -i "${nice_text}" ${ib_tmp_log})

    # start apache2
    sudo systemctl start httpd2

    if [ "${res_text}" = "${nice_text}" ]; then
      /bin/cp ${ib_tmp_filepath} ${ib_filepath} && /bin/rm ${ib_tmp_filepath}
      /bin/cp ${ib_tmp_log} ${ib_log} && /bin/rm ${ib_tmp_log}
      #echo "TEST: ${ib_filepath} AND ${ib_log}"
      rotate_backups
      exit 0
    fi

    exit 1
  fi
  #echo "pid alive: ${1}"
  sleep 1
  TIMEOUT_COUNTER=$(($TIMEOUT_COUNTER+1))
  wait ${1}
}

# prepare tmp storage
[ ! -d ${TMP_STORAGE} ] && sudo mkdir "${TMP_STORAGE}" && sudo chown administrator: "${TMP_STORAGE}" -R

# stop apache2
sudo systemctl stop httpd2
sleep 2

# reset srv1cv8 sessions
sudo systemctl stop srv1cv8
sleep 2
sudo /bin/rm -f "${LOCK_FILE_PATH}"
sudo systemctl start srv1cv8
sleep 2

DISPLAY=:0 XAUTHORITY=/home/administrator/.Xauthority ${bin1c} CONFIG /N "${LOGIN}" /P "${PASSWORD}" /S "${SRV}/${REF}" /DumpIB "${ib_tmp_filepath}" /OUT "${ib_tmp_log}" &
main_process_pid=$!

wait ${main_process_pid}

Делаем файл исполняемым

chmod +x /opt/1c_backup_scripts/backup_infobase_1c_generic.sh

Скрипт для резервирования конкретной базы данных

Данный скрипт представляет из себя обёртку над выше приведённым скриптом, с заданием конкретных параметров резервирования

cat << 'EOF' > /opt/1c_backup_scripts/backup__my_super_infobase.sh 
#!/bin/bash

### PARAMETERS ###
STORAGE="/mnt/storage/my-1c-host-backups" # каталог для сохранения резервных копий
SRV="my-1c-host"                          # хост, на котором работает платформа "1С: Предприятие"
REF="my_super_infobase"                   # имя базы данных, которую резервируем
LOGIN="backupuser"                        # 1с-пользователь, которому разрешено резервировать базу данных
PASSWORD_FILE="/home/administrator/.1c-cluster-infobases-backup.pass" # в этом файле должен находиться только пароль от 1с-пользоателя 
KEEP_BACKUPS_FOR_LAST_DAYS="2"            # сохранить резервные копии только за эти несколько последных дней (в текущем примере - за 2 последних дня)
BACKUP_TIMEOUT_SEC="300"                  # таймаут, в течение которого разрешено работать процессу резервирования (процессу платформы "1С: Предприятие". Если за этот таймаут процесс не успел сделать резервную копию, то он снимается с выполнения)

# ------------------------------------------------------------------------------------------------

### BOT PARAMETERS
TELEGRAM_BOT_TOKEN=""             # сюда нужно вписать токен телеграм-бота, который будет отсылать уведомления
TELEGRAM_DESTINATION_GROUP_ID=""  # сюда нужно вписать идентификатор телеграм-пользователя или телеграм-группы (не забывайте про минус в начале, если это идентификатор группы), в которого (или в которую, если это группа) бот будет писать сообщения

function send_message_telegram(){
#exit 0  # раскомментируйте эту строчку, если отсылка сообщений телеграм-ботом не нужна (следовательно, и параметры дя бота при этом можно не задавать)
message=${1}
curl -s -X POST \
     -H 'Content-Type: application/json' \
     -d "{\"chat_id\": \"${TELEGRAM_DESTINATION_GROUP_ID}\", \"text\": \"${message}\", \"disable_notification\": true}" \
     https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage > /dev/null
}
# ------------------------------------------------------------------------------------------------

### START ###
BASE=`dirname ${0}`
${BASE}/backup_infobase_1c_generic.sh "${STORAGE}" "${SRV}" "${REF}" "${LOGIN}" "${PASSWORD_FILE}" "${KEEP_BACKUPS_FOR_LAST_DAYS}" "${BACKUP_TIMEOUT_SEC}"
res=$?

if [ ${res} -eq 0 ]; then
send_message_telegram "[Успешно]\nРезервное копирование информационной базы '${REF}' выполнено успешно"
else
send_message_telegram "[Ошибка]\nРезервное копирование информационной базы '${REF}' не выполнено"
fi
EOF

Делаем файл исполняемым

chmod +x /opt/1c_backup_scripts/backup__my_super_infobase.sh

Ставим задачу для планировщика cron

Под пользователем

administrator

в терминале открываем временный файл для настройки crontab

EDITOR=nano crontab -e

в результате редактором

nano

будет открыт временный файл для установки параметров планировщика для текущего пользователя. Отредактировав и сохранив (Ctrl+O - Enter) изменения в этом файле и закрыв редактор (Ctrl+X) будет сконфигурирован планировщик для текущего пользователя.

Проверить корректность заданных параметров планировщика можно выполнением команды

crontab -l

В случае, если планировщик был сконфигурирован на запуск скрипта резервного копирования каждые сутки с 23:01, вывод команды проверки должен быть примерно такой:

#minute (0-59),
#|	hour (0-23),
#|	|	day of the month (1-31),
#|	|	|	month of the year (1-12),
#|	|	|	|	day of the week (0-6 with 0=Sunday).
#|	|	|	|	|	commands
1       23	*	*	*	/opt/1c_backup_scripts/backup__my_super_infobase.sh