Отдай корень! Библиотека OneScript для получения информации о захваченных объектах в хранилище

26.12.23

Разработка - Групповая разработка (Git, хранилище)

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

Что за корень? О чем это вообще?

Вы, как и я, все еще работаете с хранилищем?

Тогда, думаю, иногда в помещении, где сидят программисты (хотя кого я обманываю, программисты давно уже не сидят в офисах компаний, - в чате скайпа, телеграмма и тд) слышны возгласы - "отдай корень!".

 
 Что означает эта фраза?

Объясню для людей, не связанных непосредственно с программированием на 1С, что же означает эта загадочная фраза.

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

Корень конфигурации - это самый верхний ее узел. Только захватив корень, мы можем добавить в конфигурацию новые общие модули, документы, справочники, регистры и подобное. Только захватив корень можно изменить настройки поддержки конфигурации. Соответственно, если корень захвачен одним программистом, другой программист не может добавить новые объекты или снять что-то с поддержки.

Потому то и всплывает эта фраза - отдай корень, мне нужно тоже что-то добавить.

Для каких-то команд это вообще не проблема - нет трудностей кинуть клич - "Отдай корень", дождаться, когда корень будет освобожден, захватить его и сделать свои дела.

Но когда команда большая, коммуникация может быть затруднена. Кроме того, человек, захвативший корень, может быть в отпуске. Часто в регламентах работы программистов уделяют внимание этой проблеме и рождают строки типа "Недопустимо захватывать корень конфигурации на время более 2 часов". Но как и большая часть регламентов, этот пункт соблюдается слабо. Корень нужен редко, да и кто будет следить за тем, сколько времени он захвачен?

Дело в том, что у нас нет технических средств, чтобы увидеть кто и что захватил в хранилище. Информация о захвате доступна только в конфигураторе. Если пользователь заходит в конфигуратор и авторизуется в хранилище, в дереве конфигурации становится доступна кнопка "Захваченные объекты", которая отфильтрует дерево по захваченным этим пользователем объектам.

 

Фильтр в дереве конфигурации

 

Также в разделе меню конфигуратора Конфигурация - Хранилище конфигурации - Хранилище открывается окно конфигурации, в котором доступен отбор по всем захваченным объектам, или же по объектам, захваченным конкретным пользователем.

 

 

Несмотря на то, что разработчики программы 1С дали нам возможность работать с конфигуратором и хранилищем из командной строки, возможности получения информации о захвате не предусмотрели. Что же делать?

 

Если подходящего инструмента нет - сделаем его 

Есть прекрасная библиотека на OneScript - v8storage - библиотека для упрощения работы с Хранилищем 1С. Так как она опирается на конфигуратор, чуда она не делает - таблицу захваченных объектов с ее помощью не получить. Однако можно попытаться захватить всю конфигурацию рекурсивно и по "выхлопу" работы команды захвата понять, что какие-то объекты не захвачены, так как были захвачены ранее.

Выглядит сложно, да и захватывать рекурсивно конфигурацию - чрезмерные затраты времени и ресурсов.

И есть библиотека на OneScript - tool1cd. Это программная скриптовая обертка для утилиты чтения файловых баз данных tool1cd от awa. Она умеет читать хранилище. В файле хранилища имеются таблица USERS, в которой есть поля USERID и имя пользователя, таблица OBJECTS, в которой есть поля OBJID - идентификатор объекта метаданных, REVISORID - идентификатор пользователя, REVISEDATE - дата захвата и REVISED - признак захвата объекта. Связать идентификатор объекта метаданных с именем можно с помощью таблицы HISTORY, в которой есть идентификаторы OBJID и PARENTID, а также OBJNAME - имя объекта.

 

 

На основе этих данных я сделал библиотеку - storagereader, которая берет на себя всю рутину по чтению файлов хранилища и определению захваченных объектов.

 

Библиотека для OneScript storagereader

 

Установка

Локальная установка

Скачиваем пакет из релизов  storagereader и устанавливаем через opm

opm install -f .\storagereader-1.0.0.ospx

Установка из хаба

opm install storagereader

 

Подключение

#Использовать storagereader

 

Описание и методы

После подключения библиотеки доступно создание объекта ЧтениеХранилища. Затем нужно вызвать метод объекта ЧтениеХранилища - ПрочитатьХранилище().

ЧтениеХранилища = Новый ЧтениеХранилища(Хранилище, ВыгрузкаКонфигурации);
ЧтениеХранилища.ПрочитатьХранилище();

Создавать объект можно со следующими параметрами:

  • Хранилище - тут нужно указать каталог хранилища 1С
  • ВыгрузкаКонфигурации - тут можно указать каталог выгрузки конфигурации в исходный код (зачем он нужен - опишу ниже)

ПрочитатьХранилище() считывает переданные параметры, проверяет их, и формирует таблицу значений, в которой содержатся данные о захваченных объектах.

Если вызвать метод объекта ЧтениеХранилища ТаблицаЗахватов() вернется эта таблица значений.

