К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как присвоить тип значения реквизита в 1С

Способы присвоить тип значения реквизиту в 1С: через конфигуратор, палитру свойств и программно. Составные типы, ОписаниеТипов, проверка результата и типичные ошибки.

Тип значения реквизита в 1С определяет, какие данные можно хранить в поле объекта: строку, число, дату, ссылку на справочник или сразу несколько вариантов. От правильного выбора типа зависят корректность ввода данных, работа запросов, сортировка, итоги и поведение форм. Ошибка на этом этапе приводит к невозможности сохранить нужное значение, потере точности чисел или конфликтам при обмене данными.

Присвоить тип можно двумя путями: в конфигураторе через палитру свойств реквизита (основной способ для объектов метаданных) и программно — через объект ОписаниеТипов, когда речь идёт о реквизитах временных таблиц, колонок таблиц значений, дополнительных реквизитов или произвольных полей. Ниже разобраны оба подхода, ограничения каждого и способы проверить результат.

Где задаётся тип реквизита и что он определяет

Реквизиты есть у справочников, документов, регистров, планов счетов, обработок, отчётов и других объектов конфигурации. Для каждого реквизита в палитре свойств существует поле «Тип», в котором фиксируется допустимый набор значений. Платформа использует это описание при вводе данных пользователем, при записи объекта, при построении запросов и при сериализации данных.

Типы делятся на примитивные (Строка, Число, Дата, Булево), ссылочные (ссылки на справочники, документы, перечисления, планы видов характеристик и другие объекты) и служебные (ХранилищеЗначения, УникальныйИдентификатор, ValueStorage в старых терминах). Помимо самого типа уточняются квалификаторы: длина строки (фиксированная или переменная), разрядность и точность числа, состав даты (дата, время или дата и время).

Квалификаторы влияют на хранение и сравнение. Например, строка неограниченной длины не может индексироваться и не участвует в сравнениях в запросах напрямую, а число с недостаточной точностью молча округляет дробную часть при записи. Поэтому тип нужно выбирать с учётом реальных данных, а не «с запасом наугад».

Присвоение типа через конфигуратор

Основной сценарий — задание типа реквизиту справочника, документа или регистра. Откройте конфигуратор, найдите нужный объект в дереве конфигурации, раскройте ветку «Реквизиты» и дважды щёлкните по реквизиту (или вызовите палитру свойств правой кнопкой). В палитре найдите строку «Тип» и нажмите кнопку выбора — откроется окно редактирования типа данных.

В окне редактирования отметьте галочкой нужный тип. Для ссылочных типов раскройте соответствующую ветку (например, «СправочникСсылка») и выберите конкретный объект конфигурации. После выбора типа задайте квалификаторы в нижней части окна: для строки — длину и признак неограниченности, для числа — длину и точность, для даты — состав.

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и найдите объект в дереве конфигурации
  2. 2
    Раскройте ветку «Реквизиты» и откройте палитру свойств нужного реквизита
  3. 3
    В поле «Тип» нажмите кнопку выбора и отметьте нужный тип
  4. 4
    Задайте квалификаторы: длину строки, точность числа, состав даты
  5. 5
    Сохраните конфигурацию (F7) и выполните обновление конфигурации базы данных
  6. 6
    Проверьте ввод значения в пользовательском режиме

Если тип задаётся новому реквизиту, проблем обычно не возникает. Если тип меняется у реквизита, уже содержащего данные, платформа при обновлении конфигурации базы данных выполнит реструктуризацию. При сужении типа (например, было «Строка(100)», стало «Строка(10)») данные могут быть обрезаны без предупреждения о каждом конкретном значении — проверяйте это на копии базы.

Составной тип: когда реквизит хранит разные значения

В окне редактирования типа можно отметить несколько типов одновременно — такой реквизит становится составным. Типичный пример: реквизит «Контрагент», который может ссылаться и на справочник «Контрагенты», и на «ФизическиеЛица». Платформа позволяет сочетать любые типы, включая примитивные и ссылочные вместе.

Составной тип — это компромисс. Он удобен для универсальных механизмов, но ухудшает работу запросов: соединения по составному полю выполняются медленнее, а в запросах часто приходится применять ВЫРАЗИТЬ для приведения значения к конкретному типу. Индексы по составным реквизитам также менее эффективны.

Сравнение вариантов

Одиночный тип

Оптимален для запросов, индексов и контроля ввода. Подходит, когда состав данных известен и стабилен.

Составной тип из ссылочных типов

Приемлем для полей-комментариев и универсальных связей. Требует ВЫРАЗИТЬ в запросах при соединениях.

Составной тип с примитивами и ссылками

Крайний случай: усложняет обработку и логику. Используйте только при реальной необходимости, например в механизмах дополнительных сведений.

Если составной тип нужен «на вырост», но реальных сценариев с несколькими типами пока нет, лучше оставить одиночный тип и расширить его позже — расширение типа проходит реструктуризацию безболезненно, в отличие от сужения.

Программное присвоение типа через ОписаниеТипов

Когда тип нужно задать не в метаданных, а в коде — для колонки таблицы значений, реквизита динамически создаваемой формы, параметра запроса — используется конструктор ОписаниеТипов. В простейшем виде конструктор принимает строку с именем типа.

ТипНоменклатуры = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

