Ждать: определить пароль у двух собственных PDF и открыть копию

Учебные задачи

Самостоятельно создаём PDF, записываем две новые копии с пустым и учебным паролем, используем два фактических признака защиты для правильного повторного чтения.

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

Полный модуль собственной общей управляемой формы, тонкий либо толстый управляемый клиент; только свои данные в памяти.

Подготовка

  1. Будущий опыт только в НОВОЙ собственной пустой файловой базе 8.5.1.1343. Имя конфигурации УчебнаяЗащитаPDF85, версия 7e03c1d2-54e1-4d2b-b98a-72e1ff37bfce, совместимость НеИспользовать, управляемое приложение. Не рабочая УТ/КА/УНФ/БП и не её копия. Здесь база и PDF не создавались, 1С не запускалась.

  2. Общие → Общие формы → PDFПароль85: управляемая форма без основного реквизита. Создайте реквизит Выполняется85 типа Булево, скрытый от редактирования, и Результат85 типа Строка неограниченной длины с многострочным полем только просмотра. Код допускает начало только при фактическом Выполняется85=Ложь.

  3. Команды своей формы: ПроверитьPDF85, действие ПроверитьPDF85; выведите её кнопку. Вставьте весь основной модуль ЭТОГО урока целиком. Синхронный и асинхронный варианты альтернативны: не вставляйте оба модуля с одноимёнными функциями в одну форму.

  4. В свойствах собственной формы: СохранениеДанныхВНастройках=НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках=НеИспользовать как значения перечислений, не Булево. Не связывайте другие события, общие модули, фоновые задания, расширения или сохранение настроек.

  5. Конфигурация → Открыть модуль управляемого приложения: вставьте отдельный полный блок ниже. F7, затем обновите только свою новую конфигурацию БД; запустите тонкий либо толстый управляемый клиент. Штатное начало работы открывает собственную форму, но не выполняет PDF-опыт.

  6. Байты создаются только экспортом своей таблицы Книга / 3 / 250 / 750 в память. Пароль Only-own-example85-7e03c1d2 — видимая учебная константа, не пароль пользователя, не секрет и не образец выбора рабочего пароля. Она не выводится и не сохраняется в настройках.

  7. В PDF-опыте нет файловых путей, чужих PDF, цифровой подписи, печати, сетевых запросов или собственного серверного вызова. Штатное ОткрытьФорму может обращаться к серверу своей учебной базы: отсутствие всех внутренних обращений платформы не обещаем. Веб-клиент не выбран: у потокового экспорта ТабличныйДокумент.Записать он запрещён. Наличие окна и строковых меток не является доказательством владения средой; выбор новой собственной базы — ваша ручная подготовка.

&НаКлиенте
Асинх Процедура ПроверитьPDF85(Команда)
    Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПроверитьPDF85"
        Или ИмяФормы <> "ОбщаяФорма.PDFПароль85"
        Или ТипЗнч(Выполняется85) <> Тип("Булево") Или Выполняется85 Тогда
        ВызватьИсключение "Нужна свободная собственная форма и её настоящая команда";
    КонецЕсли;
    Выполняется85 = Истина;
    Результат85 = "Проверка ещё не завершена";
    Попытка
        Исходные = СоздатьСвоиБайтыPDF85();
        Пароль = "Only-own-example85-7e03c1d2";
        Обычные = Ждать ЗаписатьСвоюКопию85(Исходные, "");
        Защищенные = Ждать ЗаписатьСвоюКопию85(Исходные, Пароль);
        ОбычныйЗащищен = Ждать ПроверитьСвоюЗащиту85(Обычные);
        ЗащищенныйЗащищен = Ждать ПроверитьСвоюЗащиту85(Защищенные);
        Если ТипЗнч(ОбычныйЗащищен) <> Тип("Булево") Или ОбычныйЗащищен <> Ложь
            Или ТипЗнч(ЗащищенныйЗащищен) <> Тип("Булево") Или ЗащищенныйЗащищен <> Истина Тогда
            ВызватьИсключение "Не подтверждено различие защиты двух реально записанных PDF";
        КонецЕсли;
        ИсходныйДокумент = Ждать ПрочитатьСвоиБайты85(Исходные, "");
        ОбычныйДокумент = Ждать ПрочитатьСвоиБайты85(Обычные, "");
        Если ЗащищенныйЗащищен Тогда
            ЗащищенныйДокумент = Ждать ПрочитатьСвоиБайты85(Защищенные, Пароль);
        Иначе
            ВызватьИсключение "Пароль передается только своей подтверждённой защищённой копии";
        КонецЕсли;
        ИсходныхСтраниц = ИсходныйДокумент.КоличествоСтраниц();
        ОбычныхСтраниц = ОбычныйДокумент.КоличествоСтраниц();
        ЗащищенныхСтраниц = ЗащищенныйДокумент.КоличествоСтраниц();
        Если ТипЗнч(ИсходныхСтраниц) <> Тип("Число") Или ИсходныхСтраниц <= 0
            Или ТипЗнч(ОбычныхСтраниц) <> Тип("Число") Или ОбычныхСтраниц <> ИсходныхСтраниц
            Или ТипЗнч(ЗащищенныхСтраниц) <> Тип("Число") Или ЗащищенныхСтраниц <> ИсходныхСтраниц
            Или ЗащищенныйДокумент.ТипФайла <> ТипФайлаДокументаPDF.PDF Тогда
            ВызватьИсключение "Повторное чтение своей копии не сохранило число страниц и обычный тип PDF";
        КонецЕсли;
        Результат85 = "Обычная копия: защита отсутствует. Защищённая: защита обнаружена."
            + Символы.ПС + "Обе открыты нужным способом. Страниц: " + Строка(ИсходныхСтраниц)
            + Символы.ПС + "Это не проверка стойкости шифрования или внешнего вида.";
        Выполняется85 = Ложь;
    Исключение
        Выполняется85 = Истина;
        Результат85 = "Опыт не завершён. Закройте своё окно; успех и очистка после ошибки не обещаются.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция СоздатьСвоиБайтыPDF85()
    Таблица = Новый ТабличныйДокумент;
    Количество = 3;
    Цена = 250;
    Сумма = Количество * Цена;
    Таблица.Область(1, 1).Текст = "СОБСТВЕННЫЙ ОБРАЗЕЦ, НЕ ДОКУМЕНТ";
    Таблица.Область(2, 1).Текст = "Книга";
    Таблица.Область(2, 2).Текст = Строка(Количество);
    Таблица.Область(2, 3).Текст = Строка(Цена);
    Таблица.Область(2, 4).Текст = Строка(Сумма);
    Поток = Новый ПотокВПамяти;
    Попытка
        Таблица.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
        Байты = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Исключение
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Если ТипЗнч(Байты) <> Тип("ДвоичныеДанные") Или Байты.Размер() <= 0 Тогда
        ВызватьИсключение "Собственная таблица не дала настоящие PDF-байты";
    КонецЕсли;
    Возврат Байты;
