Картинка.На основании файла

Конструкторы

Создает объект и загружает картинку из указанного файла картинки. В режиме запуска "Веб-клиент" конструктор не используется.

Синтаксис

Новый Картинка(<ИмяФайла>, <ПрозрачныйФон>)

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

Картинка = Новый Картинка("C:\My Documents\My Pictures\home.gif");
Полное описание, параметры и ограничения

Картинка.На основании файла

Картинка (Picture)

На основании файла

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

Синтаксис:
Новый Картинка(<ИмяФайла>, <ПрозрачныйФон>)
Параметры:

<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, из которого будет загружена картинка.

<ПрозрачныйФон> (необязательный)
Тип: Булево.
Определяет, будет ли картинка иметь прозрачные области.
Используется только для картинок, формат которой не поддерживает прозрачности.
За цвет фона принимается цвет последнего пикселя (правый - нижний).
Значение по умолчанию: Ложь.
Описание:

Создает объект и загружает картинку из указанного файла картинки.
В режиме запуска "Веб-клиент" конструктор не используется.

Пример:

Картинка = Новый Картинка("C:\My Documents\My Pictures\home.gif");

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

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

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

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

Картинка из файла: создать собственный PNG без перезаписи и проверить обратное чтение

Свой фиксированный PNG записывается в настоящий новый временный файл через ФайловыйПоток в режиме СоздатьНовый. После закрытия потока файловый конструктор Картинка загружает именно этот путь; проверяются фактические размеры и формат. Независимое чтение файла сравнивает все его байты с исходником. Удаляется только собственный созданный файл и только на положительном пути.

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

Сервер: неглобальный общий модуль УчебнаяФайловаяКартинка85. Настоящий вход — собственная управляемая форма тонкого клиента 8.5.1.1343; файловые операции выполняются на сервере.

Подготовка

  1. Только будущая НОВАЯ пустая файловая база C:\1c-study\OwnedPictureFile85_67ba41b2\IB на своей отдельной Windows VM. Сейчас 1С и файловые операции не выполнялись. Не используйте рабочую базу, чужой каталог, файл из диалога выбора или обработку снаружи.

  2. Имя конфигурации = УчебнаяФайловаяКартинка85, Версия = 67ba41b2-f25b-4b99-94cb-99f76b8f231b, платформа = 8.5.1.1343, русский встроенный язык, Основной режим запуска = Управляемое приложение, интерфейс Такси, совместимость = НеИспользовать. Один свой пользователь и одно подключение, без расширений, регламентных заданий, подписок и других обработок. Это маркеры подготовки, не доказательство владения.

  3. До опыта владелец вручную обеспечивает лицензию, права собственного пользователя на свою обработку и доступ своего серверного сеанса к временному каталогу платформы. Для отдельного учебного стенда можно назначить собственную учебную роль с полными правами; минимальные производственные права здесь не заявляются. Временный каталог код не выбирает и не изменяет.

  4. Общие → Общие модули: создайте только УчебнаяФайловаяКартинка85. Сервер = Да, Глобальный = Нет, Вызов сервера = Нет, Привилегированный = Нет, Клиент (обычное приложение) = Нет, Клиент (управляемое приложение) = Нет, Внешнее соединение = Нет, Повторное использование возвращаемых значений = НеИспользовать. Основной код карточки вставьте ЦЕЛИКОМ. Это серверная функция собственного неглобального модуля, не прямой клиентский вызов.

  5. Обработки → Добавить: ФайловаяКартинка85. Создайте ровно одну собственную управляемую форму. Реквизиты: Согласие85 / Булево, Остановка85 / Булево, Результат85 / Строка неограниченной длины. Начальные значения в редакторе не требуются: на новом экземпляре фактически Остановка85 должна быть Ложь, код это проверяет и не сбрасывает. В свойствах формы явно задайте АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать и СохранениеДанныхВНастройках = НеИспользовать, не Булево.

  6. Добавьте флажок для Согласие85 и многострочное поле для Результат85 только для просмотра; Остановка85 не выводите. Создайте команду Проверить85, в свойстве Действие назначьте Проверить85 и добавьте связанную кнопку. В модуль формы вставьте целиком отдельный блок ФайловаяКартинка85 ниже. Обработчик принимает настоящий параметр Команда и проверяет его имя/действие; вручную его не вызывайте.

  7. В будущем проверьте конфигурацию, обновите только свою учебную базу и откройте ее в тонком клиенте. Через Функции для технического специалиста → Обработки откройте свою ФайловаяКартинка85. Никакой внешний файл изображения выбирать не нужно: в коде уже находится собственный вымышленный PNG 96×64, 175 байтов, белый фон с синим прямоугольным маркером; это не подпись и не печать организации.

  8. Перед единственным нажатием прочитайте предупреждение: опыт создаст один настоящий временный файл в своем серверном сеансе. На успешном пути он будет прочитан и удален. При ошибке файл может остаться, а закрытие потока может быть не подтверждено. Затем явно отметьте Согласие85 и нажмите Проверить85. Согласие тратится и Остановка85 устанавливается на клиенте ДО обращения на сервер; в этой форме повтор запрещен и после успеха.

