В практике разработчика или администратора 1С нередко возникают ситуации, когда доступ к конфигуратору ограничен (например, в облачных сервисах или при работе через веб-клиент), но необходимо оперативно получить информацию о структуре конкретного справочника, документа или регистра. Нам может потребоваться узнать не только названия полей, но и их технические характеристики: длину строки, точность и разрядность чисел, состав типов в составных полях. Рассмотрим подробнее, как решить эту задачу, используя встроенные программные механизмы платформы 1С:Предприятие 8.3.
Самый прямой и надежный способ — это обращение к глобальному объекту Метаданные. Поскольку в веб-клиенте прямой доступ к метаданным ограничен, мы должны реализовать логику на стороне сервера. Проанализируем, как получить детальные характеристики реквизита и провести анализ структуры метаданных.
Для того чтобы узнать длину строки или точность числа, нам необходимо обратиться к свойству Тип объекта метаданных. Это свойство возвращает объект ОписаниеТипов, из которого, в свою очередь, можно извлечь соответствующие квалификаторы.
Разберем пример кода для внешней обработки, который выводит детальную информацию о реквизитах справочника:
&НаСервере
Процедура ПолучитьСтруктуруОбъектаНаСервере(ИмяСправочника)
// Получаем объект метаданных справочника
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];
Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
ОписаниеТипа = Реквизит.Тип;
ТекстТипа = Строка(ОписаниеТипа);
Сообщить("Реквизит: " + Реквизит.Имя + " (" + ТекстТипа + ")");
// Анализируем квалификаторы для строк
КвалификаторыСтроки = ОписаниеТипа.КвалификаторыСтроки;
Если КвалификаторыСтроки <> Неопределено И КвалификаторыСтроки.Длина > 0 Тогда
Сообщить(" - Длина строки: " + КвалификаторыСтроки.Длина);
Сообщить(" - Допустимая длина: " + КвалификаторыСтроки.ДопустимаяДлина);
КонецЕсли;
// Анализируем квалификаторы для чисел
КвалификаторыЧисла = ОписаниеТипа.КвалификаторыЧисла;
Если КвалификаторыЧисла <> Неопределено Тогда
Сообщить(" - Разрядность: " + КвалификаторыЧисла.Разрядность);
Сообщить(" - Точность: " + КвалификаторыЧисла.РазрядностьДробнойЧасти);
КонецЕсли;
// Проверка на составной тип
Если ОписаниеТипа.Типы().Количество() > 1 Тогда
Сообщить(" - Внимание: Составной тип данных!");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный момент: при работе в веб-клиенте мы не можем напрямую манипулировать объектами метаданных на клиенте. Поэтому всю информацию нужно собрать в таблицу или структуру на сервере, сериализовать (например, в массив структур) и передать на клиент для отображения.
Если нам нужно заглянуть еще глубже и понять, как объект представлен на уровне СУБД (например, в SQL), мы можем воспользоваться мощным системным методом ПолучитьСтруктуруХраненияБазыДанных(). Этот метод особенно полезен, когда нужно сопоставить имена 1С (например, Реквизит1) с именами полей в таблицах базы данных (например, _Fld1234).
Выясним причину использования этого метода: он возвращает полную техническую карту таблиц, которую удобно визуализировать через инструмент Структура хранения БД в виде дерева конфигурации. Посмотрим на пример реализации:
&НаСервере
Функция ПолучитьТехническоеОписаниеОбъекта(ИмяОбъекта)
МассивИмен = Новый Массив;
МассивИмен.Добавить(ИмяОбъекта);
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(МассивИмен);
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
// Здесь мы видим соответствие имен полей 1С и SQL
Сообщить("Поле: " + СтрокаТаблицы.ИмяПоля + " -> Имя в БД: " + СтрокаТаблицы.ИмяПоляХранения);
Сообщить("Тип в БД: " + СтрокаТаблицы.ТипДанныхПоляХранения);
КонецЦикла;
КонецФункции
Этот метод возвращает подробную таблицу значений, содержащую информацию о индексах, именах таблиц и типах полей на уровне СУБД. Это незаменимо для оптимизации тяжелых запросов в консоли.
В современных конфигурациях часто включен стандартный интерфейс OData. Если у вас есть соответствующие права доступа, вы можете получить структуру всей конфигурации прямо в браузере.
Проанализируем этот путь:
http://[адрес_сервера]/[имя_базы]/odata/standard.odata/$metadata.Этот способ работает даже в тех случаях, когда запуск внешних обработок в базе запрещен политиками безопасности, но оставлена возможность удаленного доступа через REST-сервис.
Существует ряд проверенных временем инструментов, которые можно запустить как внешние обработки (если это разрешено в профиле безопасности пользователя):
ВЫБРАТЬ * ИЗ Справочник.Номенклатура), вы можете проанализировать результат. Если в поле записано число, то по результатам выгрузки в Excel или через программный перебор результата запроса (функция ТипЗнч()) можно косвенно определить характеристики данных.Рассмотрим подробнее, что именно мы можем узнать о типах данных программно. У объекта ОписаниеТипов есть свойства, которые являются ключом к разгадке структуры:
Для числовых данных (КвалификаторыЧисла):
Разрядность — общее количество знаков в числе (включая дробную часть).РазрядностьДробнойЧасти — количество знаков после запятой (точность).ДопустимыйЗнак — может ли число быть отрицательным (перечисление ДопустимыйЗнак.Любой или ДопустимыйЗнак.Неотрицательный).Для строковых данных (КвалификаторыСтроки):
Длина — максимальное количество символов.ДопустимаяДлина — бывает Переменная (ограниченная указанной длиной) и Фиксированная (всегда дополняется пробелами до указанной длины).Для дат (КвалификаторыДаты):
СоставДаты — определяет, хранится ли в поле только дата, только время или оба значения (Дата, Время, ДатаВремя).Для того чтобы узнать структуру объекта без конфигуратора, мы рекомендуем использовать комплексный подход. Начните с создания простой внешней обработки, которая перебирает коллекцию Метаданные на сервере и выводит свойства через КвалификаторыСтроки и КвалификаторыЧисла. Если же программный доступ к метаданным ограничен, воспользуйтесь OData-интерфейсом или встроенными в конфигурацию отчетами по составу метаданных (часто встречаются в БСП-базах в разделе "Администрирование — Обслуживание").