ТаблицаРезультатов.Колонки.Добавить("Товар", ТипНоменклатуры);

КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 2);

ТипСуммы = Новый ОписаниеТипов("Число", , , КвалификаторыЧисла);

КвалификаторыСтроки = Новый КвалификаторыСтроки(50);

ТипСтроки = Новый ОписаниеТипов("Строка", , КвалификаторыСтроки);

Для составного типа в конструктор передаётся строка с перечислением типов через запятую или массив типов. Также существует метод Добавить() у уже созданного описания, позволяющий расширить список типов. Обратный метод — СодержитТип() — проверяет, допускает ли описание конкретный тип.

СоставнойТип = Новый ОписаниеТипов("СправочникСсылка.Контрагенты,СправочникСсылка.ФизическиеЛица");

Если СоставнойТип.СодержитТип(Тип("СправочникСсылка.Контрагенты")) Тогда

// тип допустим

КонецЕсли;

Отдельный случай — дополнительные реквизиты и сведения в типовых конфигурациях на базе БСП. Там тип значения характеристики задаётся через справочник «Дополнительные реквизиты и сведения» в пользовательском режиме, а не через конфигуратор: в карточке реквизита выбирается тип значения из предопределённого списка.

Проверка типа значения в коде

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

Если ТипЗнч(ЗначениеРеквизита) = Тип("СправочникСсылка.Номенклатура") Тогда

Артикул = ЗначениеРеквизита.Артикул;

КонецЕсли;

В запросах аналогичная проверка выполняется через ВЫРАЗИТЬ и ССЫЛКА: конструкция ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура) возвращает NULL для значений других типов, что позволяет безопасно соединять таблицы по составным полям.

Контрольные точки

Как проверить результат

Ввод значения в форме
Норма

Поле принимает только значения заданного типа, подбор работает

Тревожный признак

Поле позволяет ввести лишние типы или не даёт выбрать нужный объект

Сохранённые данные после смены типа
Норма

Старые значения читаются корректно, строки не обрезаны, числа не округлены

Тревожный признак

Часть данных потеряна или сброшена после реструктуризации

Запросы по реквизиту
Норма

Соединения и отборы работают без ошибок типов

Тревожный признак

Ошибка несовместимости типов или пустые соединения по составному полю

Типичные ошибки и ограничения

Самая частая ошибка — недостаточная длина строки или точность числа. Значение, не помещающееся в квалификаторы, при записи обрезается или округляется молча, и обнаруживается это обычно позже, при сверке данных. Перед уменьшением длины строки проверьте максимальную фактическую длину значений в базе запросом.

Вторая группа ошибок связана с датами: если выбрать состав даты «Дата» вместо «Дата и время», время будет обрезано, что ломает сортировку событий внутри дня и сравнения. Обратное изменение безопасно, сужение — нет.

Третья типичная ситуация — попытка изменить тип реквизита, по которому построены индексы, критерии отбора или который участвует в планах обмена. Такие изменения требуют проверки всех зависимых объектов: после смены типа могут перестать работать отборы, а регистрация изменений в обменах — вести себя иначе.

Типичные ошибки
01
Сужение типа без анализа данных — обрезание строк и округление чисел при реструктуризации
02
Составной тип «на всякий случай» — падение производительности запросов и необходимость ВЫРАЗИТЬ
03
Опечатка в имени типа в ОписаниеТипов — исключение только в момент выполнения кода
04
Выбор состава даты «Дата» для полей со временем — потеря временной части значений
05
Изменение типа без проверки критериев отбора и планов обмена — скрытые сбои в смежных механизмах

Частые вопросы

Можно ли изменить тип реквизита, если в базе уже есть данные?

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

Как программно узнать тип реквизита из метаданных?

Через объект метаданных: Метаданные.Справочники.Номенклатура.Реквизиты["ИмяРеквизита"].Тип вернёт объект ОписаниеТипов, из которого можно получить список типов методом Типы() и квалификаторы через свойства КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты.

Чем отличается неограниченная строка от строки фиксированной длины?

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

Как задать тип реквизиту табличной части?

Точно так же, как обычному реквизиту: раскройте ветку «Табличные части» объекта, затем «Реквизиты» нужной табличной части и откройте палитру свойств реквизита. Окно редактирования типа и квалификаторы идентичны.

Можно ли присвоить тип значения реквизиту в пользовательском режиме без конфигуратора?

Для штатных реквизитов — нет, тип задаётся только в конфигураторе. Исключение — дополнительные реквизиты и сведения в конфигурациях на БСП: их тип выбирается пользователем с правами администратора в карточке дополнительного реквизита из списка доступных типов.

Почему запрос с составным реквизитом возвращает пустые соединения?

Потому что соединение выполняется только по значениям совместимого типа. Примените ВЫРАЗИТЬ(Поле КАК Справочник.ИмяСправочника) к составному полю — тогда значения других типов станут NULL, а соединение по нужному типу заработает корректно.

Итог

Что важно запомнить

Тип реквизита задаётся в палитре свойств конфигуратора с обязательной настройкой квалификаторов; в коде — через ОписаниеТипов. Составные типы применяйте осознанно из-за влияния на запросы. Любое сужение типа проверяйте на копии базы: обрезанные данные восстановить нельзя.