Функция ПроверитьФайл85(ИсходноеСогласие) Экспорт
    Если ТипЗнч(ИсходноеСогласие) <> Тип("Булево") Или ИсходноеСогласие <> Истина Тогда
        ВызватьИсключение "Нет фактически переданного согласия на свой временный файл";
    КонецЕсли;
    Система = Новый СистемнаяИнформация;
    Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда
        ВызватьИсключение "Нужна платформа 8.5.1.1343";
    КонецЕсли;
    Исходные = Base64Значение("iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAdklEQVR42u3aQQ0AMAgEQVRUF4bQTg0Q3k06m1Mw74vWWiAABAgQIECAAAESIECAAAECBGjsZD01QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAOVABAgQIECBAgAAJECBAgAABAvQZ0AWDUh92PWgWiAAAAABJRU5ErkJggg==");
    Если ТипЗнч(Исходные) <> Тип("ДвоичныеДанные") Или Исходные.Размер() <> 175 Тогда
        ВызватьИсключение "Не собственный учебный PNG из 175 байтов";
    КонецЕсли;
    ИмяФайла = ПолучитьИмяВременногоФайла("png");
    Если ТипЗнч(ИмяФайла) <> Тип("Строка") Или ИмяФайла = "" Тогда
        ВызватьИсключение "Не получено настоящее имя временного файла";
    КонецЕсли;
    ОписаниеФайла = Новый Файл(ИмяФайла);
    Если ТипЗнч(ОписаниеФайла) <> Тип("Файл") Тогда
        ВызватьИсключение "Не получено описание собственного временного файла";
    КонецЕсли;
    ПолноеИмя = ОписаниеФайла.ПолноеИмя;
    ЕстьДо = ОписаниеФайла.Существует();
    Если ТипЗнч(ПолноеИмя) <> Тип("Строка") Или ПолноеИмя = ""
        Или ТипЗнч(ЕстьДо) <> Тип("Булево") Или ЕстьДо <> Ложь Тогда
        ВызватьИсключение "Это имя уже существует или проверка не подтверждена";
    КонецЕсли;
    НужноЗакрыть = Ложь;
    Попытка
        Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.СоздатьНовый);
        Если ТипЗнч(Поток) <> Тип("ФайловыйПоток") Тогда
            ВызватьИсключение "Не получен собственный поток нового файла";
        КонецЕсли;
        НужноЗакрыть = Истина;
        Исходные.Записать(Поток);
        НужноЗакрыть = Ложь;
        Поток.Закрыть();
        ЕстьПослеЗаписи = ОписаниеФайла.Существует();
        Если ТипЗнч(ЕстьПослеЗаписи) <> Тип("Булево") Или ЕстьПослеЗаписи <> Истина Тогда
            ВызватьИсключение "Собственный файл после записи не найден";
        КонецЕсли;
        ЭтоФайл = ОписаниеФайла.ЭтоФайл();
        Если ТипЗнч(ЭтоФайл) <> Тип("Булево") Или ЭтоФайл <> Истина Тогда
            ВызватьИсключение "Созданный объект не подтвержден как файл";
        КонецЕсли;
        Изображение = Новый Картинка(ИмяФайла, Ложь);
        Если ТипЗнч(Изображение) <> Тип("Картинка") Тогда
            ВызватьИсключение "Не получена картинка из собственного файла";
        КонецЕсли;
        Ширина = Изображение.Ширина();
        Высота = Изображение.Высота();
        Формат = Изображение.Формат();
        Если ТипЗнч(Ширина) <> Тип("Число") Или ТипЗнч(Высота) <> Тип("Число")
            Или Ширина <> 96 Или Высота <> 64
            Или ТипЗнч(Формат) <> Тип("ФорматКартинки") Или Формат <> ФорматКартинки.PNG Тогда
            ВызватьИсключение "Фактическая картинка не соответствует своему PNG 96 на 64";
        КонецЕсли;
        Прочитанные = Новый ДвоичныеДанные(ИмяФайла);
        Если ТипЗнч(Прочитанные) <> Тип("ДвоичныеДанные") Тогда
            ВызватьИсключение "Не прочитаны реальные байты собственного файла";
        КонецЕсли;
        РазмерПрочитанных = Прочитанные.Размер();
        СовпадаютБайты = Base64Строка(Прочитанные) = Base64Строка(Исходные);
        Если ТипЗнч(РазмерПрочитанных) <> Тип("Число") Или РазмерПрочитанных <> 175
            Или ТипЗнч(СовпадаютБайты) <> Тип("Булево") Или СовпадаютБайты <> Истина Тогда
            ВызватьИсключение "Байты файла не совпали с собственным исходником";
        КонецЕсли;
        Отчет = "Загружена картинка: " + Строка(Ширина) + " на " + Строка(Высота)
            + "; формат: " + Строка(Формат) + "; прочитано байтов: " + Строка(РазмерПрочитанных)
            + "; совпадение исходных байтов: " + Строка(СовпадаютБайты)
            + "; собственный путь: " + ПолноеИмя;
        Изображение = Неопределено;
        ЕстьПередУдалением = ОписаниеФайла.Существует();
        Если ТипЗнч(ЕстьПередУдалением) <> Тип("Булево") Или ЕстьПередУдалением <> Истина Тогда
            ВызватьИсключение "Собственный файл перед удалением не найден";
        КонецЕсли;
        ЭтоФайлПередУдалением = ОписаниеФайла.ЭтоФайл();
        Если ТипЗнч(ЭтоФайлПередУдалением) <> Тип("Булево") Или ЭтоФайлПередУдалением <> Истина Тогда
            ВызватьИсключение "Перед удалением не подтвержден именно собственный файл";
        КонецЕсли;
        УдалитьФайлы(ИмяФайла);
        ЕстьПослеУдаления = ОписаниеФайла.Существует();
        Если ТипЗнч(ЕстьПослеУдаления) <> Тип("Булево") Или ЕстьПослеУдаления <> Ложь Тогда
            ВызватьИсключение "Удаление собственного файла не подтверждено";
        КонецЕсли;
        Возврат Отчет + "; собственный временный файл удален: " + Строка(Не ЕстьПослеУдаления);
    Исключение
        Если НужноЗакрыть Тогда
            НужноЗакрыть = Ложь;
            Поток.Закрыть();
        КонецЕсли;
        ВызватьИсключение;
    КонецПопытки;
