КвалификаторыСтроки.ДопустимаяДлина

Свойства · AllowedLength

Тип: ДопустимаяДлина. Содержит вариант ограничения длины строки.

Полное описание, параметры и ограничения

КвалификаторыСтроки.ДопустимаяДлина (StringQualifiers.AllowedLength)

КвалификаторыСтроки (StringQualifiers)

ДопустимаяДлина (AllowedLength)

Доступен, начиная с версии 8.0.

Использование:
Только чтение.
Описание:
Тип: ДопустимаяДлина.
Содержит вариант ограничения длины строки.
Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Используется для строк ограниченной длины (т.е. свойство Длина имеет значение больше 0).
Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Заполнить собственный черновик структурой и проверить обязательные поля

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

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

Полный отдельный МОДУЛЬ ОБЪЕКТА Документы → УчебныйЧерновик85. ЭтотОбъект — его настоящий модульный контекст; отдельный вызывающий серверный общий модуль дан в supportingModules и подготовке. Платформа 8.5.1.1343; здесь не запускался.

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу на 8.5.1.1343. Корень конфигурации назовите УчебноеЗаполнение85. Не используйте типовую базу и не добавляйте объекты в рабочие конфигурации.

  2. Документы → Добавить → УчебныйЧерновик85. Проведение=Запретить. Не создавайте движений, табличных частей, форм, оснований ввода и дополнительных реквизитов. Историю данных выключите. Остальные прикладные объекты не добавляйте.

  3. В собственном документе создайте ровно два реквизита: Тема — единственный тип Строка, длина 40, переменная длина; Количество — единственный тип Число, разрядность 3, дробная часть 0, знак Неотрицательный.

  4. У обоих реквизитов установите в Конфигураторе Проверка заполнения=Показывать ошибку. В BSL это значение перечисления ПроверкаЗаполнения.ВыдаватьОшибку, а не выдуманное ПоказыватьОшибка.

  5. Для стандартных реквизитов документа проверка заполнения должна быть Не проверять. Код обходит Описание.СтандартныеРеквизиты и подтверждает этот контракт; если он не выполняется, исправьте только свою учебную подготовку до запуска опыта.

  6. В Документы → УчебныйЧерновик85 → Модуль объекта вставьте только основной полный code этого урока. Он содержит Перем, экспортный исполнитель, оба нативных обработчика и все вспомогательные процедуры. Не переносите его в общий модуль.

  7. Модуль менеджера документа, модули приложения/сеанса, формы документа и все прочие модули конфигурации остаются пустыми. Подписок на события, расширений конфигурации и внешних обработчиков документов нет. Код содержат только явно предоставленные модуль объекта, серверный общий модуль и модуль собственной формы запуска.

  8. Создайте общий модуль УчебныйЗапускЗаполнения85: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь; клиентские и внешнее соединение выключены; повторное использование возвращаемых значений Не использовать. Полный текст находится отдельно в supportingModules и продублирован далее.

  9. Полный вызывающий серверный общий модуль; вставьте его отдельно в Общие → Общие модули → УчебныйЗапускЗаполнения85 → Модуль:

    Процедура ВыполнитьПример() Экспорт
    ПроверитьУчебнуюСхему();
    Черновик = Документы.УчебныйЧерновик85.СоздатьДокумент();
    Черновик.ВыполнитьУчебноеЗаполнение();
    Если Не Черновик.ЭтоНовый() Тогда
    ВызватьИсключение "Собственный черновик оказался записан";
    КонецЕсли;
    Сообщить("Черновик остался в памяти: " + Черновик.Тема + ", количество " + Строка(Черновик.Количество));
    КонецПроцедуры

    Процедура ПроверитьУчебнуюСхему()
    Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
    ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
    КонецЕсли;
    Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
    Если Описание = Неопределено Тогда
    ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
    КонецЕсли;
    Свойства = Метаданные.СвойстваОбъектов;
    Если Описание.Проведение <> Свойства.Проведение.Запретить
    Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
    ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
    КонецЕсли;
    Тема = Описание.Реквизиты.Найти("Тема");
    Количество = Описание.Реквизиты.Найти("Количество");
    Если Тема = Неопределено Или Количество = Неопределено Тогда
    ВызватьИсключение "Не найдены оба собственных реквизита";
    КонецЕсли;
    Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
    ВызватьИсключение "Тема должна иметь единственный тип Строка";
    КонецЕсли;
    Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
    Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
    Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
    ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
    КонецЕсли;
    Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
    ВызватьИсключение "Количество должно иметь единственный тип Число";
    КонецЕсли;
    Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
    Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
    Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
    Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
    ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
    КонецЕсли;
    Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
    Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
    ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

  10. Обновите конфигурацию только своей учебной базы. Создайте собственную внешнюю обработку УчебныйПускЗаполнения85 с одной пустой управляемой формой Форма. В редакторе формы добавьте команду Выполнить, назначьте ей действие Выполнить и перетащите команду на форму как кнопку. В модуль формы вставьте полный отдельный текст далее и нажмите кнопку в учебной базе.

  11. Полный модуль собственной управляемой формы запуска; не переносите его в объектный или общий модуль:

    &НаКлиенте
    Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт заполнения завершён");
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()
    УчебныйЗапускЗаполнения85.ВыполнитьПример();
    КонецПроцедуры

  12. Основной code — модуль объекта; supportingModules[0].code — отдельный серверный общий модуль, supportingModules[1].code — отдельная управляемая форма запуска. Эти три контекста нельзя склеить в один исполняемый файл. ЭтотОбъект не объявляйте как локальную переменную, параметр или модульную Перем.

  13. Вызов СоздатьДокумент создаёт только свой новый объект в памяти. Заполнить и ПроверитьЗаполнение не заменяют Записать; модуль не записывает и не проводит документ. Никаких реальных документов, БД, файлов, сети, почты или печати здесь не используют.

  14. Код сверяется со справкой установленной 8.5.1.1343, но здесь в 1С не запускался. Python-модель фиксированных структур и статические валидаторы не являются выполнением событий платформы.