ТаблицаЗахватов = ЧтениеХранилища.ТаблицаЗахватов();

Колонки у этой таблицы значений следующие:

  • Метаданные - Строка - описание объекта метаданных
  • Пользователь - Строка - Пользователь, как он задан в хранилище
  • ДатаЗахвата - Дата - Дата захвата объекта

Если не передавать второй параметр при создании ЧтениеХранилища, метаданные вернутся в следующем виде (примерно так они выглядят в БД хранилища):

  • Конфигурация.СуперФорма - общая форма с именем СуперФорма
  • Конфигурация - корень конфигурации
  • Конфигурация.Справочник1.ФормаЭлемента - форма справочника Справочник1
  • Конфигурация.Справочник1 - сам справочник Справочник1

Это данные о захвате объектов с тестового хранилища, приведенного в изображении выше.

Немного непривычно, особенно для тех, кто выгружает изменения конфигурации в исходный код с помощью gitsync и подобного. Покопавшись в идентификаторах объектов метаданных в хранилище я выяснил, что они совпадают с таковыми в файле ConfigDumpInfo.xml.

 

 

Поэтому специально для того, чтобы таблица захватов была более похожа на данные выгрузки в исходный код, я добавил обработку параметра ВыгрузкаКонфигурации, если он заполнен - метаданные берутся из файла ConfigDumpInfo.xml в каталоге выгрузки и выглядят так:

  • CommonForm.СуперФорма - общая форма с именем СуперФорма
  • Configuration.ТестоваяКонфигурация - корень конфигурации
  • Catalog.Справочник1.Form.ФормаЭлемента - форма справочника Справочник1
  • Catalog.Справочник1;Администратор - сам справочник Справочник1

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

Также у ЧтениеХранилища есть метод КореньЗахвачен(), который возвращает структуру с информацией о захвате корня хранилища.

ДанныеОЗахватеКорня = ЧтениеХранилища.КореньЗахвачен();

Поля у этой структуры следующие:

  • Захвачен - Булево
  • Длительность - Число - Количество секунд, прошедшее с момента захвата в хранилище корня
  • Пользователь - Строка - Пользователь, как он задан в хранилище

 

Примеры

Напишем скрипт, который отправит в группу телеграмм уведомление, что корень захвачен больше двух часов. Запускаем его регламентом и вся команда знает, кто захватил корень. Вот оно - фраза "Отдай корень" выдается автоматически, не нужно тратить на это свои силы.

#Использовать storagereader
#Использовать messenger

Процедура СообщитьЧерезТелеграм(ТекстСообщения)

    Мессенджер = Новый Мессенджер();
    Мессенджер.ИнициализироватьТранспорт("telegram", Новый Структура("Логин", "хххххххххххххххххххххххххххххх"));
    Мессенджер.ОтправитьСообщение("telegram", "00000000", ТекстСообщения);

КонецПроцедуры 

ЧтениеХранилища = Новый ЧтениеХранилища(ПутьКХранилищу); 
ЧтениеХранилища.ПрочитатьХранилище(); 
ДанныеОЗахватеКорня = ЧтениеХранилища.КореньЗахвачен(); 
Если ДанныеОЗахватеКорня.Захвачен И ДанныеОЗахватеКорня.Длительность > 7200 Тогда 
    ТекстСообщения = СтрШаблон("Корень захвачен %1 часов назад пользователем %2", Окр(ДанныеОЗахватеКорня.Длительность / 3600), ДанныеОЗахватеКорня.Пользователь); 
    СообщитьЧерезТелеграм(ТекстСообщения); 
КонецЕсли;

Напишем скрипт, который сохраняет таблицу захваченных объектов в текстовый файл и отправляет ее в гит - так я вижу "жизнь" хранилища - вот захватили объект, поработали с ним, отпустили, вот появилась версия хранилища с измененным объектом. Также при распределении задач не обязательно иметь открытый конфигуратор - из этой таблицы видно, что кем захвачено.

#Использовать storagereader
#Использовать gitrunner

Процедура ЗаписатьТаблицу(ТаблицаСтатистики, ИмяФайла)

	МассивСтрок = Новый Массив;
	МассивОписанияКолонок = Новый Массив;
	Для каждого Колонка Из ТаблицаСтатистики.Колонки Цикл
		МассивОписанияКолонок.Добавить(Колонка.Имя);	
	КонецЦикла;

	МассивСтрок.Добавить(СтрСоединить(МассивОписанияКолонок, ";"));

	Для Каждого Строка Из ТаблицаСтатистики Цикл

		ОписаниеСтроки = Новый Массив;
		Для каждого Колонка Из ТаблицаСтатистики.Колонки Цикл
			ОписаниеСтроки.Добавить(Строка[Колонка.Имя]);	
		КонецЦикла;
		МассивСтрок.Добавить(СтрСоединить(ОписаниеСтроки, ";"));

	КонецЦикла;

	ИтоговыйТекст = СтрСоединить(МассивСтрок, Символы.ПС);

	ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
	ЗаписьТекста.Записать(ИтоговыйТекст);
	ЗаписьТекста.Закрыть();

