Распределенные блокировки для 1С:Предприятия в кластере Yandex Managed Service for Valkey™
Кластер Yandex Managed Service for Valkey™ можно использовать как хранилище распределенных блокировок для 1С:Предприятия — например, чтобы несколько пользователей не могли одновременно редактировать один и тот же элемент справочника.
Интеграция выполняется через промежуточный HTTP-сервер, развернутый на виртуальной машине Yandex Compute Cloud. Сервер предоставляет HTTP API для управления блокировками и использует кластер Valkey™ в качестве бэкенда. Модуль в 1С:Предприятии взаимодействует с API через внешнее соединение.
Примечание
Для работы модуля требуется 1С:Предприятие версии не ниже 8.3.
Чтобы настроить блокировки:
- Подготовьте инфраструктуру.
- Разверните HTTP-сервер блокировок.
- Настройте модуль в 1С:Предприятии.
- Проверьте работу блокировок.
- Удалите созданные ресурсы
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
- Кластер Yandex Managed Service for Valkey™: вычислительные ресурсы хостов и объем хранилища (тарифы Yandex Managed Service for Valkey™).
- Виртуальная машина: использование вычислительных ресурсов, хранилища, публичного IP-адреса и операционной системы (тарифы Compute Cloud).
Подготовьте инфраструктуру
-
Создайте кластер Yandex Managed Service for Valkey™ со следующими характеристиками:
-
Версия Valkey —
9.1. -
Имя —
1c-locks. -
Включите опцию Использовать FQDN вместо IP-адресов.
-
Выберите режим персистентности данных На репликах.
Важно
Блокировки имеют ограниченный TTL. Чтобы избежать потери данных, используйте высокодоступную конфигурацию кластера.
-
Включите настройку Доступ из WebSQL.
-
-
Создайте виртуальную машину для HTTP-сервера блокировок в той же сети, что и кластер.
-
Настройте группы безопасности так, чтобы:
- HTTP-сервер мог подключаться к кластеру.
- Сервер 1С:Предприятия мог обращаться к HTTP-серверу по выбранному порту.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации valkey-1c-http.tf
.В этом файле описаны:
- сеть;
- подсеть;
- группы безопасности;
- кластер Yandex Managed Service for Valkey™;
- виртуальная машина с публичным доступом из интернета и предустановленным HTTP-сервером вместе со всеми зависимостями.
-
Укажите в файле
valkey-1c-http.tf:- пароль для доступа к кластеру Yandex Managed Service for Valkey™;
- порт для обращения к HTTP-серверу блокировок;
- префикс ключей блокировки в Valkey™.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
После завершения операции создания ресурсов в терминале будут выведены параметры HTTP-сервера блокировок:
vm_public_ip— публичный IP-адрес сервера.http_url— эндпоинт для подключения к серверу.
Разверните HTTP-сервер блокировок
HTTP-сервер блокировок — это тонкая прослойка между сервером 1С:Предприятия и кластером Yandex Managed Service for Valkey™. Он предоставляет эндпоинты с префиксом lock:
| Эндпоинт | Метод | Назначение |
|---|---|---|
lock/acquire |
POST | Захватить блокировку |
lock/release |
POST | Освободить блокировку |
lock/renew |
POST | Продлить блокировку |
lock/status |
POST | Получить статус блокировки |
lock/list |
GET | Получить список блокировок |
Логика работы с кластером:
-
Захват блокировки (
lock/acquire) выполняется командойSETс аргументомNXи установкой времени жизни ключа (PX). АргументNXгарантирует, что блокировка захватывается, только если ключа еще нет, а TTL не дает удерживать блокировку бесконечно:SET <ключ> <токен> NX PX <ttl_в_миллисекундах> -
Освобождение (
lock/release) и продление (lock/renew) блокировки выполняются командойEVALс вызовом Lua-скриптов. В рамках скриптов выполняются несколько последовательных операций в Valkey™:- Получение данных блокировки по ключу.
- Сравнение токена блокировки и токена из запроса.
- Удаление ключа или продление срока блокировки.
Вызов скрипта обеспечивает атомарность транзакции, т. е. гарантирует, что все операции выполнятся целиком или не выполнятся вовсе. Пример скрипта для освобождения блокировки:
-- release: удалить ключ, только если токен совпадает local value = server.call('GET', KEYS[1]) if not value then return 0 end local ok, lock = pcall(cjson.decode, value) if not ok or lock['token'] ~= ARGV[1] then return 0 end return server.call('DEL', KEYS[1]) -
Сервер возвращает HTTP-коды состояния и сообщения об ошибках (удалось ли захватить, освободить или продлить блокировку).
Чтобы развернуть сервер:
-
Установите Go версии 1.26.2
или выше. -
Клонируйте репозиторий:
git clone https://git@git.sourcecraft.dev/valkey/webinar-260624-1c-example.git && \ cd webinar-260624-1c-example/http-lock-valkey -
Создайте переменные окружения с конфигурацией сервера:
export HTTP_ADDR=:<открытый_порт_сервера_для_запросов> export VALKEY_ADDR=<FQDN_хоста_Valkey™>:6379 export VALKEY_USER=default export VALKEY_PASSWORD=<пароль_Valkey™> export DEFAULT_LOCK_TTL=<интервал_продления_блокировки_в_секундах> export LOCK_KEY_PREFIX=<префикс_ключа_блокировки> -
Запустите HTTP-сервер командой:
go run .
В файле конфигурации Terraform указаны все необходимые команды для развертывания HTTP-сервера. После создания инфраструктуры сервер полностью готов к работе.
-
При необходимости измените параметры сервера в файле конфигурации:
- Интервал продления блокировки в параметре
DEFAULT_LOCK_TTLлокальной переменнойcloud_init. - Префикс ключа блокировки в локальной переменной
lock_key_prefix. - Порт сервера для запросов от кластера Valkey™ в локальной переменной
http_port.
- Интервал продления блокировки в параметре
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
-
После завершения операции изменения ресурсов в терминале будут выведены обновленные параметры HTTP-сервера блокировок:
vm_public_ip— публичный IP-адрес сервера.http_url— эндпоинт для подключения к серверу.
Настройте модуль в 1С:Предприятии
В 1С:Предприятии используется модуль Блокировка каталога, который обращается к HTTP-серверу по внешнему соединению. Готовый код модуля содержится в контейнере с тестовой базой данных 1С:Предприятия в репозитории valkey/webinar-260624-1c-example
Модуль выполняет следующие функции:
- Отправка HTTP-запросов к эндпоинтам сервера (
lock/acquire,lock/release,lock/status,lock/renew,lock/list) в зависимости от действия. - Формирование ключа блокировки из полного пути каталога (метаданных коллекции) и идентификатора элемента. Это гарантирует уникальность блокировки для конкретного элемента справочника.
- В форме модуля настраиваются обработчики событий для справочников:
- при открытии — попытка захватить блокировку;
- при изменении и закрытии — продлить или освободить блокировку.
- Чтобы не истек срок действия блокировки во время работы пользователя с формой, настраивается периодическое продление блокировки.
- Для наглядности на форму выводится информация о блокировке: состояние (захвачена или свободна), оставшийся TTL и токен, по которому проверяется владение блокировкой.
Чтобы настроить модуль:
-
Подключите базу данных из папки
1CExampleрепозитория и скопируйте общий модульБлокировкиКаталоговв вашу конфигурацию 1С:Предприятия. -
Если методы вызываются из серверного кода форм, проверьте, что у модуля включен серверный вызов.
-
В функции
HTTPЗапрос()укажите адрес HTTP-сервера блокировок:Соединение = Новый HTTPСоединение("<публичный_IP_адрес_созданной_ВМ>", <порт_из_переменной_HTTP_ADDR>); -
Добавьте блокировку в нужную форму. Для этого:
- Добавьте реквизиты формы для токена и статуса.
- При открытии формы вызывайте
ЗаблокироватьКаталог(). - При закрытии формы вызывайте
РазблокироватьКаталог(). - Подключите периодическую отправку
renew.
-
Подключите обработчики событий формы к нужным справочникам. Пример для минимальной функциональности:
ПриСозданииНаСервере: acquire ПриОткрытии: renew ПриЗакрытии: release -
Настройте ключ блокировки. По умолчанию ключ формируется как:
"Справочник." + Ссылка.Метаданные().Имя + ":" + Ссылка.УникальныйИдентификатор()Для документов можно сделать аналогично:
Документ.ЗаказКлиента:УникальныйИдентификатор()Если нужно использовать один модуль для разных типов объектов, обобщите функцию
КлючБлокировки().
Важно
Настройки подключения модуля могут отличаться в зависимости от пользовательской реализации 1С-Предприятия.
Проверьте работу блокировок
-
Откройте 1С:Предприятие и перейдите в справочник, например
Клиенты. -
Откройте на редактирование элемент, например
Роман. На форме отобразится состояние блокировки — захвачена, а также TTL блокировки и токен. -
Понаблюдайте за TTL: он должен уменьшаться со временем (например,
41→31секунда). По истечении интервала продления (по умолчанию 30 секунд) 1С:Предприятие автоматически продлевает блокировку. -
Убедитесь, что блокировка отражается в кластере:
Консоль управленияSQL- Откройте Подключения
Yandex WebSQL. - Добавьте подключение к БД для созданного ранее сервера Valkey™. Укажите имя БД
0. - Подключитесь к базе данных
0и найдите строку с ключом блокировки.
Примечание
Из-за особенностей кодировки имя ключа в WebSQL может отображаться некорректно. Для проверки владения блокировкой ориентируйтесь на его наличие и значение (токен), а не на читаемость имени.
Подключитесь к кластеру Yandex Managed Service for Valkey™ и выполните запрос:
KEYS <префикс_ключа_блокировки>:*Valkey™ вернет строку с ключом блокировки.
- Откройте Подключения
Удалите созданные ресурсы
Чтобы снизить потребление ресурсов, которые вам не нужны, удалите их:
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-