Перем ВызововЗаполнения;
Перем ВызововПроверки;

Процедура ВыполнитьУчебноеЗаполнение() Экспорт
    ПроверитьУчебныйЧерновик();
    Если ЭтотОбъект.Тема <> "" Или ЭтотОбъект.Количество <> 0 Тогда
        ВызватьИсключение "Исполнитель должен получить собственный новый пустой экземпляр";
    КонецЕсли;
    ВызововЗаполнения = 0;
    ВызововПроверки = 0;
    ПроверитьПолныйЧерновик("", 0);
    ПроверитьРезультатЗаполнения(Ложь, 1);
    ПроверитьОтказЗаполнения(Неопределено, "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема", "Азбука"), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", "3"), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 0), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 11), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "Азбука", 1.5), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "12345678901234567890123456789012345678901", 3), "", 0);
    ПроверитьОтказЗаполнения(Новый Структура("Тема,Количество", "", 3), "", 0);
    ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 3));
    ПроверитьПолныйЧерновик("Азбука", 3);
    ПроверитьРезультатЗаполнения(Истина, 2);
    ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 1));
    ПроверитьПолныйЧерновик("Азбука", 1);
    ПроверитьРезультатЗаполнения(Истина, 3);
    ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 10));
    ПроверитьПолныйЧерновик("Азбука", 10);
    ПроверитьРезультатЗаполнения(Истина, 4);
    ПроверитьОтказЗаполнения(Новый Структура("Тема", "Другое"), "Азбука", 10);
    ЭтотОбъект.Количество = 0;
    ПроверитьРезультатЗаполнения(Ложь, 5);
    ПроверитьПолныйЧерновик("Азбука", 0);
    ЭтотОбъект.Тема = "";
    ЭтотОбъект.Количество = 3;
    ПроверитьРезультатЗаполнения(Ложь, 6);
    ПроверитьПолныйЧерновик("", 3);
    ЭтотОбъект.Тема = "Азбука";
    ЭтотОбъект.Количество = 11;
    ПроверитьРезультатЗаполнения(Ложь, 7);
    ПроверитьПолныйЧерновик("Азбука", 11);
    ЭтотОбъект.Заполнить(Новый Структура("Тема,Количество", "Азбука", 10));
    ПроверитьРезультатЗаполнения(Истина, 8);
    ПроверитьПолныйЧерновик("Азбука", 10);
    Если ВызововЗаполнения <> 13 Или ВызововПроверки <> 8 Тогда
        ВызватьИсключение "Не совпало число реальных входов в два обработчика";
    КонецЕсли;
    Сообщить("ОбработкаЗаполнения: 13 входов; ОбработкаПроверкиЗаполнения: 8 входов");
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПроверитьУчебныйЧерновик();
    Если ВызововЗаполнения = Неопределено Тогда
        ВызововЗаполнения = 0;
    КонецЕсли;
    ВызововЗаполнения = ВызововЗаполнения + 1;
    Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
        ВызватьИсключение "Наш обработчик принимает только собственную структуру";
    КонецЕсли;
    НоваяТема = Неопределено;
    НовоеКоличество = Неопределено;
    Если Не ДанныеЗаполнения.Свойство("Тема", НоваяТема)
        Или Не ДанныеЗаполнения.Свойство("Количество", НовоеКоличество) Тогда
        ВызватьИсключение "Нужны оба свойства: Тема и Количество";
    КонецЕсли;
    Если ДанныеЗаполнения.Количество() <> 2 Тогда
        ВызватьИсключение "Наша структура должна содержать ровно два свойства";
    КонецЕсли;
    Если ТипЗнч(НоваяТема) <> Тип("Строка") Или ТипЗнч(НовоеКоличество) <> Тип("Число") Тогда
        ВызватьИсключение "Тема должна быть строкой, количество числом";
    КонецЕсли;
    Если Не ЗначениеЗаполнено(НоваяТема) Или СтрДлина(НоваяТема) > 40 Тогда
        ВызватьИсключение "Нужна непустая тема не длиннее 40 символов";
    КонецЕсли;
    Если НовоеКоличество < 1 Или НовоеКоличество > 10 Или НовоеКоличество <> Цел(НовоеКоличество) Тогда
        ВызватьИсключение "Количество нашего черновика должно быть целым от 1 до 10";
    КонецЕсли;
    ЭтотОбъект.Тема = НоваяТема;
    ЭтотОбъект.Количество = НовоеКоличество;
