Отдай корень! Библиотека 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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    13304    104    0    

78

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.3 1С 8.5 Бесплатно (free)

В прошлой статье у ERP оставалось 89 отказов загрузки, у ЗУП — 19. Теперь обе конфигурации совпали с эталонами, а собранные файлы прошли круг через платформу. Развертка выделена в открытый репозиторий cf-unwrapper: библиотека на Rust и консольная утилита. Показываю результаты, объясняю границы «100%» и приглашаю к проверкам и развитию проекта.

02.11.2026    234    oyti    1    

1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

Практическое руководство для команд, которые хотят уйти с хранилища конфигурации на git, не переходя на новую среду разработки. Подойдёт разработчикам и тимлидам, которые настраивают командную разработку на типовых и собственных конфигурациях.

02.11.2026    467    vanya_gonchar    2    

5

Файловый обмен (TXT, XML, DBF), FTP DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.5 Бесплатно (free)

В прошлой статье я выгрузил Бухгалтерию в XML байт в байт и спросил, на чем проверить дальше. Вы ответили: ERP, старые релизы, зарплата. Прогнал пять конфигураций, от клиента ЭДО до ERP на 120 тысяч файлов. Рассказываю, что сломалось после Бухгалтерии, почему эталону платформы нельзя верить на слово, как выгрузить одну конфигурацию в формат трех версий платформы - и почему cf-конвертер становится отдельным продуктом, Разверткой.

02.11.2026    311    oyti    2    

3

Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Стажер 1С 8.3 Абонемент ($m)

Два разработчика, по десять правок «Нано-УТ 2.0» в git: длинные ветки против слияния после каждой правки, 22 слияния с загрузкой main в чистую базу. ConfigDumpInfo.xml конфликтовал в 11 слияниях из 11, построчное объединение ломало XML и модули. Показываю, что убрать строкой в .gitattributes, что разбирать целыми вставками и как увидеть конфликты до слияния. Прилагаются инструмент с 38 тестами и материалы опыта.

1 стартмани

29.10.2026    337    Ninel_S    3    

-1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С 8.5 Бесплатно (free)

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

27.10.2026    883    oyti    20    

16

Рефакторинг и качество кода Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Скрипт на Python посчитал метрики 2711 общих модулей УТ 11.5: 26 модулей длиннее 10 000 строк кода. Проверила счёт на синтетических модулях и показала, где рейтинг ошибается: самый длинный модуль оказался в нём ниже девяти коротких. Для разработчиков 1С. В архиве скрипт, тесты и журналы.

1 стартмани

26.10.2026    383    Ninel_S    8    

-3

Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Общие модули 1С вынесла в подмодуль Git и подключила к двум проектам на выгрузке «Нано-УТ» и платформе 8.3.27. Подмодуль на весь каталог CommonModules загружается; клон без --recursive даёт код 1, а забытый указатель и смена ветки молча дают базу не той версии. Переименованная процедура прошла /CheckModules при 28 вызовах. В архиве скрипты, диагностика подмодулей, тесты и журналы.

1 стартмани

26.10.2026    357    Ninel_S    0    

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

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


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