Структура.Количество

Методы · Count

Получает количество элементов структуры.

Синтаксис

Количество()

Примеры платформы

Отбор.Количество();
Полное описание, параметры и ограничения

Структура.Количество (Structure.Count)

Структура (Structure)

Количество (Count)

Доступен, начиная с версии 8.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-результаты.

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

Записать JSON в новый собственный файл и прочитать его обратно

На своём отдельном файловом стенде записываем UTF-8 JSON с новым UUID-именем только в заранее подготовленный собственный каталог. Читаем тот же созданный файл и сверяем все четыре поля; чужие файлы не открываются и ничего не удаляется.

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

Полный серверный общий модуль УчебныйJSON своего пустого файлового стенда УчебныйJSONВводВывод85 и отдельный полный модуль формы. В1С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная учебная файловая база на собственном Windows-компьютере; точная платформа8.5.1.1343. Имя конфигурации УчебныйJSONВводВывод85, совместимость Не использовать, язык Русский. Нет бизнес-метаданных, расширений, подписок и заданий. Все модули пусты, кроме своего учебного модуля. Рабочие базы не используются.

  2. Конфигуратор → Общие модули → УчебныйJSON: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте ВЕСЬ основной код только выбранного урока. У разных уроков одинаковые имена процедур: не склеивайте их в одном модуле.

  3. Собственная внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма: команда Выполнить, действие Выполнить, связанная с ней кнопка; реквизиты не нужны. Весь отдельный модуль формы приведён ниже. Будущая ручная подготовка: сохранить конфигурацию, обновить конфигурацию базы (F7), открыть новый собственный тонкий клиент и свою обработку.

  4. Четыре поля пакета создаются самим кодом: sku=BOOK85, title содержит кириллицу, двойные кавычки и перевод строки, quantity — Число3, enabled — БулевоИстина. Имена ключей пригодны для Структура. Это учебный контракт, не контракт Avito или другого сервиса.

  5. ТОЛЬКО для этого файлового урока заранее вручную создайте новый собственный пустой каталог C:\1CStudy\owned-json85-6aad04c9-07f6-4540-b4ce-1e8931e2c05b. Он принадлежит только вашему учебному стенду, не является ссылкой/junction, и никто параллельно в него не пишет. Этот урок при будущем ручном запуске создаёт файл именно там; подготовка не выполнялась агентом.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Каталог = "C:\1CStudy\owned-json85-6aad04c9-07f6-4540-b4ce-1e8931e2c05b";
    СвойКаталог = Новый Файл(Каталог);
    Если Не СвойКаталог.Существует() Тогда
        ВызватьИсключение "Сначала вручную подготовьте только свой каталог учебного стенда";
    КонецЕсли;
    Если Не СвойКаталог.ЭтоКаталог() Тогда
        ВызватьИсключение "Собственный путь должен указывать на существующий каталог";
    КонецЕсли;
    Имя = Каталог + "\packet-" + Строка(Новый УникальныйИдентификатор) + ".json";
    СвойФайл = Новый Файл(Имя);
    Если СвойФайл.Существует() Тогда
        ВызватьИсключение "Существующий файл не перезаписываем";
    КонецЕсли;
    Запись = Новый ЗаписьJSON;
    Чтение = Новый ЧтениеJSON;
    ЗаписьОткрыта = Ложь;
    ЧтениеОткрыто = Ложь;
    Ошибка = "";
    Попытка
        ЗаписьОткрыта = Истина;
        Запись.ОткрытьФайл(Имя, "UTF-8", Ложь);
        ЗаписатьJSON(Запись, СвойПакетJSON());
        Запись.Закрыть();
        ЗаписьОткрыта = Ложь;
        Если Не СвойФайл.Существует() Тогда
            ВызватьИсключение "Не появился только что созданный собственный JSON-файл";
        КонецЕсли;
        Если Не СвойФайл.ЭтоФайл() Тогда
            ВызватьИсключение "Собственный результат должен быть файлом, не каталогом";
        КонецЕсли;
        ЧтениеОткрыто = Истина;
        Чтение.ОткрытьФайл(Имя, "UTF-8");
        Пакет = ПрочитатьJSON(Чтение, Ложь);
        Чтение.Закрыть();
        ЧтениеОткрыто = Ложь;
        ПроверитьСвойПакетJSON(Пакет);
    Исключение
        Ошибка = ОписаниеОшибки();
    КонецПопытки;
    ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка);
    ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка);
    Если Ошибка <> "" Тогда
        ВызватьИсключение "Свой результат или частичный файл оставлен по пути " + Имя + Символ(10) + Ошибка;
    КонецЕсли;
    Сообщить("Свой новый файл проверен и оставлен для просмотра: " + Имя);
    Сообщить("quantity — число3, enabled — булевоИстина; файлы не удалялись");
КонецПроцедуры

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

