ЭлементыГрафическойСхемы.Количество

Методы · Count

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

Синтаксис

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

ЭлементыГрафическойСхемы.Количество (GraphicalSchemaItems.Count)

ЭлементыГрафическойСхемы (GraphicalSchemaItems)

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

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

Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.

Описание:

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

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.

Использование в версии:

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

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

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

Дождаться записи и чтения карты через оповещения

Запись и чтение выполняются последовательно через два callback. Имя принадлежит только этому уроку; успешный callback сам по себе не подменяет проверку содержимого.

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

Полный модуль управляемой формы учебной обработки Windows: серверная функция, два callback, обработчик ошибки и ПередЗакрытием. Не вставляйте внутрь другого обработчика.

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

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

  6. В этой отдельной пустой конфигурации Учебная85 добавьте Задачи → УчебнаяЗадача: длина номера 9, тип Строка, автонумерация; наименование длиной 100. Добавьте реквизит Комментарий (Строка, 100), без проверки заполнения.

  7. Добавьте Бизнес-процессы → УчебныйПроцесс: длина номера 9, тип Строка, автонумерация, реквизит Комментарий (Строка, 100), без проверки заполнения. В свойстве Задача выберите УчебнаяЗадача.

  8. Карта маршрута: одна точка старта Старт → одна одиночная точка действия ПодготовитьКнигу → одна точка завершения Финиш. Соедините их стрелками; в представлении точки действия укажите Подготовить учебную книгу.

  9. Адресацию задач, групповые/условные/вложенные точки и обработчики маршрута для этой задачи не добавляйте. Модули задачи и процесса, подписки и внешние действия должны быть пустыми. Обновите конфигурацию базы данных.

  10. Все имена здесь относятся к новым учебным объектам, не к рабочей КА2/УНФ/УТ/БП. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  11. В этих упражнениях процесс не записывается и не запускается. Исследуется копия карты маршрута в памяти; печать на физический принтер не вызывается.

  12. Полный код этого урока вставьте в модуль управляемой формы учебной внешней обработки в Windows, без помещения процедур внутрь другого обработчика. Сервер возвращает только свои двоичные данные; новый процесс не записывает и не запускает.

  13. Сделайте команду ВыполнитьУрок и назначьте соответствующий клиентский обработчик из кода. Этот вариант предназначен для тонкого или толстого клиента Windows, не для веб-клиента.

  14. В свойствах управляемой формы назначьте её событие ПередЗакрытием приведённой процедуре. Сигнатура содержит четыре штатных параметра; не заменяйте её сигнатурой обычной формы.

  15. Не завершайте процесс 1С принудительно и не выбирайте выход вопреки предупреждению. При принудительном завершении callback и очистка не гарантируются; собственное имя для отдельной ручной очистки сообщается при ошибке удаления.

Перем КартаОперация;

&НаСервереБезКонтекста
Функция ПолучитьСвоюКартуБайтами()
    Если Метаданные.БизнесПроцессы.Найти("УчебныйПроцесс") = Неопределено
        Или Метаданные.Задачи.Найти("УчебнаяЗадача") = Неопределено Тогда
        ВызватьИсключение "Сначала создайте учебные процесс, задачу и карту маршрута";
    КонецЕсли;
    Процесс = БизнесПроцессы.УчебныйПроцесс.СоздатьБизнесПроцесс();
    Схема = Процесс.ПолучитьКартуМаршрута();
    Если ТипЗнч(Схема) <> Тип("ГрафическаяСхема") Тогда
        ВызватьИсключение "Учебный процесс не вернул графическую схему";
    КонецЕсли;
    Поток = Новый ПотокВПамяти;
    Попытка
        Схема.Записать(Поток);
        Байты = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Байты;
КонецФункции

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

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

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

