При работе с конфигурациями и расширениями в 1С:Предприятии часто возникает необходимость контролировать их изменения. Это критически важно для обеспечения целостности данных, корректного обновления, синхронизации в распределенных информационных базах (РИБ) или для отслеживания версий. Сегодня мы с вами разберем, как программно получить различные идентификаторы и хеш-суммы конфигурации и её расширений, выясним, для чего они нужны и в каких случаях их лучше применять.
Мы рассмотрим несколько подходов, каждый из которых имеет свои особенности и области применения. Давайте приступим!
Для основной конфигурации существует несколько способов получить информацию о её текущем состоянии или версии. Рассмотрим их подробнее.
Использование функции ПолучитьИдентификаторКонфигурации()
Эта функция платформы 1С:Предприятие позволяет получить уникальный строковый идентификатор текущей конфигурации. Данный идентификатор изменяется при любом изменении метаданных конфигурации. Мы можем использовать его для быстрого сравнения, изменилась ли конфигурация с момента последнего получения идентификатора.
Пример использования:
ИдентификаторКонфигурации = ПолучитьИдентификаторКонфигурации();
Сообщить("Текущий идентификатор конфигурации: " + ИдентификаторКонфигурации);
Обратите внимание, что этот идентификатор не является криптографической хеш-суммой содержимого конфигурации, но служит надежным показателем её изменений.
Использование параметра командной строки /GetConfigGenerationID
Платформа 1С предоставляет возможность получить идентификатор "поколения" метаданных конфигурации через параметр командной строки /GetConfigGenerationID. Этот идентификатор также обновляется при любом изменении самой конфигурации. Мы можем использовать его для внешних скриптов или инструментов, которые должны проверять актуальность конфигурации без запуска сеанса 1С в интерактивном режиме.
Важно: Этот идентификатор имеет смысл сравнивать только на равенство/неравенство, чтобы определить, были ли изменения.
Свойство Конфигурация.Версия
Хотя это не хеш, свойство Конфигурация.Версия предоставляет строковое представление версии текущей конфигурации. Мы можем использовать его для информационных целей или для сравнения версий, если они поддерживаются вручную или через механизмы хранилища конфигурации.
Пример:
ВерсияКонфигурации = Конфигурация.Версия;
Сообщить("Версия конфигурации: " + ВерсияКонфигурации);
Важный момент: Изменение версии через свойство Конфигурация.Версия не приводит к изменению внутреннего идентификатора конфигурации или её хеша, если не были изменены сами метаданные.
Хеш-суммы в сообщениях обмена РИБ
В контексте распределенных информационных баз (РИБ) при обмене данными мы можем обнаружить в заголовках сообщений обмена специальные значения, такие как <v8de:Digest1> и <v8de:Digest2>. Эти значения служат индикаторами изменения конфигурации между узлами РИБ и используются платформой для контроля целостности обмена. Если вы разрабатываете свои механизмы обмена или анализируете сообщения РИБ, обратите внимание на эти элементы.
Расширения конфигурации стали мощным инструментом для доработки систем без изменения основной конфигурации. Контроль их изменений не менее важен.
Свойство РасширениеКонфигурации.ХешСумма
Это самый прямой и удобный способ получить криптографическую хеш-сумму конкретного расширения. Данное свойство доступно, начиная с версии платформы 8.3.6. Мы можем перебрать все загруженные расширения и получить их хеш-суммы.
Пример получения хеш-сумм для всех расширений:
Для Каждого Расширение Из РасширенияКонфигурации Цикл
Если Расширение.Доступность Тогда
Сообщить("Расширение: " + Расширение.Имя);
Сообщить(" Версия: " + Расширение.Версия);
Сообщить(" Хеш-сумма: " + Расширение.ХешСумма);
КонецЕсли;
КонецЦикла;
Это свойство позволяет нам надежно контролировать изменения в расширении, так как любая модификация его метаданных приведет к изменению хеш-суммы.
Использование параметра командной строки /GetConfigGenerationID -Extension <ИмяРасширения>
Подобно основной конфигурации, мы можем получить идентификатор поколения метаданных для конкретного расширения, используя параметр командной строки /GetConfigGenerationID с флагом -Extension, указав имя расширения. Этот метод также полезен для внешних инструментов.
Свойство РасширениеКонфигурации.Версия
Как и для основной конфигурации, свойство РасширениеКонфигурации.Версия предоставляет строковое представление версии расширения. Мы можем использовать его для информационных целей.
Пример:
Для Каждого Расширение Из РасширенияКонфигурации Цикл
Если Расширение.Имя = "МоеРасширение" Тогда
Сообщить("Версия расширения 'МоеРасширение': " + Расширение.Версия);
Прервать;
КонецЕсли;
КонецЦикла;
При использовании расширений в распределенных информационных базах (РИБ) есть свои нюансы, которые мы обязательно должны учитывать.
До и после версии 8.3.12
Флаг "Используется в РИБ"
Для расширений, которые должны распространяться в РИБ, критически важно установить флаг "Используется в РИБ". Изменения в таких расширениях платформа 1С приравнивает к изменениям самой конфигурации, что требует особого контроля при обмене.
Аннотация &ИзменениеИКонтроль
При заимствовании процедур или функций из основной конфигурации в расширение, мы можем использовать аннотацию &ИзменениеИКонтроль. Платформа будет контролировать неизменность кода оригинальной процедуры. Если код в основной конфигурации изменится, а в расширении он останется прежним, платформа просигнализирует о необходимости актуализации расширения. Это помогает поддерживать актуальность расширений при изменениях в основной конфигурации.
Пример использования:
// В расширении, для заимствованной процедуры
&ИзменениеИКонтроль
Процедура МояПроцедура(Параметр)
// ... доработанный код ...
КонецПроцедуры
Помимо специфичных для конфигурации и расширений методов, существуют и другие механизмы, которые мы можем использовать.
Объект ХешированиеДанных
В платформе 1С:Предприятие 8.3 появился объект ХешированиеДанных, который позволяет выполнять хеширование произвольных данных (например, строк, двоичных данных) с использованием различных алгоритмов, таких как MD5 или SHA1. Мы можем использовать его для создания хеш-сумм произвольных данных, но не для прямого получения хеша метаданных конфигурации или расширения.
Пример использования ХешированиеДанных:
Хеш = Новый ХешированиеДанных(ВидАлгоритмаХеширования.MD5);
Хеш.Добавить("Моя строка для хеширования");
РезультатХеширования = Хеш.ПолучитьХешСтрока();
Сообщить("Хеш строки MD5: " + РезультатХеширования);
Внутренние идентификаторы метаданных
Платформа 1С использует внутренние идентификаторы метаданных для каждого объекта. Мы должны помнить, что несоответствие этих идентификаторов между конфигурацией базы данных и обновляемой конфигурацией может привести к потере данных. Система может посчитать, что метаданные изменились настолько, что требуется очистка соответствующих таблиц. Поэтому всегда будьте внимательны при обновлении конфигураций, особенно если работаете с прямыми изменениями или сложными сценариями.
Программное создание/модификация расширений
Хотя это более продвинутая тема, существует возможность программно создавать или модифицировать расширения. Это достигается путем подготовки необходимых XML-структур и последующей сборки расширения. Такой подход позволяет динамически генерировать или обновлять расширения, но требует глубокого понимания структуры метаданных и внимательного управления уникальными идентификаторами объектов.
В заключение, мы выяснили, что платформа 1С предоставляет нам разнообразные инструменты для контроля изменений конфигурации и расширений. От простых версий до криптографических хеш-сумм и идентификаторов поколения метаданных — каждый инструмент найдет свое применение в зависимости от решаемой задачи. Правильное использование этих механизмов позволяет нам создавать более надежные, управляемые и легко обновляемые информационные системы.
← К списку