Функция СвойПакетJSON()
    Возврат Новый Структура("sku,title,quantity,enabled", "BOOK85",
        "Книга ""JSON""" + Символ(10) + "Учебная строка", 3, Истина);
КонецФункции

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

Процедура ЗакрытьСвойЧитательJSON(Чтение, ЧтениеОткрыто, Ошибка)
    Если ЧтениеОткрыто Тогда
        Попытка
            Чтение.Закрыть();
            ЧтениеОткрыто = Ложь;
        Исключение
            Ошибка = Ошибка + Символ(10) + "Закрытие своего JSON-читателя: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Процедура ЗакрытьСвойПисательJSON(Запись, ЗаписьОткрыта, Ошибка)
    Если ЗаписьОткрыта Тогда
        Попытка
            Запись.Закрыть();
            ЗаписьОткрыта = Ложь;
        Исключение
            Ошибка = Ошибка + Символ(10) + "Закрытие своего JSON-писателя: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры
УчебныйJSONВводВывод85.Форма

Своя внешняя обработка УчебныйJSONВводВывод85 → управляемая Форма → Модуль

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

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры

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

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

  1. Сначала проверяется точная пустая учебная конфигурация и подготовленный собственный каталог. ЭтоКаталог применяем только после подтверждённого Существует: в справке метод применим к реально существующим объектам.

  2. Новое имя packet-UUID.json строится внутри строго указанного собственного каталога. Код не получает имя из пользовательского/сетевого ввода и отказывается использовать уже существующий файл.

  3. ЗаписьJSON.ОткрытьФайл получает путь, строку UTF-8 и Ложь для BOM. ЗаписатьJSON пишет четыре свои поля; writer закрывается до проверки существования и обратного чтения.

  4. ЧтениеJSON.ОткрытьФайл получает ТО ЖЕ Имя, которое только что создал этот запуск. Чтение идёт на стороне собственного файлового стенда, не на произвольно выбранном компьютере клиента/кластера.

  5. ПрочитатьJSON(...,Ложь) создаёт Структура; reader закрывается, затем сравниваются все четыре поля и типы. При ошибках writer и reader закрываются независимо, сообщается полный собственный путь.

  6. Успешный файл намеренно остаётся для ручного просмотра в текстовом редакторе. Частичный файл при сбое тоже не удаляется автоматически и не объявляется корректным.

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

  1. Будущий результат: в своём каталоге появляется один новый packet-UUID.json. Только после полного обратного разбора и проверки выводится его путь и сообщение успеха.

  2. Будущий отрицательный контроль без записи: переименуйте вручную свой учебный каталог. Код должен остановиться на проверке его отсутствия ещё до ОткрытьФайл. Верните название после опыта.

  3. Будущий отрицательный контроль типов: сразу после Пакет = ПрочитатьJSON(Чтение,Ложь); добавьте Пакет.quantity = "3";. Собственный файл остаётся для просмотра, но успех не выводится. Верните исходный модуль.

  4. Здесь учебный каталог не создавался, файлы не записывались/читались через1С, данные не удалялись. Эффект описан для будущего ручного запуска только в собственном стенде.

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

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

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

  1. runtimeVerifiedScenarios=0: BSL, форма, файловые операции и сериализация в1С здесь не запускались. Проверены источники и статические контракты, а не поведение будущего клиента.

  2. JSON не сохраняет произвольные прикладные типы автоматически. Здесь только четыре скалярных значения; ссылки, даты, двоичные вложения и функции восстановления не добавляйте без отдельного контракта.

  3. Проверка разбирает известные имена, типы и полные значения, а не порядок свойств или одинаковый текст форматирования. Число3 и строка "3" для этого пакета различны.

  4. Закрытие reader и writer выполняется независимо. Исходная ошибка не теряется при ошибке освобождения второго ресурса. Сообщение об успехе появляется только после всех проверок и закрытия.

  5. ОткрытьФайл writer может перезаписать существующий путь. UUID и предварительный Существует уменьшают риск на изолированном собственном стенде, но НЕ являются атомарным режимом create-new и не защищают от конкурентной подмены. Не используйте урок как production-алгоритм безопасной записи.

  6. Каталог должен быть новым, личным, без junction/symlink и без процессов, которые подменяют файлы. Не заменяйте его общей папкой, каталогом платформы/проекта/конфигурации, рабочей базой или системным Temp.

  7. Урок рассчитан на собственную локальную файловую базу Windows. В клиент-серверном варианте серверный код обращается к файловой системе сервера и правам его службы; такой вариант здесь не предлагается.

  8. Транзакция базы не откатывает запись JSON-файла. При сбое останется частичный собственный результат; перечитывать его как успешный нельзя. Автоматического удаления, перезаписи, повторной попытки или запуска внешнего редактора в коде нет.

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

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

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

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

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