При разработке тиражируемых решений, таких как расширения конфигурации или внешние обработки, часто возникает необходимость определить состояние основной конфигурации. Если конфигурация находится на строгой поддержке («на замке»), мы можем быть уверены в неизменности ее структуры и логики работы. Если же пользователь включил возможность изменения («снял с замка»), то в систему могли быть внесены доработки, которые потребуют адаптации нашего программного кода.
Встроенный язык «1С:Предприятия» не предоставляет прямого метода для проверки статуса поддержки конфигурации в режиме предприятия. Тем не менее эту задачу можно решить несколькими программными способами. Проанализируем самые эффективные методы — от простых пакетных команд до глубокого анализа файлов и таблиц базы данных.
Это наиболее доступный и простой в реализации способ, предложенный автором темы. Метод основывается на поведении платформы при попытке сравнить основную конфигурацию с конфигурацией поставщика в пакетном режиме.
Если возможность изменения в конфигурации полностью заблокирована (все объекты находятся на строгой поддержке), конфигурация поставщика как отдельный объект внутри базы данных не всегда доступна для прямого изолированного сравнения через параметры командной строки. При попытке выполнить сравнение для конфигурации «на замке» платформа вернет ошибку. Мы можем использовать этот факт для определения статуса поддержки.
Разберем по шагам, как программно запустить это сравнение и проанализировать результат:
/CompareCfg для сравнения основной конфигурации с файлом конфигурации поставщика (или попытки обращения к конфигурации поставщика внутри базы).-Out.Пример кода на встроенном языке 1С для запуска этой проверки:
Процедура ПроверитьВозможностьИзмененияПакетно()
ПутьКЛогу = ПолучитьИмяВременногоФайла("txt");
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Формируем параметры запуска Конфигуратора.
// Вместо файлового варианта может быть использован серверный.
ПараметрыЗапуска = СтрШаблон("DESIGNER /IBConnectionString ""%1"" /CompareCfg -Out ""%2""",
СтрокаСоединения,
ПутьКЛогу);
// Запускаем Конфигуратор в фоновом режиме и ждем завершения работы
ЗапуститьПриложение(ПараметрыЗапуска, , Истина);
// Читаем лог-файл
ТекстЛога = Новый ТекстовыйДокумент;
ТекстЛога.Прочитать(ПутьКЛогу, КодировкаТекста.UTF8);
ПолныйТекст = ТекстЛога.ПолучитьТекст();
// Анализируем результат
Если Найти(ПолныйТекст, "Конфигурация 'Конфигурация поставщика' недоступна") > 0 Тогда
Сообщить("Возможность изменения конфигурации ВЫКЛЮЧЕНА (база находится на строгой поддержке)");
Иначе
Сообщить("Возможность изменения конфигурации ВКЛЮЧЕНА или конфигурация доработана");
EndIf;
// Удаляем временный файл
УдалитьФайлы(ПутьКЛогу);
КонецПроцедуры
Этот метод хорош тем, что он не требует написания сложных парсеров и работает штатными средствами платформы 1С.
Если нам нужно не просто узнать «включена ли кнопка», а детально проанализировать, какие именно объекты были изменены или сняты с поддержки, предыдущий метод не подойдет. В этом случае мы можем использовать механизм выгрузки конфигурации в файлы.
При выполнении команды /DumpConfigToFiles платформа формирует xml-структуру конфигурации, а также служебные файлы метаданных. Информация о правилах поддержки и установленных «замочках» сохраняется в файле Ext/ParentConfigurations.bin, расположенном в каталоге выгрузки.
Рассмотрим подробнее структуру этого файла. Вопреки расширению .bin, он представляет собой текстовый документ в стандартном для систем 1С формате сериализации (текст с древовидной структурой из фигурных скобок). Внутри этого файла содержится список объектов метаданных, представленный в виде групп параметров:
0 — объект находится на строгой поддержке поставщика (редактирование запрещено, стоит «замочек»);1 — включена возможность изменения («желтый кубик», поддержка сохранена);2 — объект полностью снят с поддержки.Выгрузив конфигурацию и прочитав этот файл программно, мы можем составить полную карту измененных объектов базы данных. Ниже представлен пример чтения и парсинга файла ParentConfigurations.bin на встроенном языке:
Функция ПолучитьСтатусыПоддержкиОбъектов(ПутьКФайлуBin) Экспорт
Результат = Новый Соответствие; // Ключ - UUID объекта, Значение - Статус (0, 1, 2)
Чтение = Новый ЧтениеТекста(ПутьКФайлуBin, КодировкаТекста.UTF8);
СтрокаФайла = Чтение.Прочитать();
Чтение.Закрыть();
// Для разбора скобочного формата 1С используем простейший парсер строк или JSON.
// Ниже приведен концептуальный пример поиска кодов поддержки и UUID.
// Структура данных в файле имеет вид: {1, {0, ... , "UUID"}, ...}
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
// Шаблон ищет группы вида {код, ... "uuid"}
РегВыражение.Pattern = "\{(\d+),\s*\{[^\}]*""([a-f0-9\-]{36})""\}";
Matches = РегВыражение.Execute(СтрокаФайла);
Для Каждого Match Из Matches Цикл
Статус = Число(Match.SubMatches(0));
Идентификатор = ВРег(Match.SubMatches(1));
Результат.Вставить(Идентификатор, Статус);
КонецЦикла;
Возврат Результат;
КонецФункции
С помощью этой функции мы можем точно определить состояние любого справочника, документа или общего модуля. Если статус равен 1 или 2, значит, данный объект разрешен для изменения разработчиком.
Для клиент-серверных информационных баз существует возможность получить информацию без выгрузки файлов конфигурации на диск, что существенно экономит время на крупных базах данных. Информация о правилах поддержки хранится в системной таблице базы данных SQL с именем Config.
Настройки упакованы в двоичные данные в поле BinaryData. Мы можем извлечь эти данные SQL-запросом по имени записи, соответствующей настройкам поддержки. Данные таблицы Config сжаты по стандартному алгоритму deflate (zlib). Распаковав этот поток данных с помощью внешних компонент или встроенных средств работы со сжатыми файлами в 1С, мы получим текстовую структуру, аналогичную файлу ParentConfigurations.bin, описанному в Решении 2.
Этот способ требует административного доступа к СУБД и использования средств работы с двоичными данными (например, объекта ЧтениеДанных совместно с ПотокДекомпрессии).
Если вы решили использовать метод выгрузки конфигурации в файлы для анализа изменений, обязательно оптимизируйте этот процесс. Полная выгрузка большой конфигурации (например, ERP или Комплексная автоматизация) в файлы может занимать до нескольких часов.
Чтобы ускорить процесс в десятки раз, используйте специальный ключ пакетного запуска Конфигуратора -getChanges. Этот ключ заставляет платформу выгружать не всю конфигурацию целиком, а только те файлы метаданных, которые отличаются от эталонной конфигурации поставщика.
Пример команды для быстрой выгрузки только измененных объектов:
1cv8.exe DESIGNER /F"C:\Base" /DumpConfigToFiles "C:\DumpFolder" -getChanges "C:\LogFile.txt"
Если по результатам выполнения команды каталог C:\DumpFolder остался пустым — это гарантирует, что конфигурация идентична конфигурации поставщика и в нее не вносились никакие локальные изменения.
Проанализируем первопричину, по которой разработчики и администраторы включают возможность изменения конфигурации. Зачастую это делается не ради глобального переписывания кода, а для решения простых прикладных задач: изменения длины кода справочника, длины номера документа или добавления реквизитов.
Если вашей целью является кастомизация типового решения без снятия его с поддержки, обратите внимание на развитие механизма расширений в современных версиях платформы (начиная с 8.3.22):
Использование современных возможностей расширений позволяет оставлять основную конфигурацию на замке, что значительно облегчает последующие обновления и исключает необходимость программных проверок статуса поддержки, описанных выше.