КонецФункции

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

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

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

Конфигурация → Открыть модуль управляемого приложения

Модуль управляемого приложения собственного тонкого либо толстого управляемого клиента

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

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

  1. Нажатие настоящей команды проверяет собственное имя формы, имя команды, платформу и отсутствие незавершённого опыта. Флаг выставляется ДО первого Ждать; повторное нажатие в том же окне не начинает второй опыт.

  2. Таблица создаёт текст собственного счёта: сумму 3×250 код вычисляет как 750. Потоковый экспорт PDF даёт реальные ДвоичныеДанные; это не подставленный Base64-файл и не уже готовый чужой документ.

  3. Для каждой копии исходные байты читаются НОВЫМ ДокументPDF. Записать получает свой поток, пароль вторым параметром и обычный PDF третьим. Пустая и непустая строка — два разных опыта; PDF/A и подписанный документ сюда не подставляются.

  4. Каждый признак защиты вычисляется на новом независимом потоке чтения. Его позиция изначально в начале данных. Один и тот же уже прочитанный поток для проверки/открытия не используется. Потоки явно закрываются, ДокументPDF.Закрыть не выдумывается.

  5. Ждать возвращает Булево из Обещание; само Обещание не проверяется как Булево. Чтение и запись собственных PDF также ожидаются перед закрытием соответствующих потоков.

  6. Проверяются оба фактических значения: обычная копия Ложь, защищённая Истина. Именно Истина управляет веткой открытия с известным собственным учебным паролем, не просто выводится без применения.

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

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

  1. Будущая ручная проверка: F7 своего полного модуля, затем кнопка ПроверитьPDF85. После успеха строка содержит два разных признака защиты и фактическое положительное число страниц; Выполняется85 снова Ложь.

  2. Повторное чтение защищённой копии должно пройти с её известным учебным паролем, обычной — с пустой строкой. Отказ любого настоящего вызова не считается подтверждением защиты, а завершает опыт ошибкой.

  3. Не заменяйте проверки константами Истина/Ложь и не используйте имя расширения файла как признак защиты. Счетчик страниц должен браться из новых прочитанных документов.

  4. При ошибке остаётся Выполняется85=Истина и сообщение об отсутствии успешного результата. Нет дальнейшего чтения, повторного RPC, восстановления настроек или очистки чужих файлов. Закройте своё окно; новая попытка допустима лишь в новом собственном окне.

  5. Фактическая отрисовка текста, содержимое каждой страницы и стойкость шифрования здесь не проверяются. Размер байтов и одинаковое число страниц не доказывают эти свойства. 1С и GUI не запускались.

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

Ожидается настоящий путь: собственная таблица → исходный PDF → две независимо записанные версии → Ложь/Истина → правильное повторное открытие обеих и сверка страниц. Это будущий опыт, не заявленный результат запуска 1С.

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

  1. Метод проверки возвращает только наличие защиты: не пароль, не оценку криптографической стойкости, не успешность аутентификации пользователя и не заключение о цифровой подписи.

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

  3. Новый ДокументPDF не инициализирован, пока Прочитать/ПрочитатьАсинх не завершится. Записать — процедура; результат записи получается из собственного выходного потока, а не присваиванием возвращаемого PDF.

  4. Документ с цифровой подписью нельзя записывать с паролем этим методом: native обещает исключение. Учебный исходник не подписывается и не содержит вложений.

  5. В этом примере нет попытки снять или подобрать чужой пароль. Известная открытая константа служит только собственной новой копии и не должна переноситься в рабочие настройки.

  6. Если закрытие потока само завершится ошибкой, опыт также не объявляется успешным; исходное исключение может быть заменено ошибкой закрытия. Внешние ресурсы, файлы и данные базы не меняются.

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

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

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

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

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