Самостоятельно создаём PDF, записываем две новые копии с пустым и учебным паролем, используем два фактических признака защиты для правильного повторного чтения.
Где и как запускать
Полный модуль собственной общей управляемой формы, тонкий либо толстый управляемый клиент; только свои данные в памяти.
Подготовка
Будущий опыт только в НОВОЙ собственной пустой файловой базе 8.5.1.1343. Имя конфигурации УчебнаяЗащитаPDF85, версия 7e03c1d2-54e1-4d2b-b98a-72e1ff37bfce, совместимость НеИспользовать, управляемое приложение. Не рабочая УТ/КА/УНФ/БП и не её копия. Здесь база и PDF не создавались, 1С не запускалась.
Общие → Общие формы → PDFПароль85: управляемая форма без основного реквизита. Создайте реквизит Выполняется85 типа Булево, скрытый от редактирования, и Результат85 типа Строка неограниченной длины с многострочным полем только просмотра. Код допускает начало только при фактическом Выполняется85=Ложь.
Команды своей формы: ПроверитьPDF85, действие ПроверитьPDF85; выведите её кнопку. Вставьте весь основной модуль ЭТОГО урока целиком. Синхронный и асинхронный варианты альтернативны: не вставляйте оба модуля с одноимёнными функциями в одну форму.
В свойствах собственной формы: СохранениеДанныхВНастройках=НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках=НеИспользовать как значения перечислений, не Булево. Не связывайте другие события, общие модули, фоновые задания, расширения или сохранение настроек.
Конфигурация → Открыть модуль управляемого приложения: вставьте отдельный полный блок ниже. F7, затем обновите только свою новую конфигурацию БД; запустите тонкий либо толстый управляемый клиент. Штатное начало работы открывает собственную форму, но не выполняет PDF-опыт.
Байты создаются только экспортом своей таблицы Книга / 3 / 250 / 750 в память. Пароль Only-own-example85-7e03c1d2 — видимая учебная константа, не пароль пользователя, не секрет и не образец выбора рабочего пароля. Она не выводится и не сохраняется в настройках.
В 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");
#Иначе
ВызватьИсключение "Запустите собственный толстый или тонкий управляемый клиент";
#КонецЕсли;
КонецПроцедурыРазбор по шагам
Нажатие настоящей команды проверяет собственное имя формы, имя команды, платформу и отсутствие незавершённого опыта. Флаг выставляется ДО первого Ждать; повторное нажатие в том же окне не начинает второй опыт.
Таблица создаёт текст собственного счёта: сумму 3×250 код вычисляет как 750. Потоковый экспорт PDF даёт реальные ДвоичныеДанные; это не подставленный Base64-файл и не уже готовый чужой документ.
Для каждой копии исходные байты читаются НОВЫМ ДокументPDF. Записать получает свой поток, пароль вторым параметром и обычный PDF третьим. Пустая и непустая строка — два разных опыта; PDF/A и подписанный документ сюда не подставляются.
Каждый признак защиты вычисляется на новом независимом потоке чтения. Его позиция изначально в начале данных. Один и тот же уже прочитанный поток для проверки/открытия не используется. Потоки явно закрываются, ДокументPDF.Закрыть не выдумывается.
Ждать возвращает Булево из Обещание; само Обещание не проверяется как Булево. Чтение и запись собственных PDF также ожидаются перед закрытием соответствующих потоков.
Проверяются оба фактических значения: обычная копия Ложь, защищённая Истина. Именно Истина управляет веткой открытия с известным собственным учебным паролем, не просто выводится без применения.
Обe новые копии действительно читаются заново, каждая на свежем потоке; количество страниц сравнивается с фактическим исходным документом. Вывод показывает наблюдаемое количество, без зашитого требования одной страницы или размера файла.
Как проверить результат
Будущая ручная проверка: F7 своего полного модуля, затем кнопка ПроверитьPDF85. После успеха строка содержит два разных признака защиты и фактическое положительное число страниц; Выполняется85 снова Ложь.
Повторное чтение защищённой копии должно пройти с её известным учебным паролем, обычной — с пустой строкой. Отказ любого настоящего вызова не считается подтверждением защиты, а завершает опыт ошибкой.
Не заменяйте проверки константами Истина/Ложь и не используйте имя расширения файла как признак защиты. Счетчик страниц должен браться из новых прочитанных документов.
При ошибке остаётся Выполняется85=Истина и сообщение об отсутствии успешного результата. Нет дальнейшего чтения, повторного RPC, восстановления настроек или очистки чужих файлов. Закройте своё окно; новая попытка допустима лишь в новом собственном окне.
Фактическая отрисовка текста, содержимое каждой страницы и стойкость шифрования здесь не проверяются. Размер байтов и одинаковое число страниц не доказывают эти свойства. 1С и GUI не запускались.
Ожидаемый результат
Ожидается настоящий путь: собственная таблица → исходный PDF → две независимо записанные версии → Ложь/Истина → правильное повторное открытие обеих и сверка страниц. Это будущий опыт, не заявленный результат запуска 1С.
На что обратить внимание
Метод проверки возвращает только наличие защиты: не пароль, не оценку криптографической стойкости, не успешность аутентификации пользователя и не заключение о цифровой подписи.
Проверка и чтение изменяют позицию потока; независимые потоки исключают скрытую зависимость от того, сколько байтов прочитал предыдущий вызов.
Новый ДокументPDF не инициализирован, пока Прочитать/ПрочитатьАсинх не завершится. Записать — процедура; результат записи получается из собственного выходного потока, а не присваиванием возвращаемого PDF.
Документ с цифровой подписью нельзя записывать с паролем этим методом: native обещает исключение. Учебный исходник не подписывается и не содержит вложений.
В этом примере нет попытки снять или подобрать чужой пароль. Известная открытая константа служит только собственной новой копии и не должна переноситься в рабочие настройки.
Если закрытие потока само завершится ошибкой, опыт также не объявляется успешным; исходное исключение может быть заменено ошибкой закрытия. Внешние ресурсы, файлы и данные базы не меняются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.