КонецПроцедуры

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПроверитьУчебныйЧерновик();
    Если ВызововПроверки = Неопределено Тогда
        ВызововПроверки = 0;
    КонецЕсли;
    ВызововПроверки = ВызововПроверки + 1;
    Если ПроверяемыеРеквизиты.Количество() <> 2
        Или ПроверяемыеРеквизиты.Найти("Тема") = Неопределено
        Или ПроверяемыеРеквизиты.Найти("Количество") = Неопределено Тогда
        ВызватьИсключение "Платформа должна проверить ровно собственные Тема и Количество";
    КонецЕсли;
    Если ЭтотОбъект.Количество > 10 Тогда
        Отказ = Истина;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Количество учебного черновика не должно превышать 10";
        Сообщение.Поле = "Количество";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьУчебныйЧерновик()
    ПроверитьУчебнуюСхему();
    Если ЭтотОбъект.Метаданные().Имя <> "УчебныйЧерновик85" Или Не ЭтотОбъект.ЭтоНовый() Тогда
        ВызватьИсключение "Нужен только собственный новый УчебныйЧерновик85";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьПолныйЧерновик(ОжидаемаяТема, ОжидаемоеКоличество)
    Если ЭтотОбъект.Тема <> ОжидаемаяТема Или ЭтотОбъект.Количество <> ОжидаемоеКоличество
        Или Не ЭтотОбъект.ЭтоНовый() Тогда
        ВызватьИсключение "Полный состав или новый статус собственного черновика не совпал";
    КонецЕсли;
    Сообщить("Проверен черновик: " + ЭтотОбъект.Тема + ", количество " + Строка(ЭтотОбъект.Количество));
КонецПроцедуры

Процедура ПроверитьОтказЗаполнения(НеверныеДанные, ОжидаемаяТема, ОжидаемоеКоличество)
    БылоВызовов = ВызововЗаполнения;
    Отклонено = Ложь;
    Попытка
        ЭтотОбъект.Заполнить(НеверныеДанные);
    Исключение
        Отклонено = Истина;
    КонецПопытки;
    Если Не Отклонено Или ВызововЗаполнения <> БылоВызовов + 1 Тогда
        ВызватьИсключение "Неверный ввод должен попасть в собственный обработчик и быть отклонён";
    КонецЕсли;
    ПроверитьПолныйЧерновик(ОжидаемаяТема, ОжидаемоеКоличество);
    Сообщить("Неверный ввод отклонён собственным ОбработкаЗаполнения");