КонецФункции
Настоящая команда собственной формы: потратить согласие до сервера и показать проверенный отчет

Обработки → ФайловаяКартинка85 → своя управляемая форма → Модуль

Тонкий клиент: команда формы; отдельная серверная функция без контекста

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

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

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

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

  2. Сервер проверяет полученный Булево, собственные маркеры и платформу, декодирует свой PNG и подтверждает 175 байтов. ПолучитьИмяВременногоФайла дает настоящее уникальное имя, но сам файл не создает. Файл служит только для описания и наблюдения существования.

  3. Проверка отсутствия файла не является блокировкой. За отсутствие перезаписи отвечает режим СоздатьНовый: если имя уже занято, конструктор потока выдаст исключение. Исходные.Записать получает поток, не имя файла; возврат этого метода не присваивается.

  4. Поток закрывается до загрузки картинки. Картинка(ИмяФайла, Ложь) использует файловый, а не бинарный конструктор. У фактически полученной картинки считываются Ширина, Высота и Формат; нужны числовые 96/64 и настоящий ФорматКартинки.PNG.

  5. Новый ДвоичныеДанные(ИмяФайла) независимо читает файл. Требуются фактические 175 байтов и равные результаты двух Base64Строка. Оба результата имеют одинаковые MIME-переносы; сравнение не делается с литералом исходной Base64.

  6. Отчет собирается из полученных размеров, формата, длины и совпадения байтов. Затем проверяется существование именно файла, удаляется только удержанное собственное имя и снова читается Существует. Только Ложь после удаления допускает возврат успешного отчета.

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

  1. Положительный отчет содержит полученные 96 на 64, формат PNG, прочитано 175 байтов, совпадение исходных байтов и подтверждение удаления. Представления чисел и Булево могут зависеть от языка/национальных установок. Это ожидаемое ручное наблюдение в будущем стенде, не уже выполненный опыт.

  2. Картинка создана с удержанным именем временного файла и явным Ложь для прозрачного фона. Подмена на бинарный конструктор не проверяет этот пункт справочника.

  3. Прочитанные байты сравниваются с фактическими исходными ДвоичныеДанные, а не с сериализованными данными объекта Картинка. Совпадение байтов файла не означает сравнение пикселей или проверку подлинности изображения.

  4. После положительного пути Существует фактически вернул Ложь. Код не удаляет каталог, маску, пользовательский путь и не удаляет ничего в обработчике ошибки. Повтор на текущей форме запрещен.

  5. При любом отказе виден STOP, а успех не заявляется. При ошибке аварийного закрытия эта вторичная ошибка может заменить исходную; этот короткий пример не гарантирует сохранение первоначальной причины, освобождение ресурса или удаление файла.

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