КонецПроцедуры

Процедура КоммитГит(КаталогГитРепозитария, ИмяФайлаОписания)

	Дата = ТекущаяДата();
    АвторКоммита = "Служебный автор <nnnnn@git.ru>";

	ГитРепозиторий = Новый ГитРепозиторий();
	ГитРепозиторий.УстановитьРабочийКаталог(КаталогГитРепозитария);

	ГитРепозиторий.ДобавитьФайлВИндекс(КаталогГитРепозитария);
	СтатусРепо = ГитРепозиторий.Статус();
	Если СтрНайти(СтатусРепо, ИмяФайлаОписания) > 0 Тогда
		ГитРепозиторий.Закоммитить("Изменение таблицы захваченных объектов в хранилище...", , , АвторКоммита, Дата, АвторКоммита, Дата);
	КонецЕсли;
	
КонецПроцедуры

ЧтениеХранилища = Новый ЧтениеХранилища(ПутьКХранилищу); 
ЧтениеХранилища.ПрочитатьХранилище(); 
ТаблицаЗахватов = ЧтениеХранилища.ТаблицаЗахватов();

ИмяФайлаТаблицы = "Захваченные объекты.csv";
Каталог = "КаталогТаблицЗахвата";

ЗаписатьТаблицу(ТаблицаЗахватов, ОбъединитьПути(Каталог, ИмяФайлаТаблицы));

КоммитГит(Каталог, ИмяФайлаТаблицы); 

 

Благодарности

Андрею Овсянкину, создателю OneScript

И Никите Иванченко, у которого на инфостарте 2023 были великолепные доклад и мастер-класс по OneScript, его доклад уже опубликован, посмотрите его, он определенно стоит внимания.

И всем в чате телеграм oscript_library

См. также

SALE! 50%

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Программист Стажер Платформа 1С v8.3 Платные (руб)

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 2450 руб.

29.06.2022    11931    99    4    

131

Групповая разработка (Git, хранилище) Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда в хранилище одновременно разрабатывают несколько команд, сортировка сделанного и несделанного при формировании релиза и проведение code review по задачам превращаются в непроходимый квест. В таких случаях нужен бранчинг. Расскажем об опыте перехода на новую схему хранения кода для ИТ-департамента.

23.09.2024    2831    kraynev-navi    2    

25

Групповая разработка (Git, хранилище) Программист Бесплатно (free)

Называть Git новой технологией – уже смешно, но для многих 1С-ников это действительно «новое и неизведанное». Расскажем о плюсах и минусах двух главных систем контроля версий в мире 1С: Git и хранилища.

17.09.2024    7280    Golovanoff    69    

26

Групповая разработка (Git, хранилище) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во многих командах незаслуженно забывают о том, что в базе меняются расширения (как от вендора, так и собственные) и внешние отчеты и обработки. Вплоть до того, что релиз происходит каждый день – меняются печатные формы, отчеты, обработки. Расскажем о том, как выгружать в Git не только изменения конфигурации рабочего контура, но и файлы внешних обработок и расширений.

05.09.2024    2170    ardn    12    

15

EDT Групповая разработка (Git, хранилище) Программист Платформа 1С v8.3 Бесплатно (free)

Заказчики любят EDT+Git за прозрачность и контроль качества. А у разработчиков есть две основные причины не любить EDT – это тормоза и глюки. Расскажем о том, что нужно учесть команде при переходе на EDT+Git.

14.08.2024    7624    lekot    34    

8

Групповая разработка (Git, хранилище) Программист Платформа 1С v8.3 Бесплатно (free)

В «долгоиграющих» проектах стандартный захват объектов 1С в хранилище может привести к длительным простоям других разработчиков. Но и создавать под каждую доработку отдельное хранилище, чтобы использовать технологию разветвленной разработки конфигураций от фирмы «1С» – избыточно. Расскажем о том, как разрабатывать в отдельной базе без ожиданий, а потом с легкостью перенести изменения в хранилище, используя основную идею технологии 1С – конфигурацию на поддержке хранилища.

05.08.2024    4231    sinichenko_alex    16    

25

Групповая разработка (Git, хранилище) Программист Руководитель проекта Стажер Бесплатно (free)

Про изменения и новинки в агрегаторе открытых проектов OpenYellow, которые появились с момента его создания: про портал, Github и Telegram

15.07.2024    3229    bayselonarrend    8    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1563 27.12.23 14:54 Сейчас в теме
(0) Спасибо, интересный продукт, отличная статья!

Напишем скрипт, который сохраняет таблицу захваченных объектов в текстовый файл и отправляет ее в гит - так я вижу "жизнь" хранилища - вот захватили объект, поработали с ним, отпустили, вот появилась версия хранилища с измененным объектом. Также при распределении задач не обязательно иметь открытый конфигуратор - из этой таблицы видно, что кем захвачено.


(0) мне все-таки непонятно назначение этого скрипта.
зачем класть в гит таблицу захваченных объектов?/
пояснишь?
Оставьте свое сообщение