Получает значение атрибута файла "Только чтение" ("Read only").
Синтаксис
ПолучитьТолькоЧтение()Полное описание, параметры и ограничения
FTPФайл.ПолучитьТолькоЧтение (FTPFile.GetReadOnly)
FTPФайл (FTPFile)
ПолучитьТолькоЧтение (GetReadOnly)
Доступен, начиная с версии 8.0.
Синтаксис:
ПолучитьТолькоЧтение()
Возвращаемое значение:
Тип: Булево.
Истина - у файла установлен атрибут "Только чтение"; Ложь - в противном случае.
Описание:
Получает значение атрибута файла "Только чтение" ("Read only").
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Примечание:
Применим только к файлам или каталогам, которые реально существуют.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Найти собственный FTP-файл, разобрать его паспорт и проверить байты
Полный учебный опыт на собственном локальном изолированном FTPS-сервере: точные реальные настройки, объекты поиска, потоковые байты и проверяемый результат; без запуска сети при подготовке справочника.
Где и как запускать
Полный клиентский общий модуль УчебныйFTP85 управляемого Windows-приложения; свой локальный FTPS и отдельный полный модуль формы вызова.
Подготовка
Новая пустая конфигурация УчебныйFTP85, платформа8.5.1.1343, управляемое приложение, тонкий или толстый Windows-клиент. Код выполняется на клиентском компьютере, не на сервере кластера и не в веб-клиенте.
Будущий ручной опыт требует вашего отдельного локального тестового FTPS-сервера на той же Windows-машине, где клиент1С. localhost означает эту машину. Не подставляйте рабочий FTP, чужой хост или production-учётные данные.
Настройте на своём сервере именно implicit FTPS на порту990, TLS для управляющего и канала данных, пассивный диапазон портов только для loopback. Не путайте FTPS с SFTP/SSH или FTPES на21.
Сервер предъявляет сертификат с именем localhost, подписанный доверенным тестовым УЦ. Источник доверия — хранилище ОС Windows клиента1С. Импорт тестового УЦ выполняется вами отдельно только после проверки; урок его не устанавливает и не отключает проверку сертификата.
Создайте отдельного пользователя ftp_lab85 с новым учебным паролем, изолированным FTP-корнем и входом в виртуальный /. Права ограничены только этим корнем; никаких символьных ссылок, junction, общих каталогов или доступа к рабочим данным.
Тестовый сервер должен возвращать POSIX-пути с прямыми слешами, точные полные имена и сведения о размере/времени/атрибутах через поддерживаемые команды. Проверка fail-closed: если конкретный сервер не сообщает эти сведения, урок не объявляется успешным.
В собственном корне вручную заранее подготовьте inbox85/sample85.txt: ровно ASCII-байты FTP-LAB85, без BOM и конечного перевода строки; размер9. Для третьего урока корень допускает создание/запись/переименование/удаление только своих ресурсов.
Квота изолированного пользователя не более1МиБ; sample85.txt мал и не меняется. Только один автор/клиент, никаких параллельных загрузок/переименований, сторонних писателей или общих имён. До ручного опыта убедитесь, что НайтиФайлы по отсутствующему точному пути возвращает пустой массив на вашем сервере.
Общие → Общие модули → УчебныйFTP85: Клиент(управляемое приложение)=Истина, Глобальный/Сервер/ВызовСервера/ВнешнееСоединение/Привилегированный=Ложь, повторное использование выключено. Один основной полный модуль урока заменяется целиком; одноимённые функции разных уроков не склеиваются.
Обработки → ЗапускFTP85 → управляемая форма Форма. Реквизиты СогласенНаЛокальныйFTP85 и Занято85 Булево исходно Ложь; ПарольУчебногоFTP85 Строка; Итог85 Строка неограниченной длины только для просмотра.
Полный дополнительный модуль формы вставьте отдельно. Команда ВыполнитьFTP85 назначена кнопке, Действие=ВыполнитьFTP85. Она вызывает клиентский УчебныйFTP85.ВыполнитьПример85(согласие,пароль). Для поля пароля включите штатное скрытое отображение в редакторе формы; не сохраняйте его в настройках/истории.
F7 и обновление только своего учебного стенда. На первом опыте сначала выберите урок паспорта, затем чтения, затем изменения. Учебный пароль вводится непосредственно перед командой, после успеха/ошибки реквизит очищается.
Урок третьего модуля действительно содержит будущие сетевые запись/переименование/удаление в своём случайном каталоге. Прочитайте код и разрешите такой опыт отдельно для своего локального стенда. Это не запуск на вашей машине в ходе наполнения справочника.
runtimeVerifiedScenarios=0: здесь не запускались1С/FTPS-сервер, не устанавливались сертификаты, не открывалась сеть, не передавались/удалялись учебные файлы и не создавались новые резервные копии или архивы.
Функция ВыполнитьПример85(Согласие, Пароль) Экспорт
Если Не Согласие Тогда
ВызватьИсключение "Нужен собственный стенд УчебныйFTP85 и согласие на локальный сетевой опыт";
КонецЕсли;
Если ТипЗнч(Пароль) <> Тип("Строка") Или СтрДлина(Пароль) = 0 Тогда
ВызватьИсключение "Введите только отдельный пароль своего локального учебного пользователя";
КонецЕсли;
Соединение = Неопределено;
Выход = Неопределено;
Попытка
Соединение = СоздатьСвоёСоединение85(Пароль);
Если Соединение.ТекущийКаталог() <> "/" Тогда
ВызватьИсключение "Ожидается свой изолированный корень /";
КонецЕсли;
Каталоги = Соединение.НайтиФайлы("/inbox85");
Если ТипЗнч(Каталоги) <> Тип("Массив") Тогда
ВызватьИсключение "Поиск должен вернуть массив настоящих FTPФайл";
КонецЕсли;
Если Каталоги.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один собственный заранее подготовленный каталог inbox85";
КонецЕсли;
Если ТипЗнч(Каталоги[0]) <> Тип("FTPФайл") Тогда
ВызватьИсключение "Нужен реальный результат FTP-поиска";
КонецЕсли;
Если Не Каталоги[0].ЭтоКаталог() Или Каталоги[0].ЭтоФайл() Тогда
ВызватьИсключение "inbox85 должен быть именно каталогом";
КонецЕсли;
Файлы = Соединение.НайтиФайлы("/inbox85", "sample85.txt", Ложь);
Если Файлы.Количество() <> 1 Тогда
ВызватьИсключение "В своём каталоге нужен один подготовленный sample85.txt";
КонецЕсли;
Файл = Файлы[0];
Если ТипЗнч(Файл) <> Тип("FTPФайл") Тогда
ВызватьИсключение "Нужен настоящий FTPФайл, не локальный Файл или структура";
КонецЕсли;
Если Не Файл.ЭтоФайл() Или Файл.ЭтоКаталог() Тогда
ВызватьИсключение "Подготовленный ресурс должен быть обычным файлом";
КонецЕсли;
Имя = Файл.Имя;
Основа = Файл.ИмяБезРасширения;
Расширение = Файл.Расширение;
Путь = Файл.Путь;
ПолноеИмя = Файл.ПолноеИмя;
Если Имя <> "sample85.txt" Или Основа <> "sample85" Или Расширение <> ".txt"
Или ПолноеИмя <> "/inbox85/sample85.txt" Тогда
ВызватьИсключение "В собственном стенде неожиданный паспорт имени файла";
КонецЕсли;
Если Путь <> "/inbox85/" И Путь <> "/inbox85" Тогда
ВызватьИсключение "Ресурс находится не в собственном ожидаемом каталоге";
КонецЕсли;
Размер = Файл.Размер();
Изменён = Файл.ПолучитьВремяИзменения();
Скрытый = Файл.ПолучитьНевидимость();
ТолькоЧтение = Файл.ПолучитьТолькоЧтение();
Если ТипЗнч(Размер) <> Тип("Число") Или Размер < 1 Или Размер > 1024
Или ТипЗнч(Изменён) <> Тип("Дата") Или ТипЗнч(Скрытый) <> Тип("Булево")
Или ТипЗнч(ТолькоЧтение) <> Тип("Булево") Тогда
ВызватьИсключение "Реальные атрибуты маленького файла не соответствуют подготовке";
КонецЕсли;
Выход = Новый ПотокВПамяти;
Соединение.Получить("/inbox85/sample85.txt", Выход);
Данные = Выход.ЗакрытьИПолучитьДвоичныеДанные();
Выход = Неопределено;
Ожидаемые = ПолучитьДвоичныеДанныеИзСтроки("FTP-LAB85", КодировкаТекста.UTF8, Ложь);
Если Данные.Размер() <> Размер Или Base64Строка(Данные) <> Base64Строка(Ожидаемые) Тогда
ВызватьИсключение "Размер и реальные байты подготовленного файла не подтверждены";
КонецЕсли;
Итог = "Имя=" + Имя + "; основа=" + Основа + "; расширение=" + Расширение
+ "; путь=" + Путь + "; полное имя=" + ПолноеИмя + "; байты=" + Строка(Размер)
+ "; изменён=" + Строка(Изменён) + "; скрытый=" + Строка(Скрытый)
+ "; только чтение=" + Строка(ТолькоЧтение) + "; содержимое="
+ ПолучитьСтрокуИзДвоичныхДанных(Данные, КодировкаТекста.UTF8);
Соединение = Неопределено;
Возврат Итог;
Исключение
Если Выход <> Неопределено Тогда
Выход.Закрыть();
КонецЕсли;
Соединение = Неопределено;
ВызватьИсключение "Чтение собственного FTP-файла не подтверждено; сырой ответ сервера и пароль не выводятся. Проверьте подготовку только своего стенда.";
КонецПопытки;
КонецФункции
Функция СоздатьСвоёСоединение85(Пароль)
ДоверенныеЦентры = Новый СертификатыУдостоверяющихЦентровОС;
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, ДоверенныеЦентры);
Прокси = Новый ИнтернетПрокси(Ложь);
Соединение = Новый FTPСоединение("localhost", 990, "ftp_lab85", Пароль,
Прокси, Истина, 15, Защита, УровеньИспользованияЗащищенногоСоединенияFTP.Требовать);
Если Соединение.Сервер <> "localhost" Или Соединение.Порт <> 990
Или Соединение.Пользователь <> "ftp_lab85" Или Не Соединение.ПассивныйРежим
Или Соединение.Таймаут <> 15 Тогда
ВызватьИсключение "Соединение не соответствует своему локальному стенду";
КонецЕсли;
Если ТипЗнч(Соединение.ЗащищенноеСоединение) <> Тип("ЗащищенноеСоединениеOpenSSL")
Или ТипЗнч(Соединение.Прокси) <> Тип("ИнтернетПрокси") Тогда
ВызватьИсключение "Нужны заданные TLS и объект прямого подключения без системного прокси";
КонецЕсли;
Если ТипЗнч(Соединение.Пароль) <> Тип("Строка") Тогда
ВызватьИсключение "Неожиданный тип параметра учётных данных";
КонецЕсли;
Если Соединение.Пароль <> Пароль Тогда
ВызватьИсключение "Учётные данные соединения не совпадают с введёнными";
КонецЕсли;
Возврат Соединение;
КонецФункцииУправляемая команда локального FTPS-опыта
УчебныйFTP85 → Обработки → ЗапускFTP85 → Формы → Форма → Модуль
Полный клиентский модуль своей управляемой формы: команда ВыполнитьFTP85, Действие=ВыполнитьFTP85, передача согласия и отдельного пароля.
&НаКлиенте
Процедура ВыполнитьFTP85(Команда)
Если Не СогласенНаЛокальныйFTP85 Или Занято85 Тогда
ВызватьИсключение "Нужно согласие на свой локальный опыт и отсутствие другого запуска";
КонецЕсли;
Занято85 = Истина;
Попытка
Итог85 = УчебныйFTP85.ВыполнитьПример85(СогласенНаЛокальныйFTP85, ПарольУчебногоFTP85);
Исключение
ПарольУчебногоFTP85 = "";
Занято85 = Ложь;
Итог85 = "Учебный FTPS-опыт не завершён. Проверьте только свой локальный стенд; детали ошибки с учётными данными не отображаются.";
ВызватьИсключение "Локальный FTPS-опыт не подтверждён";
КонецПопытки;
ПарольУчебногоFTP85 = "";
Занято85 = Ложь;
КонецПроцедурыРазбор по шагам
Создаётся настоящее согласованное локальное FTPS-соединение, исходный виртуальный корень проверяется.
Полный путь inbox85 ищет один существующий каталог; реальные ЭтоКаталог/ЭтоФайл различают каталог и файл.
Отдельный поиск каталога с точной маской sample85.txt и Ложь получает один настоящий FTPФайл без рекурсии.
Имя/основа/расширение/путь/полное имя сверяются с собственным подготовленным ресурсом.
Размер, время изменения, hidden и readonly реально читаются, типы проверяются и выводятся в осмысленном паспорте.
Получить читает ровно подготовленный небольшой файл в память; размер и Base64 представление байтов сравниваются с FTP-LAB85.
Текст декодируется UTF8, поток закрывается; локальных файлов, изменений или удаления на сервере нет.
Как проверить результат
inbox85 — каталог, sample85.txt — файл; результаты имеют реальный тип FTPФайл.
Имя sample85.txt, основа sample85, расширение .txt.
Полное имя /inbox85/sample85.txt и собственный путь подтверждены.
Фактические размер/время/hidden/readonly показаны без выдуманных значений.
Получено9 ожидаемых байтов FTP-LAB85, поток закрыт и локальный файл не создан.
Ожидаемый результат
Ожидаемый результат будущего отдельно разрешённого ручного опыта указан в проверках. Реальная1С/сеть не запускались, runtimeVerifiedScenarios=0.
На что обратить внимание
Конструктор FTPСоединение и его методы могут обратиться в сеть: это не HTTPСоединение, подготовка которого сама по себе не отправляет запрос. Отсутствие runtime-проверки не означает отсутствие сетевого эффекта при будущем ручном выполнении.
FTPS — FTP поверх TLS; это не SFTP. Пример явно использует implicit FTPS990. FTPES21 требует другой согласованной настройки сервера, не простого механического изменения порта.
ЗащищенноеСоединениеOpenSSL без источника доверенных УЦ не проверяет сертификат сервера. Здесь второй параметр — СертификатыУдостоверяющихЦентровОС; при ошибке доверия нельзя заменять его Неопределено.
Требовать защищает и команды, и данные. Авто/ИспользоватьЕслиВозможно/ТребоватьДляУправления не являются равнозначной заменой. Наличие объекта TLS в свойстве само по себе не доказывает успех рукопожатия или валидность сертификата.
ИнтернетПрокси(Ложь) не импортирует системные/inetcfg настройки. FTP-подключение через прокси поддерживает FTP over HTTP, а native FTP proxy не поддерживается. В этом loopback-уроке прокси-сервер вообще не настраивается.
ПассивныйРежим Истина выбран явно, таймаут15 секунд конечен. Порт990 без доступного пассивного диапазона не гарантирует передачу данных. Таймаут не является ограничением общего времени всего учебного цикла.
Пароль readonly доступен программно, поэтому код сравнивает его только внутри проверки и никогда не включает в результат/паспорт/сырую ошибку. Очистка реквизита не гарантирует криптографическое стирание всех копий из памяти; хранение секретов production — отдельная задача.
FTPФайл получается из настоящего НайтиФайлы, не создаётся через Новый и не читает содержимое. Его атрибуты применимы к реально существующему ресурсу; содержимое читает FTPСоединение.Получить.
Расширение в нативной справке включает точку: .txt, не txt. Путь/полное имя зависят от FTP-представления сервера; урок явно проверяет подготовленную POSIX-модель и не подставляет Windows-пути.
НайтиФайлы(полныйПуть) — поиск одного ресурса без маски. НайтиФайлы(каталог,маска,Ложь) — поиск в каталоге без рекурсии. Рекурсивный параметр игнорируется без маски; wildcard не передаётся в удаление.
Получить(адрес,поток) пишет в выходной поток; Записать(адрес,входнойПоток) читает из потока. В файловой перегрузке Записать(локальноеИмя,адрес) порядок иной. В уроках используется только вариант потоков, локальные файлы не перезаписываются.
Перед записью/переименованием/удалением проверяется собственный случайный каталог, отсутствие целевого имени, реальный файл, размер и байты с маркером. Эти проверки не являются атомарной защитой от гонки; поэтому стенд изолирован и сторонние писатели запрещены.
Предварительный размер не ограничивает поток на уровне API и может устареть. Урок годится только для своего маленького неизменяемого файла на доверенном ограниченном сервере, не для скачивания произвольного ресурса из интернета.
Переместить переименовывает ресурс на сервере; атомарная публикация/replace-семантика конкретного FTP-сервера не доказаны. Не переименовывайте поверх существующего чужого файла.
Успешный третий цикл удаляет только подтверждённый свой файл без маски, затем свой пустой каталог после выхода в /. Удаление на сервере может быть необратимым; корзина и восстановление не обещаются.
При исключении автоматического удаления или повторной записи нет: мог состояться частичный сетевой эффект. Свой run85_UUID проверяйте на собственном сервере вручную; не повторяйте чужой путь или wildcard-очистку.
Потоки закрываются и при успехе, и при ошибке. FTPСоединение не имеет угаданного Закрыть/Отключить: ссылка освобождается, точный момент завершения серверной сессии не обещается.
Чтение hidden/readonly/времени требует поддержки сервера, не подтверждает ACL и не меняет разрешения. Нельзя считать ПолучитьТолькоЧтение универсальным тестом возможности загрузки.
Все свойства FTPСоединение/FTPФайл показаны readonly. Настройка задаётся конструктором или администратором своего стенда; присваивания Сервер/Пароль/ПассивныйРежим запрещены.
Сеть,1С и GUI в ходе подготовки справочника не выполнялись: runtimeVerifiedScenarios=0. Статический тест сигнатур/поиска не доказывает совместимость конкретного FTPS-сервера.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.