Свойства по имени: изменить только количество своей позиции

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

Для собственного объекта dot-доступ и доступ по строковому имени обращаются к одному полю. Перед изменением проверяем тип, разрешённое имя и допустимое значение.

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

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

Подготовка

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

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

Процедура ВыполнитьПример() Экспорт
    Позиция = Новый Структура("Товар,Цена,Количество", "Азбука", 250, 3);
    Сообщить(Позиция.Количество = Позиция["Количество"]);
    До = Позиция.Цена * Позиция.Количество;
    Изменено = ИзменитьУчебноеКоличество(Позиция, "Количество", 4);
    После = Позиция.Цена * Позиция["Количество"];
    Сообщить(Изменено И Позиция.Количество = 4);
    Сообщить(До = 750 И После = 1000);
    Сообщить(Не ИзменитьУчебноеКоличество(Позиция, "Цена", 1));
    Сообщить(Не ИзменитьУчебноеКоличество(Позиция, "Количество", 0));
    Сообщить(Не ИзменитьУчебноеКоличество(Позиция, "Количество", "5"));
    Сообщить(Не ИзменитьУчебноеКоличество(Позиция, "НеизвестноеПоле", 5));
    Сообщить(Позиция.Цена = 250 И Позиция.Количество = 4);
КонецПроцедуры

Функция ИзменитьУчебноеКоличество(Позиция, Знач ИмяПоля, Знач НовоеКоличество)
    Если ТипЗнч(Позиция) <> Тип("Структура") Тогда
        Возврат Ложь;
    КонецЕсли;
    Если ИмяПоля <> "Количество" Тогда
        Возврат Ложь;
    КонецЕсли;
    Если Не Позиция.Свойство(ИмяПоля) Тогда
        Возврат Ложь;
    КонецЕсли;
    Если ТипЗнч(НовоеКоличество) <> Тип("Число") Тогда
        Возврат Ложь;
    КонецЕсли;
    Если НовоеКоличество < 1 Или НовоеКоличество > 10 Или НовоеКоличество <> Цел(НовоеКоличество) Тогда
        Возврат Ложь;
    КонецЕсли;
    Позиция[ИмяПоля] = НовоеКоличество;
    Возврат Истина;
КонецФункции

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

  1. Создать известную структуру Товар/Цена/Количество и сравнить два способа чтения количества 3.

  2. Собственная функция разрешает только поле Количество. Проверка имени выполняется до [] и не позволяет строке из неизвестного источника выбирать любое поле.

  3. Свойство проверяет существование разрешённого поля. Затем тип Число проверяется до Цел и границ, поэтому строка 5 не участвует в арифметике.

  4. Количество должно быть целым от 1 до 10. После успешной проверки присвоить Позиция[ИмяПоля] = НовоеКоличество.

  5. Через точку наблюдаем то же обновлённое поле: четыре книги по 250 дают 1000 вместо 750.

  6. По отдельности попробовать запрет цены, нулевое количество, строковый ввод и неизвестное имя. Все отказные ветви возвращают Ложь до записи; исходная цена и принятое количество сохраняются.

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

  1. Восемь сообщений Истина. Единственное успешное изменение — количество с 3 на 4; итоговые поля Цена=250 и Количество=4.

  2. Попробуйте разрешённое количество 10: будет Истина и сумма 2500. Для 1.5,11 или другой структуры без поля Количество функция вернёт Ложь.

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

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

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

  1. [] не отменяет readonly или правила доступа конкретного типа. У этой собственной изменяемой структуры поле количества записываемо; это не обещание записи любого свойства платформы.

  2. Проверять поле через Структура.Свойство можно только у Структура. В функции сначала проверяется точный тип, а не предполагается наличие универсального метода у всякого объекта.

  3. Этот отказный контракт возвращает Булево и не формирует текст ошибки. Для интерактивной формы добавьте согласованную диагностику отдельно, не выдавая Ложь за успешную запись.

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

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

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

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

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