Считывает графическую схему из файла.
Синтаксис
Прочитать(<ИмяФайла>)Прочитать(<Поток>)Примеры платформы
Схема = Новый ГрафическаяСхема;
Схема.Прочитать("C:\My Documents\Схема.grs");Полное описание, параметры и ограничения
ГрафическаяСхема.Прочитать (GraphicalSchema.Read)
ГрафическаяСхема (GraphicalSchema)
Прочитать (Read)
Доступен, начиная с версии 8.0.
Вариант синтаксиса: Из файла
Синтаксис:
Прочитать(<ИмяФайла>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла графической схемы.
Описание варианта метода:
Чтение графической схемы из файла.
Вариант синтаксиса: Из потока
Синтаксис:
Прочитать(<Поток>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для чтения графической схемы.
Описание варианта метода:
Чтение графической схемы из потока.
Описание:
Считывает графическую схему из файла.
Доступность:
Тонкий клиент, сервер, толстый клиент.
Пример:
Схема = Новый ГрафическаяСхема;
Схема.Прочитать("C:\My Documents\Схема.grs");
См. также:
ГрафическаяСхема, метод НачатьЧтение
ГрафическаяСхема, метод ПрочитатьАсинх
Использование в версии:
Доступен, начиная с версии 8.0.
Описание изменено в версии 8.3.18.
Методическая информация
Практические примеры
Дождаться записи и чтения карты через оповещения
Запись и чтение выполняются последовательно через два callback. Имя принадлежит только этому уроку; успешный callback сам по себе не подменяет проверку содержимого.
Где и как запускать
Полный модуль управляемой формы учебной обработки Windows: серверная функция, два callback, обработчик ошибки и ПередЗакрытием. Не вставляйте внутрь другого обработчика.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.
Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.
Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.
Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.
Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.
В этой отдельной пустой конфигурации Учебная85 добавьте Задачи → УчебнаяЗадача: длина номера 9, тип Строка, автонумерация; наименование длиной 100. Добавьте реквизит Комментарий (Строка, 100), без проверки заполнения.
Добавьте Бизнес-процессы → УчебныйПроцесс: длина номера 9, тип Строка, автонумерация, реквизит Комментарий (Строка, 100), без проверки заполнения. В свойстве Задача выберите УчебнаяЗадача.
Карта маршрута: одна точка старта Старт → одна одиночная точка действия ПодготовитьКнигу → одна точка завершения Финиш. Соедините их стрелками; в представлении точки действия укажите Подготовить учебную книгу.
Адресацию задач, групповые/условные/вложенные точки и обработчики маршрута для этой задачи не добавляйте. Модули задачи и процесса, подписки и внешние действия должны быть пустыми. Обновите конфигурацию базы данных.
Все имена здесь относятся к новым учебным объектам, не к рабочей КА2/УНФ/УТ/БП. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.
В этих упражнениях процесс не записывается и не запускается. Исследуется копия карты маршрута в памяти; печать на физический принтер не вызывается.
Полный код этого урока вставьте в модуль управляемой формы учебной внешней обработки в Windows, без помещения процедур внутрь другого обработчика. Сервер возвращает только свои двоичные данные; новый процесс не записывает и не запускает.
Сделайте команду ВыполнитьУрок и назначьте соответствующий клиентский обработчик из кода. Этот вариант предназначен для тонкого или толстого клиента Windows, не для веб-клиента.
В свойствах управляемой формы назначьте её событие ПередЗакрытием приведённой процедуре. Сигнатура содержит четыре штатных параметра; не заменяйте её сигнатурой обычной формы.
Не завершайте процесс 1С принудительно и не выбирайте выход вопреки предупреждению. При принудительном завершении callback и очистка не гарантируются; собственное имя для отдельной ручной очистки сообщается при ошибке удаления.
Перем КартаОперация;
&НаСервереБезКонтекста
Функция ПолучитьСвоюКартуБайтами()
Если Метаданные.БизнесПроцессы.Найти("УчебныйПроцесс") = Неопределено
Или Метаданные.Задачи.Найти("УчебнаяЗадача") = Неопределено Тогда
ВызватьИсключение "Сначала создайте учебные процесс, задачу и карту маршрута";
КонецЕсли;
Процесс = БизнесПроцессы.УчебныйПроцесс.СоздатьБизнесПроцесс();
Схема = Процесс.ПолучитьКартуМаршрута();
Если ТипЗнч(Схема) <> Тип("ГрафическаяСхема") Тогда
ВызватьИсключение "Учебный процесс не вернул графическую схему";
КонецЕсли;
Поток = Новый ПотокВПамяти;
Попытка
Схема.Записать(Поток);
Байты = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Исключение
Поток.Закрыть();
ВызватьИсключение;
КонецПопытки;
Возврат Байты;
КонецФункции
&НаКлиенте
Процедура ВыполнитьУрок(Команда)
Если КартаОперация = Истина Тогда
Сообщить("Дождитесь завершения собственной записи или чтения");
Возврат;
КонецЕсли;
ИсходныеДанные = ПолучитьСвоюКартуБайтами();
ПотокЧтения = ИсходныеДанные.ОткрытьПотокДляЧтения();
Схема = Новый ГрафическаяСхема;
Попытка
Схема.Прочитать(ПотокЧтения);
Исключение
ПотокЧтения.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПотокЧтения.Закрыть();
Схема.ПолеСлева = 15;
Состояние = Новый Структура("Схема,ИмяФайла,СвойФайл,ИсходноеКоличество", Схема, ПолучитьИмяВременногоФайла("grs"), Ложь, Схема.ЭлементыГрафическойСхемы.Количество());
ПотокФайла = Неопределено;
КартаОперация = Истина;
Попытка
ПотокФайла = Новый ФайловыйПоток(Состояние.ИмяФайла, РежимОткрытияФайла.СоздатьНовый);
Состояние.СвойФайл = Истина;
ПотокФайла.Закрыть();
ПотокФайла = Неопределено;
Оповещение = Новый ОписаниеОповещения("КартаЗаписана", ЭтотОбъект, Состояние, "ОшибкаКарты", ЭтотОбъект);
Состояние.Схема.НачатьЗапись(Оповещение, Состояние.ИмяФайла);
Исключение
Если ПотокФайла <> Неопределено Тогда
ПотокФайла.Закрыть();
КонецЕсли;
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура КартаЗаписана(Результат, Состояние) Экспорт
Попытка
Если Результат = Ложь Тогда
ВызватьИсключение "Запись собственной схемы не завершена";
КонецЕсли;
ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
Если Не ПроверкаФайла.Существует() Тогда
ВызватьИсключение "Собственного файла карты нет";
КонецЕсли;
Сообщить("Результат callback записи: " + Строка(Результат) + "; содержимое будет проверено чтением");
Состояние.Вставить("Копия", Новый ГрафическаяСхема);
Оповещение = Новый ОписаниеОповещения("КартаПрочитана", ЭтотОбъект, Состояние, "ОшибкаКарты", ЭтотОбъект);
Состояние.Копия.НачатьЧтение(Оповещение, Состояние.ИмяФайла);
Исключение
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура КартаПрочитана(Результат, Состояние) Экспорт
Попытка
Сообщить("Результат callback чтения: " + Строка(Результат));
Если Состояние.Копия.ЭлементыГрафическойСхемы.Количество() <> Состояние.ИсходноеКоличество
Или Состояние.Копия.ПолеСлева <> 15 Тогда
ВызватьИсключение "Содержимое собственной копии не совпало";
КонецЕсли;
Если Не ЗавершитьСвоюКарту(Состояние) Тогда
ВызватьИсключение "Карта прочитана, но свой временный файл не удалён";
КонецЕсли;
Сообщить("Собственная карта прочитана, структура и поле проверены, файл удалён");
Исключение
ЗавершитьСвоюКарту(Состояние);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОшибкаКарты(ИнформацияОбОшибке, Состояние, СтандартнаяОбработка) Экспорт
Сообщить("Ошибка собственной операции карты: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
ЗавершитьСвоюКарту(Состояние);
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Функция ЗавершитьСвоюКарту(Состояние)
КартаОперация = Ложь;
Попытка
Если Состояние.СвойФайл Тогда
УдалитьФайлы(Состояние.ИмяФайла);
ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
Если ПроверкаФайла.Существует() Тогда
ВызватьИсключение "Свой файл остался после удаления";
КонецЕсли;
Состояние.СвойФайл = Ложь;
КонецЕсли;
Исключение
Сообщить("Не удалось убрать только собственный файл " + Состояние.ИмяФайла + ": " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если КартаОперация = Истина Тогда
Отказ = Истина;
ТекстПредупреждения = "Дождитесь завершения своей операции и очистки файла карты";
Сообщить(ТекстПредупреждения);
КонецЕсли;
КонецПроцедурыРазбор по шагам
Сервер возвращает собственные байты карты; клиент читает их в отдельную схему и задаёт поле 15.
Флаг КартаОперация защищает от повторного запуска. СвойФайл становится Истина только после эксклюзивного создания, резервирующий поток закрывается до НачатьЗапись.
КартаЗаписана получает результат записи и дополнительные параметры. Ложь означает отказ; Неопределено не выдаётся за подтверждённую запись, содержимое проверяется чтением.
НачатьЧтение вызывается только из callback завершившейся записи и получает новый пустой объект Копия.
КартаПрочитана сравнивает число элементов и поле, после чего удаляет только свой файл и проверяет его отсутствие.
Ошибки операции и очистки сообщаются отдельно. Итоговое сообщение успеха не появляется при неудаче удаления.
ПередЗакрытием препятствует обычному закрытию при активной операции. Принудительный выход всё равно требует отдельного внимания.
Как проверить результат
Повторное нажатие во время операции сообщает ожидание, не открывает второй писатель.
При успешном завершении есть сообщение о проверенной карте и удалённом собственном файле; бизнес-процесс не записан и не запущен.
При отказе или ошибке нет сообщения успеха; стандартная обработка ошибки включена, проблемы очистки не скрыты.
Ожидаемый результат
Проверена последовательность двух callback и точная очистка собственного файла.
На что обратить внимание
НачатьЧтение не вызывается сразу после НачатьЗапись: запись могла ещё выполняться.
Эта файловая цепочка Windows не переносится напрямую в веб-клиент, где НачатьЧтение недоступен.
Callback записи может иметь Неопределено; результат чтения и проверки содержимого важнее объявления успешной записи по одному флагу.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Записать и прочитать схему через собственный файл
Файл с новым UUID сначала создаётся эксклюзивно, чтобы не перезаписать чужой. Только после этого Записать и Прочитать используют имя своего файла, а не потоки.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Создайте НОВУЮ пустую файловую учебную базу, не копию рабочего каталога. В Конфигураторе задайте корню имя Учебная85. Не добавляйте эти объекты в рабочую УТ/КА2/УНФ/БП.
Справочники → Добавить: имя УчебныеТовары. Длина кода 10, тип кода Строка, автонумерация и контроль уникальности включены, длина наименования 100.
Для УчебныеТовары включите иерархию групп и элементов. Добавьте реквизиты Артикул (Строка, длина 20) и Цена (Число, 12 цифр, 2 дробных, неотрицательное). Проверка заполнения для этих учебных реквизитов не устанавливается.
Добавьте табличную часть Штрихкоды: Штрихкод (Строка, длина 20) и Основной (Булево). Обновите конфигурацию базы данных. Модули объектов оставьте пустыми.
Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки, вызывающую ВыполнитьПример() Экспорт. Каждый фрагмент выполняйте отдельно, не склеивайте их в одну процедуру.
В этой отдельной пустой конфигурации Учебная85 добавьте Задачи → УчебнаяЗадача: длина номера 9, тип Строка, автонумерация; наименование длиной 100. Добавьте реквизит Комментарий (Строка, 100), без проверки заполнения.
Добавьте Бизнес-процессы → УчебныйПроцесс: длина номера 9, тип Строка, автонумерация, реквизит Комментарий (Строка, 100), без проверки заполнения. В свойстве Задача выберите УчебнаяЗадача.
Карта маршрута: одна точка старта Старт → одна одиночная точка действия ПодготовитьКнигу → одна точка завершения Финиш. Соедините их стрелками; в представлении точки действия укажите Подготовить учебную книгу.
Адресацию задач, групповые/условные/вложенные точки и обработчики маршрута для этой задачи не добавляйте. Модули задачи и процесса, подписки и внешние действия должны быть пустыми. Обновите конфигурацию базы данных.
Все имена здесь относятся к новым учебным объектам, не к рабочей КА2/УНФ/УТ/БП. Каждый фрагмент запускайте отдельно на сервере в ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.
В этих упражнениях процесс не записывается и не запускается. Исследуется копия карты маршрута в памяти; печать на физический принтер не вызывается.
Если Метаданные.БизнесПроцессы.Найти("УчебныйПроцесс") = Неопределено
Или Метаданные.Задачи.Найти("УчебнаяЗадача") = Неопределено Тогда
ВызватьИсключение "Сначала создайте учебные процесс, задачу и карту маршрута";
КонецЕсли;
Процесс = БизнесПроцессы.УчебныйПроцесс.СоздатьБизнесПроцесс();
Схема = Процесс.ПолучитьКартуМаршрута();
Если ТипЗнч(Схема) <> Тип("ГрафическаяСхема") Тогда
ВызватьИсключение "Учебный процесс не вернул графическую схему";
КонецЕсли;
ИмяСхемы = ПолучитьИмяВременногоФайла("grs");
СозданСвойФайл = Ложь;
ПотокФайла = Неопределено;
Попытка
ПотокФайла = Новый ФайловыйПоток(ИмяСхемы, РежимОткрытияФайла.СоздатьНовый);
СозданСвойФайл = Истина;
ПотокФайла.Закрыть();
ПотокФайла = Неопределено;
Схема.ПолеСлева = 15;
Схема.Записать(ИмяСхемы);
Копия = Новый ГрафическаяСхема;
Копия.Прочитать(ИмяСхемы);
Сообщить(Копия.ЭлементыГрафическойСхемы.Количество() = Схема.ЭлементыГрафическойСхемы.Количество());
Сообщить(Копия.ПолеСлева = 15);
Исключение
Если ПотокФайла <> Неопределено Тогда
ПотокФайла.Закрыть();
КонецЕсли;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяСхемы);
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если СозданСвойФайл Тогда
УдалитьФайлы(ИмяСхемы);
КонецЕсли;
ПроверкаФайла = Новый Файл(ИмяСхемы);
Сообщить(Не ПроверкаФайла.Существует());Разбор по шагам
Получаем своё временное имя. ФайловыйПоток.СоздатьНовый должен завершиться успешно до установки флага владения.
Закрываем резервирующий поток прежде чем Записать получает имя файла; одновременно два писателя не открываются.
ГрафическаяСхема.Записать/Прочитать имеют варианты с именем файла и с потоком. Здесь показан именно строковый вариант.
Проверяем число элементов и поле страницы на новой схеме. Это roundtrip собственного формата, не PNG.
На обеих ветках удаляется только точное собственное имя при флаге владения. В конце дополнительно проверяется отсутствие файла.
Как проверить результат
Три сообщения Истина.
Нет нового записанного процесса и не осталось собственного временного файла. Чужие файлы и каталоги не удаляются.
Ожидаемый результат
Разобраны файловые перегрузки схемы с эксклюзивным созданием и точной очисткой.
На что обратить внимание
Операции выполняются на сервере, и временный каталог принадлежит серверному процессу.
Не заменяйте собственное имя путём пользовательского существующего GRS: запись перезаписывает содержимое.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.