&НаКлиенте
Процедура ОшибкаКарты(ИнформацияОбОшибке, Состояние, СтандартнаяОбработка) Экспорт
    Сообщить("Ошибка собственной операции карты: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
    ЗавершитьСвоюКарту(Состояние);
    СтандартнаяОбработка = Истина;
КонецПроцедуры

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если КартаОперация = Истина Тогда
        Отказ = Истина;
        ТекстПредупреждения = "Дождитесь завершения своей операции и очистки файла карты";
        Сообщить(ТекстПредупреждения);
    КонецЕсли;
КонецПроцедуры

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

  1. Сервер возвращает собственные байты карты; клиент читает их в отдельную схему и задаёт поле 15.

  2. Флаг КартаОперация защищает от повторного запуска. СвойФайл становится Истина только после эксклюзивного создания, резервирующий поток закрывается до НачатьЗапись.

  3. КартаЗаписана получает результат записи и дополнительные параметры. Ложь означает отказ; Неопределено не выдаётся за подтверждённую запись, содержимое проверяется чтением.

  4. НачатьЧтение вызывается только из callback завершившейся записи и получает новый пустой объект Копия.

  5. КартаПрочитана сравнивает число элементов и поле, после чего удаляет только свой файл и проверяет его отсутствие.

  6. Ошибки операции и очистки сообщаются отдельно. Итоговое сообщение успеха не появляется при неудаче удаления.

  7. ПередЗакрытием препятствует обычному закрытию при активной операции. Принудительный выход всё равно требует отдельного внимания.

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

  1. Повторное нажатие во время операции сообщает ожидание, не открывает второй писатель.

  2. При успешном завершении есть сообщение о проверенной карте и удалённом собственном файле; бизнес-процесс не записан и не запущен.

  3. При отказе или ошибке нет сообщения успеха; стандартная обработка ошибки включена, проблемы очистки не скрыты.

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

Проверена последовательность двух callback и точная очистка собственного файла.

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

  1. НачатьЧтение не вызывается сразу после НачатьЗапись: запись могла ещё выполняться.

  2. Эта файловая цепочка Windows не переносится напрямую в веб-клиент, где НачатьЧтение недоступен.

  3. Callback записи может иметь Неопределено; результат чтения и проверки содержимого важнее объявления успешной записи по одному флагу.

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

Асинхронно прочитать и записать свою схему в память

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

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

Полный модуль управляемой формы учебной обработки Windows: серверная функция и клиентская Асинх Процедура. Не вставляйте внутрь другого обработчика.

Подготовка

  1. Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.

  2. Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.

  3. Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.

  4. Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.

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

  6. В этой отдельной пустой конфигурации Учебная85 добавьте Задачи → УчебнаяЗадача: длина номера 9, тип Строка, автонумерация; наименование длиной 100. Добавьте реквизит Комментарий (Строка, 100), без проверки заполнения.

  7. Добавьте Бизнес-процессы → УчебныйПроцесс: длина номера 9, тип Строка, автонумерация, реквизит Комментарий (Строка, 100), без проверки заполнения. В свойстве Задача выберите УчебнаяЗадача.

  8. Карта маршрута: одна точка старта Старт → одна одиночная точка действия ПодготовитьКнигу → одна точка завершения Финиш. Соедините их стрелками; в представлении точки действия укажите Подготовить учебную книгу.

  9. Адресацию задач, групповые/условные/вложенные точки и обработчики маршрута для этой задачи не добавляйте. Модули задачи и процесса, подписки и внешние действия должны быть пустыми. Обновите конфигурацию базы данных.

  10. Все имена здесь относятся к новым учебным объектам, не к рабочей КА2/УНФ/УТ/БП. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  11. В этих упражнениях процесс не записывается и не запускается. Исследуется копия карты маршрута в памяти; печать на физический принтер не вызывается.

  12. Полный код этого урока вставьте в модуль управляемой формы учебной внешней обработки в Windows, без помещения процедур внутрь другого обработчика. Сервер возвращает только свои двоичные данные; новый процесс не записывает и не запускает.

  13. Сделайте команду ВыполнитьУрок и назначьте соответствующий клиентский обработчик из кода. Этот вариант предназначен для тонкого или толстого клиента Windows, не для веб-клиента.

&НаСервереБезКонтекста
Функция ПолучитьСвоюКартуБайтами()
    Если Метаданные.БизнесПроцессы.Найти("УчебныйПроцесс") = Неопределено
        Или Метаданные.Задачи.Найти("УчебнаяЗадача") = Неопределено Тогда
        ВызватьИсключение "Сначала создайте учебные процесс, задачу и карту маршрута";
    КонецЕсли;
    Процесс = БизнесПроцессы.УчебныйПроцесс.СоздатьБизнесПроцесс();
    Схема = Процесс.ПолучитьКартуМаршрута();
    Если ТипЗнч(Схема) <> Тип("ГрафическаяСхема") Тогда
        ВызватьИсключение "Учебный процесс не вернул графическую схему";
    КонецЕсли;
    Поток = Новый ПотокВПамяти;
    Попытка
        Схема.Записать(Поток);
        Байты = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Возврат Байты;
КонецФункции

&НаКлиенте
Асинх Процедура ВыполнитьУрок(Команда)
    ИсходныеДанные = ПолучитьСвоюКартуБайтами();
    ПотокЧтения = ИсходныеДанные.ОткрытьПотокДляЧтения();
    Схема = Новый ГрафическаяСхема;
    Попытка
        Ждать Схема.ПрочитатьАсинх(ПотокЧтения);
    Исключение
        ПотокЧтения.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПотокЧтения.Закрыть();
    Схема.ПолеСлева = 15;
    КоличествоИсходных = Схема.ЭлементыГрафическойСхемы.Количество();
    ПотокЗаписи = Новый ПотокВПамяти;
    Попытка
        Ждать Схема.ЗаписатьАсинх(ПотокЗаписи);
        БайтыКопии = ПотокЗаписи.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        ПотокЗаписи.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПотокКопии = БайтыКопии.ОткрытьПотокДляЧтения();
    Копия = Новый ГрафическаяСхема;
    Попытка
        Ждать Копия.ПрочитатьАсинх(ПотокКопии);
    Исключение
        ПотокКопии.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПотокКопии.Закрыть();
    Сообщить(Копия.ЭлементыГрафическойСхемы.Количество() = КоличествоИсходных);
    Сообщить(Копия.ПолеСлева = 15);
    Копия.ПолеСлева = 20;
    Сообщить(Схема.ПолеСлева = 15);
    Сообщить(Копия.ПолеСлева = 20);
КонецПроцедуры

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

  1. Серверная функция создаёт собственную карту и сериализует её в память, а не передаёт объект процесса на клиент.

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

  3. Клиент задаёт поле страницы 15 миллиметров и записывает новое значение в собственные байты.

  4. Копия создаётся отдельным конструктором и читается из независимого потока; изменение её поля на 20 не меняет исходную схему.

  5. На ошибочных путях потоки также закрываются. Ни файл, ни принтер, ни запись процесса не используются.

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

  1. Четыре сравнения Истина.

  2. Число элементов сохранено, исходное поле осталось 15, поле отдельной копии стало 20.

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

Проверены два асинхронных метода и независимый roundtrip собственной карты.

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

  1. Не закрывайте поток до завершения Ждать.

  2. ПотокВПамяти не является файлом на диске.

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

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

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

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

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