Создайте один новый собственный PNG без перезаписи и изучите различие между MIME по расширению, фактическими двоичными данными и реальными размерами картинки.
Где и как запускать
Полный модуль своей общей управляемой формы. Только собственная новая Windows VM/профиль, пустая файловая CF, толстый управляемый клиент 8.5.1.1343. Сервер без контекста используется только для проверки строковых имени и версии конфигурации.
Подготовка
Это будущий ручной опыт только на новой целиком собственной Windows VM с новым профилем и отдельной пустой файловой базой. Здесь 1С, создание каталога/PNG и доступ ОС не выполнялись. Не используйте рабочую базу, личные фотографии, чужие каталоги или сетевой путь.
На своём стенде создайте новую пустую файловую базу без конфигурации. В Конфигураторе у корня задайте Имя = УчебныйФайлМультимедиа85, Версия = 4e416d54-3354-46b1-bf18-dae34bd80dcb, режим совместимости Не использовать, основной режим запуска Управляемое приложение. Метка проверяет свою учебную конфигурацию, но не удостоверяет владение информационной базой.
Общие → Общие формы → добавьте управляемую ПультФайлаМультимедиа85. В форме добавьте реквизит СогласенСоздатьИПрочитать85 типа Булево и флажок, связанный с ним. Добавьте строковые ВерсияRuntime85, СвойФайл85, ТипСодержимого85, РасширениеФайла85, Состояние85; у каждого из этих строковых реквизитов задайте Длина = 0 (неограниченная), чтобы путь, MIME и сообщения не усекались. Добавьте числовые Размер85, Ширина85, Высота85, Площадь85. Выведите результаты в поля только для просмотра.
На вкладке Команды формы создайте ПроверитьСвойPNG85. В Действие назначьте клиентский обработчик ПроверитьСвойPNG85 и добавьте кнопку этой команды на форму. В событиях формы назначьте ПриОткрытии. В Модуль вставьте весь блок карточки вместо автоматически созданных пустых одноимённых обработчиков, не внутрь другой процедуры.
ПКМ по корню конфигурации → Открыть рабочую область начальной страницы → выберите собственную форму ПультФайлаМультимедиа85. F7 и Конфигурация → Проверка конфигурации: проверьте толстый управляемый клиент и сервер своей новой базы. Исправьте ошибки до опыта; этот шаг здесь не выполнялся.
В своей новой VM вручную создайте только каталог C:\OwnMultimedia85_4e416d54-3354-46b1-bf18-dae34bd80dcb. Он должен принадлежать вашему новому стенду и быть доступен вашей учётной записи. Ведите один спокойный собственный сеанс без других писателей этого каталога. Отказ ОС не обходите расширением прав.
Откройте свою новую базу толстым управляемым Windows клиентом именно 8.5.1.1343. При открытии формы флажок снят, числовые поля равны начальному 0, результаты не проверены. Native конструктор по имени файла существует с 8.3.25, но эта карточка проверяет фактическую версию 8.5.1.1343; не переносите её в веб-клиент.
Прочитайте последствия и один раз поставьте флажок: команда создаст один новый собственный PNG и прочитает его. Содержимое уже дано в коде: PNG 1×1 RGB(21,98,232), 69 байт. Камера, микрофон, проигрывание, браузер, сеть и сторонние библиотеки не нужны.
Перем ОпытНачат85, ЗакрытиеНачато85, Этап85;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ТипЗнч(Отказ) <> Тип("Булево") Или Отказ <> Ложь
Или ОпытНачат85 <> Неопределено Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ОпытНачат85 = Ложь;
ЗакрытиеНачато85 = Ложь;
Этап85 = "Готов";
СогласенСоздатьИПрочитать85 = Ложь;
ВерсияRuntime85 = "";
СвойФайл85 = "";
ТипСодержимого85 = "";
РасширениеФайла85 = "";
Размер85 = 0;
Ширина85 = 0;
Высота85 = 0;
Площадь85 = 0;
Состояние85 = "Результаты ещё не проверены. Прочитайте подготовку и последствия";
КонецПроцедуры
&НаСервереБезКонтекста
Функция СвояКонфигурация85()
Версия85 = Метаданные.Версия;
Если ТипЗнч(Версия85) <> Тип("Строка") Или Версия85 <> "4e416d54-3354-46b1-bf18-dae34bd80dcb" Тогда
ВызватьИсключение "Не совпадает собственная новая учебная конфигурация";
КонецЕсли;
Возврат Версия85;
КонецФункции
&НаКлиенте
Процедура ПроверитьФакт85(Фактическое85, Ожидаемое85)
Если ТипЗнч(Фактическое85) <> Тип("Булево") Или Фактическое85 <> Ожидаемое85 Тогда
ВызватьИсключение "Фактическое состояние собственного файла или каталога отличается";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЧисло85(Фактическое85, Ожидаемое85)
Если ТипЗнч(Фактическое85) <> Тип("Число") Или Фактическое85 <> Ожидаемое85 Тогда
ВызватьИсключение "Фактический размер или измерение собственного PNG отличается";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойPNG85(Команда)
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или ОпытНачат85 <> Ложь Или Этап85 <> "Готов" Тогда
Этап85 = "СТОП";
Состояние85 = "СТОП. Нужна своя настоящая команда; повтор опыта запрещён";
Возврат;
КонецЕсли;
Если ТипЗнч(СогласенСоздатьИПрочитать85) <> Тип("Булево") Или СогласенСоздатьИПрочитать85 <> Истина Тогда
Состояние85 = "Сначала прочитайте последствия и отдельно согласитесь на создание и чтение своего файла";
Возврат;
КонецЕсли;
ОпытНачат85 = Истина;
СогласенСоздатьИПрочитать85 = Ложь;
Этап85 = "Проверка";
Состояние85 = "Исход неизвестен: начат собственный однократный опыт";
Попытка
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если СвояКонфигурация85() <> "4e416d54-3354-46b1-bf18-dae34bd80dcb" Тогда
ВызватьИсключение "Нужны фактическая версия и собственная новая учебная CF";
КонецЕсли;
Родитель85 = Новый Файл("C:\OwnMultimedia85_4e416d54-3354-46b1-bf18-dae34bd80dcb");
ПроверитьФакт85(Родитель85.Существует(), Истина);
ПроверитьФакт85(Родитель85.ЭтоКаталог(), Истина);
ИсходныеБайты85 = Base64Значение("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR4nGMQTXoBAAHvAWBSkKSJAAAAAElFTkSuQmCC");
Если ТипЗнч(ИсходныеБайты85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Не получены реальные двоичные данные собственного PNG";
КонецЕсли;
ПроверитьЧисло85(ИсходныеБайты85.Размер(), 69);
ИсходноеПредставление85 = Base64Строка(ИсходныеБайты85);
Если ТипЗнч(ИсходноеПредставление85) <> Тип("Строка") Или ИсходноеПредставление85 = "" Тогда
ВызватьИсключение "Нет полного представления исходных собственных байтов";
КонецЕсли;
Номер85 = Новый УникальныйИдентификатор;
ИмяФайла85 = "C:\OwnMultimedia85_4e416d54-3354-46b1-bf18-dae34bd80dcb\pixel_" + Строка(Номер85) + ".png";
Файл85 = Новый Файл(ИмяФайла85);
ПроверитьФакт85(Файл85.Существует(), Ложь);
Этап85 = "Создание";
Поток85 = Новый ФайловыйПоток(ИмяФайла85, РежимОткрытияФайла.СоздатьНовый);
Если ТипЗнч(Поток85) <> Тип("ФайловыйПоток") Тогда
ВызватьИсключение "Не получен настоящий собственный файловый поток";
КонецЕсли;
ИсходныеБайты85.Записать(Поток85);
Этап85 = "Закрытие";
ЗакрытиеНачато85 = Истина;
Поток85.Закрыть();
Этап85 = "Чтение";
ПрочитанныйФайл85 = Новый Файл(ИмяФайла85);
ПроверитьФакт85(ПрочитанныйФайл85.Существует(), Истина);
ПроверитьФакт85(ПрочитанныйФайл85.ЭтоФайл(), Истина);
РазмерФайла85 = ПрочитанныйФайл85.Размер();
ПроверитьЧисло85(РазмерФайла85, 69);
Мультимедиа85 = Новый ДанныеМультимедиа(ИмяФайла85);
Если ТипЗнч(Мультимедиа85) <> Тип("ДанныеМультимедиа") Тогда
ВызватьИсключение "Файловый конструктор не дал настоящий объект мультимедиа";
КонецЕсли;
MIME85 = Мультимедиа85.ТипСодержимого;
Расширение85 = Мультимедиа85.РасширениеФайла;
Если ТипЗнч(MIME85) <> Тип("Строка") Или MIME85 = ""
Или ТипЗнч(Расширение85) <> Тип("Строка") Или Расширение85 = "" Тогда
ВызватьИсключение "Не получены реальные непустые строковые свойства мультимедиа";
КонецЕсли;
ПолученныеБайты85 = Мультимедиа85.ПолучитьДвоичныеДанные();
Если ТипЗнч(ПолученныеБайты85) <> Тип("ДвоичныеДанные") Тогда
ВызватьИсключение "Мультимедиа не вернуло реальные двоичные данные";
КонецЕсли;
РазмерДанных85 = ПолученныеБайты85.Размер();
ПроверитьЧисло85(РазмерДанных85, 69);
ПолученноеПредставление85 = Base64Строка(ПолученныеБайты85);
Если ТипЗнч(ПолученноеПредставление85) <> Тип("Строка")
Или ПолученноеПредставление85 <> ИсходноеПредставление85 Тогда
ВызватьИсключение "Полное прочитанное содержимое отличается от собственного PNG";
КонецЕсли;
Изображение85 = Новый Картинка(ПолученныеБайты85);
Если ТипЗнч(Изображение85) <> Тип("Картинка") Тогда
ВызватьИсключение "Не получена настоящая картинка из возвращённых байтов";
КонецЕсли;
ШиринаПолученная85 = Изображение85.Ширина();
ВысотаПолученная85 = Изображение85.Высота();
ПроверитьЧисло85(ШиринаПолученная85, 1);
ПроверитьЧисло85(ВысотаПолученная85, 1);
СвойФайл85 = ИмяФайла85;
ТипСодержимого85 = MIME85;
РасширениеФайла85 = Расширение85;
Размер85 = РазмерДанных85;
Ширина85 = ШиринаПолученная85;
Высота85 = ВысотаПолученная85;
Площадь85 = ШиринаПолученная85 * ВысотаПолученная85;
Этап85 = "Завершён";
Состояние85 = "Проверено: полные байты совпали, размеры получены из возвращённой картинки. Собственный файл оставлен";
#Иначе
ВызватьИсключение "Нужен свой толстый управляемый Windows клиент";
#КонецЕсли
Исключение
Если ЗакрытиеНачато85 = Истина И Этап85 = "Закрытие" Тогда
Состояние85 = "СТОП. Исход первого закрытия потока неизвестен; повторное закрытие и чтение запрещены";
Иначе
Состояние85 = "СТОП. Исход опыта и состояние ресурса неизвестны; повтор и уборка запрещены";
КонецЕсли;
Этап85 = "СТОП";
КонецПопытки;
КонецПроцедуры
Разбор по шагам
Кнопка доставляет настоящую КомандаФормы. До любых файловых операций проверяется флажок, затем согласие потребляется и отмечается начатая попытка. Отсутствие согласия не считается успешным запуском.
СистемнаяИнформация даёт фактическую версию. Серверный обработчик без контекста возвращает только реальную проверенную версию собственной конфигурации. Файлы, потоки и картинки по RPC не передаются; путь не приходит от пользователя.
Base64Значение получает собственные 69 байт. Проверяется их фактический тип/размер; Base64Строка сохраняет полное представление самого результата платформы для будущего сравнения.
Новый УникальныйИдентификатор создаёт настоящее новое имя pixel_<UUID>.png внутри своего фиксированного каталога. После проверки отсутствия имени ФайловыйПоток открывается с двумя аргументами и СоздатьНовый: уже существующий файл вызывает исключение, не перезапись.
ДвоичныеДанные.Записать получает именно фактический поток, не имя файла. Перед первым Закрыть отмечается ЗакрытиеНачато85. Закрыть — процедура без присвоенного результата. Только нормальный возврат позволяет перейти к чтению.
После закрытия свежий Файл проверяет существование, ЭтоФайл и фактические 69 байт. Новый ДанныеМультимедиа(ИмяФайла85) реально загружает файл; единственный аргумент — Строка, не ДвоичныеДанные и не неизвестный объект.
ТипСодержимого и РасширениеФайла доступны только для чтения. Их реальные непустые строки показываются без подстановки image/png или png. MIME определяется по расширению, поэтому не доказывает формат содержимого.
ПолучитьДвоичныеДанные возвращает реальные байты объекта. Сравниваются все байты через два полных результата Base64Строка, включая CR+LF; нельзя сравнивать с исходной неразбитой Base64-литералой.
Картинка создаётся именно из возвращённых байтов. Настоящие числовые ширина/высота должны быть 1, Неопределено не заменяется единицей. Площадь вычисляется из обоих фактических измерений; только после всех проверок показано Проверено.
Как проверить результат
Без флажка нажатие не создаёт и не читает файл, состояние не становится Проверено. Начальные 0 в полях не являются результатами API.
Будущий нормальный запуск: СвойФайл85 показывает новый собственный pixel_<UUID>.png; Размер85 = 69, Ширина85 = 1, Высота85 = 1, Площадь85 = 1. MIME/расширение показывают настоящие строки платформы. Файл остаётся.
Повтор кнопки в том же экземпляре даёт СТОП без повторной записи/чтения. Не вызывайте команду или ПриОткрытии вручную и не переоткрывайте форму ради обхода остановки.
На отдельном новом своём стенде отсутствие подготовленного каталога, отказ ОС, занятое имя, ошибка создания/записи/закрытия или повреждённые собственные байты не дают Проверено. Не проводите отрицательные пробы в рабочих каталогах; не подделывайте возвращённые платформой значения.
После ошибки нет чтения/повторного закрытия/записи/удаления. СТОП означает неизвестный или частичный исход, а не доказанное отсутствие файла или гарантированное освобождение ресурса.
Ожидаемый результат
При будущем успешном ручном запуске проверены полные 69 собственных байт и реальная картинка 1×1 с вычисленной площадью 1. Показаны фактические MIME/расширение; собственный новый файл оставлен. Здесь запуск в 1С не проверялся.
На что обратить внимание
Конструктор По имени файла принимает одну обязательную Строка. Другой вариант По умолчанию принимает необязательные ДвоичныеДанные, MIME и расширение; он не заменяет фактическое чтение файла в этом уроке.
ФайловыйПоток выбран по варианту С указанием режима открытия: имя и режим обязательны, необязательный третий аргумент — числовой размер буфера. Значение перечисления ДоступКФайлу третьим аргументом этого варианта не подходит. Здесь ровно два аргумента; СоздатьНовый генерирует исключение при существующем файле.
Вариант Записать с именем файла способен перезаписывать существующий файл и здесь не вызывается. Урок передаёт в Записать сам уже созданный собственный поток. Предварительная проверка Существует сама по себе не исключает одновременное вмешательство другого писателя.
Если создание/запись прерваны до первого Закрыть, ресурс и частичный файл могут остаться в неизвестном состоянии. Если сам Закрыть упал, флаг уже отмечен и повторного вызова нет. Обработчик ошибки не обращается к файловой системе, не сохраняет гарантированно первичную диагностику и не обещает освобождение ресурса; текст исключения не выводится.
Нормальное закрытие и совпавшее контрольное чтение не доказывают долговечное сохранение на носителе. Справка ФайловыйПоток описывает буферизацию и кэширование ОС. Нет гарантии отсутствия гонок, ссылок или подмены пути.
MIME по расширению не является проверкой подписи, безопасности или декодированием картинки. PNG проверяется отдельно: всё собственное содержимое совпало и реальные размеры Картинка равны 1×1.
Остановка и потреблённое согласие принадлежат текущему экземпляру формы; не обещано сохранение между закрытиями. Новый опыт возможен только после явной новой ручной подготовки своего стенда/формы, не автоматического восстановления.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.