Ожидаемый результат будущего опыта: собственный файл PNG успешно создан без перезаписи, загружен файловым конструктором с проверенными 96×64/PNG, прочитан обратно с точным совпадением 175 исходных байтов и удален с фактической проверкой отсутствия. В 1С код и файловые операции не выполнялись.

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

  1. ПолучитьИмяВременногоФайла не резервирует и не создает файл. Существует до записи — наблюдение, не атомарная защита. Не меняйте СоздатьНовый на Создать или ОткрытьИлиСоздать.

  2. ДвоичныеДанные.Записать(строковый путь) перезаписывает существующий файл. Здесь используется только вариант Запись в поток с собственным уже созданным ФайловыйПоток.

  3. Перед каждой первой попыткой закрытия флаг сбрасывается. Если само Закрыть выдаст ошибку, второй попытки не будет. В аварийной ветке закрывается только успешно созданный и проверенный поток, если закрытие еще не пробовали.

  4. Аварийное Закрыть может заменить исходное исключение. Урок честно сообщает это ограничение; он не обещает цепочку причин, откат, гарантированную очистку или повтор после ошибки. В catch нет чтения/записи картинки, удаления файла и восстановления.

  5. У Картинка, Файл и ДвоичныеДанные нет используемого здесь Close/Dispose. Присваивание Изображение = Неопределено не гарантирует момент освобождения внутреннего файлового доступа. Если удаление отказало, результат — STOP, не фиктивный успех.

  6. Ширина и Высота могут вернуть Неопределено для других видов картинок. Здесь проверяются настоящие числовые значения собственного одновариантного PNG; формат и размеры не берутся из подставленного ответа.

  7. Файловые конструкторы Картинка и ДвоичныеДанные не используются на веб-клиенте. Весь опыт выполняется в серверной функции; тонкий клиент получает только строку отчета, не файл и не произвольный путь от пользователя.

  8. Платформа описывает автоматическое удаление временных файлов позднее, в зависимости от режима работы. Это не немедленная очистка. При STOP свой файл может остаться; код не удаляет весь временный каталог и не предлагает автоматическую повторную попытку.

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

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

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

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

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