КонецПроцедуры

Процедура ПроверитьРезультатЗаполнения(ОжидаемыйРезультат, ОжидаемоВызовов)
    Результат = ЭтотОбъект.ПроверитьЗаполнение();
    Если Результат <> ОжидаемыйРезультат Или ВызововПроверки <> ОжидаемоВызовов Тогда
        ВызватьИсключение "Не совпали результат проверки или число входов в событие";
    КонецЕсли;
    Сообщить("ПроверитьЗаполнение: " + Строка(Результат));
КонецПроцедуры

Процедура ПроверитьУчебнуюСхему()
    Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
        ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
    КонецЕсли;
    Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
    Если Описание = Неопределено Тогда
        ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
    КонецЕсли;
    Свойства = Метаданные.СвойстваОбъектов;
    Если Описание.Проведение <> Свойства.Проведение.Запретить
        Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
        ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
    КонецЕсли;
    Тема = Описание.Реквизиты.Найти("Тема");
    Количество = Описание.Реквизиты.Найти("Количество");
    Если Тема = Неопределено Или Количество = Неопределено Тогда
        ВызватьИсключение "Не найдены оба собственных реквизита";
    КонецЕсли;
    Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
        ВызватьИсключение "Тема должна иметь единственный тип Строка";
    КонецЕсли;
    Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
        Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
        Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
        ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
    КонецЕсли;
    Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Количество должно иметь единственный тип Число";
    КонецЕсли;
    Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
        Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
        Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
        Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
        ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
    КонецЕсли;
    Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
        Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
            ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
УчебныйЗапускЗаполнения85

Конфигуратор → Общие → Общие модули → УчебныйЗапускЗаполнения85 → Модуль

Полный отдельный серверный общий модуль УчебныйЗапускЗаполнения85; здесь не запускался.

Процедура ВыполнитьПример() Экспорт
    ПроверитьУчебнуюСхему();
    Черновик = Документы.УчебныйЧерновик85.СоздатьДокумент();
    Черновик.ВыполнитьУчебноеЗаполнение();
    Если Не Черновик.ЭтоНовый() Тогда
        ВызватьИсключение "Собственный черновик оказался записан";
    КонецЕсли;
    Сообщить("Черновик остался в памяти: " + Черновик.Тема + ", количество " + Строка(Черновик.Количество));
КонецПроцедуры

Процедура ПроверитьУчебнуюСхему()
    Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Тогда
        ВызватьИсключение "Нужна собственная пустая конфигурация УчебноеЗаполнение85";
    КонецЕсли;
    Описание = Метаданные.Документы.Найти("УчебныйЧерновик85");
    Если Описание = Неопределено Тогда
        ВызватьИсключение "Не найден собственный УчебныйЧерновик85";
    КонецЕсли;
    Свойства = Метаданные.СвойстваОбъектов;
    Если Описание.Проведение <> Свойства.Проведение.Запретить
        Или Описание.Реквизиты.Количество() <> 2 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
        ВызватьИсключение "Собственный документ должен иметь два реквизита, без проведения и табличных частей";
    КонецЕсли;
    Тема = Описание.Реквизиты.Найти("Тема");
    Количество = Описание.Реквизиты.Найти("Количество");
    Если Тема = Неопределено Или Количество = Неопределено Тогда
        ВызватьИсключение "Не найдены оба собственных реквизита";
    КонецЕсли;
    Если Тема.Тип.Типы().Количество() <> 1 Или Не Тема.Тип.СодержитТип(Тип("Строка")) Тогда
        ВызватьИсключение "Тема должна иметь единственный тип Строка";
    КонецЕсли;
    Если Тема.Тип.КвалификаторыСтроки.Длина <> 40
        Или Тема.Тип.КвалификаторыСтроки.ДопустимаяДлина <> ДопустимаяДлина.Переменная
        Или Тема.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
        ВызватьИсключение "Длина и обязательность темы отличаются от подготовки";
    КонецЕсли;
    Если Количество.Тип.Типы().Количество() <> 1 Или Не Количество.Тип.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Количество должно иметь единственный тип Число";
    КонецЕсли;
    Если Количество.Тип.КвалификаторыЧисла.Разрядность <> 3
        Или Количество.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0
        Или Количество.Тип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный
        Или Количество.ПроверкаЗаполнения <> ПроверкаЗаполнения.ВыдаватьОшибку Тогда
        ВызватьИсключение "Тип и обязательность количества отличаются от подготовки";
    КонецЕсли;
    Для Каждого СтандартныйРеквизит Из Описание.СтандартныеРеквизиты Цикл
        Если СтандартныйРеквизит.ПроверкаЗаполнения <> ПроверкаЗаполнения.НеПроверять Тогда
            ВызватьИсключение "В этом опыте автоматическая проверка включена только для Тема и Количество";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
