Проверить тип и допустимую длину артикула

Учебные задачи

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

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

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

  2. Сверяйте вывод с деревом конфигурации в Конфигураторе. Имена, длины и настройки в УНФ, КА2, БП, УТ 11 и УТ 10.3 могут различаться.

  3. Нужен справочник Номенклатура со строковым реквизитом Артикул. Если имя отличается, сначала найдите фактическое поле в Конфигураторе и измените только его имя в примере.


ОписаниеСправочника = Метаданные.Справочники.Найти("Номенклатура");
Если ОписаниеСправочника = Неопределено Тогда
    ВызватьИсключение "Нет справочника Номенклатура";
КонецЕсли;
Реквизит = ОписаниеСправочника.Реквизиты.Найти("Артикул");
Если Реквизит = Неопределено Тогда
    ВызватьИсключение "Нет реквизита Артикул; выберите существующий строковый реквизит в своей учебной базе";
КонецЕсли;
Сообщить(Реквизит.ПолноеИмя());
Сообщить(Реквизит.Представление());
Сообщить(Реквизит.Родитель());
Сообщить(СтрШаблон("%1 (%2): %3", Реквизит.Имя, Реквизит.Синоним, Реквизит.Тип));
Сообщить(Реквизит.Комментарий);
Сообщить(Реквизит.ПроверкаЗаполнения);
Сообщить(Реквизит.Использование);
Сообщить(Реквизит.МногострочныйРежим);
Сообщить(Реквизит.ЗаполнятьИзДанныхЗаполнения);
ОписаниеТипов = Реквизит.Тип;
Если Не ОписаниеТипов.СодержитТип(Тип("Строка")) Тогда
    ВызватьИсключение "Этот реквизит не допускает строку";
КонецЕсли;
Максимум = ОписаниеТипов.КвалификаторыСтроки.Длина;
Сообщить(Максимум);
АртикулИзФайла = "A-01";
Если Максимум > 0 И СтрДлина(АртикулИзФайла) > Максимум Тогда
    ВызватьИсключение "Артикул длиннее допустимого. Исправьте исходные данные, не обрезайте идентификатор";
КонецЕсли;
Сообщить("Проверка длины пройдена: " + АртикулИзФайла);

Разбор по шагам

  1. Проверяем существование обоих уровней: справочник и его реквизит.

  2. Свойство Тип возвращает ОписаниеТипов. Проверка СодержитТип подтверждает возможность строки.

  3. КвалификаторыСтроки.Длина даёт ограничение; 0 в этом квалификаторе означает неограниченную длину строки.

  4. При превышении предела отклоняем значение, а не обрезаем: два разных внешних артикула иначе могут превратиться в один.

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

  1. Полное имя заканчивается Реквизит.Артикул; длина совпадает с настройкой реквизита в Конфигураторе.

  2. При ограниченной длине задайте входящую строку длиннее предела: должна быть явная ошибка.

  3. Замените имя реквизита на отсутствующее: пример должен остановиться до чтения Тип.

Ожидаемый результат

Входящий артикул проверен по реальной структуре поля без записи номенклатуры.

На что обратить внимание

  1. Проверка длины не проверяет уникальность артикула, бизнес-правила и обязательность поля.

  2. ОписаниеТипов может быть составным: наличие строки не означает, что строка — единственный разрешённый тип.

  3. Свойство ЗначениеЗаполнения не используется как источник рабочих данных: значения по умолчанию и фактические данные — разные вещи.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.