УчебныйПускЗаполнения85.Форма

Собственная внешняя обработка УчебныйПускЗаполнения85 → Управляемая форма Форма → Модуль

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

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт заполнения завершён");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныйЗапускЗаполнения85.ВыполнитьПример();
КонецПроцедуры

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

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

  2. Отдельный серверный общий модуль выполняет эту защиту до СоздатьДокумент, затем вызывает экспортный ВыполнитьУчебноеЗаполнение у своего экземпляра. Основной текст находится в модуле объекта, поэтому ЭтотОбъект обозначает этот экземпляр.

  3. Первый ПроверитьЗаполнение получает Ложь у пустых Тема и Количество. Наш callback только считает вход и оставляет массив двух путей без изменений; незаполненность проверяет платформа по подготовленным флагам.

  4. Заполнить инициирует ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка). Переданное значение попадает в первый параметр. ТекстЗаполнения здесь не используется; стандартная обработка явно выключена.

  5. Метод Заполнить допускает произвольное основание, но собственный алгоритм принимает ровно Структура с двумя ключами Тема и Количество. Проверить наличие, типы, непробельную тему до 40 символов и целое количество 1..10 до присваивания реквизитам.

  6. Восемь неверных входов — Неопределено, отсутствие Количество, строковое число,0,11,1.5, тема длиной 41 и пустая тема — должны войти в реальный callback и вызвать исключение. После каждого оба собственных реквизита остаются пустыми.

  7. Заполнить структурой Азбука/3: проверить оба реквизита и новый статус. ПроверитьЗаполнение возвращает Истина и вызывает свой отдельный callback второй раз.

  8. Проверить нижнюю и верхнюю бизнес-границы: заполнение Азбука/1 и Азбука/10 успешно, обе проверки дают Истина. Отсутствующий ключ при уже заполненном черновике не должен частично заменить тему на Другое.

  9. Присвоить только собственному черновику Количество=0. Число 0 отличается от корректных положительных количеств, но является значением по умолчанию числового типа: автоматическая проверка обязательности возвращает Ложь.

  10. Отдельно оставить Количество=3, а Тема="": автоматическая проверка темы возвращает Ложь. Эти случаи не устанавливают Отказ в нашем обработчике и не подменяют результат произвольным булевым присваиванием.

  11. Задать собственное Количество=11 при непустой теме. Число заполнено по системной проверке; собственный ОбработкаПроверкиЗаполнения устанавливает Отказ=Истина и отправляет понятное сообщение. Метод возвращает Ложь по этому дополнительному правилу.

  12. Массив ПроверяемыеРеквизиты не очищается и не редактируется: все системные проверки остаются. Проверить наличие ровно Тема и Количество; неожиданная схема вызывает явное исключение.

  13. Последнее корректное заполнение Азбука/10 восстанавливает свои два реквизита. Проверка даёт Истина; проверить 13 реальных входов в заполнение,8 входов в проверку и новый статус. Документ остаётся без записи.

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

  1. Последовательность результатов восьми вызовов ПроверитьЗаполнение: Ложь,Истина,Истина,Истина,Ложь,Ложь,Ложь,Истина.

  2. При пустом объекте ожидаются сообщения обязательности Тема и Количество; затем отдельно при количестве 0 — сообщение Количество, при пустой теме — сообщение Тема. Точный текст системного сообщения определяется платформой.

  3. При количестве 11 ожидается собственное сообщение Количество учебного черновика не должно превышать 10; массив системно проверяемых путей сохраняется.

  4. Девять негативных попыток заполнения дают сообщения нашего отказа и сохраняют обе прежние величины. Четыре успешных заполнения дают 3,1,10,10; итог Азбука/10.

  5. Итоговые счётчики: 13 входов ОбработкаЗаполнения,8 входов ОбработкаПроверкиЗаполнения. Каждый контроль состава проверяет Тема,Количество и ЭтоНовый.

  6. Нарушьте в своей копии схемы обязательность, тип, длину или разрядность: начальная защита должна остановить сценарий до создания черновика. Изменения схемы этот модуль сам не выполняет.

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

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

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

  1. Нативное Заполнить само по себе не обещает заполнить наши поля по совпадению имён. В данном опыте весь алгоритм явно написан в ОбработкаЗаполнения, стандартная обработка выключена.

  2. СтандартнаяОбработка=Ложь не отменяет действие. Неверное основание наш callback отклоняет исключением; все проверки стоят до двух присваиваний. Это не обещание транзакционного отката при произвольной ошибке после присваивания.

  3. ОбработкаЗаполнения в установленной 8.5.1.1343 имеет три параметра. Нельзя копировать сюда встречающийся в другой конфигурации обработчик с двумя параметрами без сверки.

  4. ПроверитьЗаполнение не записывает документ и не проверяет бизнес-правила автоматически. Обязательность задана метаданными, верхняя граница 10 реализована собственным event; его Отказ связан с реальным результатом метода.

  5. ЭтотОбъект readonly: модуль читает сам контекст и меняет его собственные реквизиты, не присваивает другое значение свойству ЭтотОбъект. В общем модуле этот контекст не возникает.

  6. Сообщение связано с собственным объектом и полем Количество, однако объект не открыт в форме. Переход к конкретному полю формы и визуальное позиционирование сообщения здесь не обещаются.

  7. В исходной справке event проверки есть пример удаления путей; здесь такой алгоритм не используется. Очистка массива подавила бы системную проверку и изменила смысл урока.

  8. Условия пустых остальных модулей и отсутствия расширений задаются подготовкой нового стенда. Код проверяет доступную схему и подписки, но не анализирует тексты сторонних модулей и не выдаёт это за runtime-доказательство.

  9. Нативная справка описывает отключение безопасного режима на время этих обработчиков; пример должен выполняться только с полностью предоставленным собственным кодом в подготовленном новом стенде.

  10. Здесь выполнены только Python-модели и статическая сверка установленной справки. Счётчики событий и ожидаемые сообщения — проверки для последующего запуска в вашей учебной 1С, не уже полученные runtime-результаты.

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

Проверить определяемый тип Артикул перед загрузкой длинной строки

Ссылка на определяемый тип позволяет централизовать описание значений. Проверяем строковую составляющую и её длину, не обрезаем артикул.

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

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

Подготовка

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

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

  3. Имена объектов взяты из XML КА2 Progress: C:\claude\KA2\Progress\XML_CF_KA2_PROGRESS. Исходные XML не изменяйте. Выполняйте код только в своей учебной копии соответствующей конфигурации.

  4. В другой конфигурации предварительно найдите аналогичный объект в Конфигураторе и замените только строку имени в поиске. Отсутствие имени обрабатывается до чтения свойств; оно не доказывает отсутствие аналогичной возможности.

  5. Каждый урок запускайте отдельно. Код не вызывает бизнес-функции модулей и обработчики команд, не переключает привилегированный режим и не меняет параметры сеанса.

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

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

  1. Описание.Тип — ОписаниеТипов, а не текущее значение артикула товара.

  2. Проверяем наличие строки перед использованием строковых квалификаторов.

  3. Нулевая максимальная длина означает отсутствие этого ограничения, не строку нулевой длины.

  4. Строка примера содержит 51 символ; при ограничении 50 отклоняем её, не создавая коллизию обрезанием.

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

  1. В данном XML Артикул — строка длиной 50 с переменной допустимой длиной: последнее сравнение Ложь.

  2. Замените учебную строку на А-001: сравнение Истина, но это ещё не проверка уникальности артикула.

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

Показана предварительная проверка длины по централизованному описанию типа.

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

  1. Составной тип требует учитывать остальные допустимые типы и бизнес-правила.

  2. Этот урок не записывает товар и не выполняет автоматическое приведение с усечением.

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

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

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

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

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