Ситуация:
1. Конструкторский отдел разрабатывает документацию планируемых к производству изделий, сохраняет документацию в PDF формате и помещает в специальное хранилище не доступное для общего пользователя.
2. Старт экспериментального производства нового изделия определяется созданием документа «План».
3. После принятия «Плана» к исполнению, документация по изделию, включенному в «План», помещается в общедоступный для исполнителей каталог на сервере предприятия.
4. Одновременно в составе месячного запуска к производству могут быть от 20 до 60 «Планов». Соответственно на каждый план могут быть сформированы комплекты конструкторской документации в PDF формате на изделие в целом или в целом и на сборочные единицы.
5. Один файл комплекта документации может содержать до 200 страниц PDF чертежей и спецификаций различного формата.
6. На этом этапе конструкторская документация с помощью общедоступных средств просмотра файлов PDF формата может быть украдена любым доступным способом (скопирована, сохранена как, распечатана, украдена через снимок экрана, отправлена на… и т.д.).
Какая задача поставлена:
1. Каждый лист документации должен быть маркирован водяным знаком.
2. Водяной знак должен содержать информацию об идентификации предприятия разработчика.
3. Водяной знак должен иметь идентификацию рабочего места, на котором он будет использоваться.
4. Водяной знак должен предполагать цветное отображение, иметь возможность управления углом поворота текста и размером шрифта текстовых записей.
5. Водяной знак должен предполагать размещения в качестве маркера, логотип из внешнего графического файла, с определением степени прозрачности.
6. Водяной знак должен наноситься автоматически на каждый лист документации в PDF формате.
7. Программа просмотра файлов PDF формата должна запускаться в командном режиме.
8. Программа просмотра файлов PDF формата должна иметь средства масштабирования изображения или авто масштабирования.
9. Программа просмотра файлов PDF формата не должна иметь никаких общедоступных средств сохранения документации в целом или отдельных ее страниц в виде внешних файлов, не должна предполагать печать документации, снимок экрана средствами Windows.
10. Файлы документации, после обработки программными средствами маркировки водяными знаками, должны потерять ассоциацию с PDF форматом, но оставаться PDF файлами.
Для устранения проблемы фотографирования на мобильные устройства экрана рабочего места оператора (пользователя), администрация использует системы видеонаблюдения за каждым рабочим местом.
Заказчику было предложено двухкомпонентное решение поставленной задачи.
Первый компонент WaterMark.exe обеспечивает нанесение водяных знаков на каждый лист PDF файла конструкторской документации.
Основные комментарии будут относиться к методологии решения данной задачи в версии 7.7. программных продуктов 1С, т.к. ничего существенного, рабочего, я не нашел… Применить аналогичные технологии в версии 8.3, думаю, сможет каждый, возможно с некоторыми различиями по интерфейсу.
Итак:
WaterMark.exe можно запускать на исполнение двойным кликом мышки по приложению, или из командной строки. Непосредственный запуск
WaterMark.exe позволяет произвести настройку приложения, которая будет повторяться автоматически при всех последующих запусках уже из командной строки.
Запустим приложение:
Интуитивно понятно, что мы хотим получить в качестве водяного знака.
Выбираем размер шрифта, сам шрифт, угол наклона в 45 градусов и количество рабочих мест, куда будут выводиться персональные PDF файлы документации.
В каталог с PDF файлами поместил тестовые файлы документации.
Число до нижнего прочерка, это номер «Плана» производства.
Дальше наименование изделия или сборочной единицы по «Плану».
Запускаем «Выполнить».
Временные параметры выполнения операций по преобразованию PDF файлов зависят от количества страниц в обрабатываем файле.
8506_ЧИ-Изделие рабочее.pdf – 166 страниц.
8655_ЧИ -Труба.pdf – 34 страницы.
8655_ЧК -Труба.pdf – 1 страница.
Т.к. документацию планируется использовать на конкретном рабочем месте, а этих рабочих мест 5 (пять), то и результат обработки содержит по пять нумерованных файлов.
Это, по прежнему PDF файлы, но немного переименованные.
Переименовали их для исключения повторной обработки.
Файл без водяных знаков получил расширение *.bak, а файл персонализации по рабочему месту, *.(номер рабочего места).
Для увеличения степени защиты PDF файлов можно провести повторную обработку файлов изменив размер шрифта и угол поворота надписи водяного знака.
Понятно, что в этой ситуации нужно вернуть обработанным файлам расширение *.pdf и убрать все версии для рабочих мест.
Что содержит одна из страниц нумерованного файла 4?
Что выдаст WaterMark.exe при повторном ручном запуске?
Программа сохранила настройки и завершила работу, т.к. в каталоге PDF файлов не нашла ни одного файла с расширением *.pdf.
Запуск приложения в командном режиме:
1) D:\1CDB\ish\WaterMark\watermark "ROGAi KOPYTA" D:\1CDB\ish\WaterMark\5
(Путь и имя приложения) _ (Содержание водяного знека)_(Путь к каталогу PDF файлов)(Количество рабочих мест).
2) D:\1CDB\ish\WaterMark\watermark – auto.
В первом варианте управление обработкой определяется полностью по настройкам, передаваемым в командной строке.
Во втором случае приложение работает по сохраненным настройкам описанным выше.
Для 1С 7.7 задача сводится к требованию:
отследить появление в предопределенном каталоге файла с расширением *.pdf. Как только WaterMark.exe обнаруживает файл с таким расширением, по сохраненной настройке, он будет снабжен водяными знаками и переименован в версии для планируемых рабочих мест.
Помещаем в предопределенную процедуру (1С 7.7 ...7.70.027) ПриНачалеРаботыСистемы() строку:
ОбработкаОжидания("ДиспетчерЗадач", 600);
В процедуру ДиспетчерЗадач() добавляем строку запуска нашего приложения типа:
ЗапуститьПриложение(КаталогИБ()+"\ish\WaterMark\WaterMark.exe "+"""ROGAi KOPYTA"""+" D:\1CDB\ish\WaterMark\ 5");
или
ЗапуститьПриложение(КаталогИБ()+"\ish\WaterMark\WaterMark.exe -auto");
Один раз в 10 минут будет запускаться WaterMark.exe и искать не обработанные PDF файлы, снабжая их водяными знаками.
Чтобы не терроризировать пользователей регулярным запуском приложения, его можно замкнуть на виртуального пользователя.
Создайте пользователя в 1С с административными правами и любым интерфейсом (он ему не понадобится), например («Помощник») «Pom».
Создайте на сервере командный файл Pom.bat, следующего содержания:
@echo off
d: cd D:\1Cdb\ish\
wscript Pom.vbs /b /h:wscript
(это обычный текстовый файл, просто измените его расширение на *.bat).
Поместите в свой каталог на подобии «D:\1Cdb\ish».
В этот же каталог поместите файл скрипта.
Обычный текстовый файл с заменой расширения на Pom.vbs.
dim err_code
sub my()
Dim v7
Dim s_path
Dim s_user
Dim s_pass
Dim s_report
Dim s_context
s_path = "D:\1Cdb\"
s_user = "Pom"
s_pass = "1234"
s_report="D:\1Cdb\ExtForms\Pom.ert"
s_context = "Run"
Set v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/D" & s_path & " /N" & s_user & " /P" & s_pass, "NO_SPLASH_SHOW")
if not result then
msgbox ="1C no start!"
exit sub
end if
err_code = 0
end sub
err_code = 255
my()
wscript.Quit(err_code)
Этим скриптом мы запускаем внешнюю обработку, созданную в 1С 7.7, Pom.ert.
В форме обработки одна кнопка «Закрыть».
Текст обработки (1С 7.7 .... 7.70.027):
//................................................................Е.И.
Процедура Сформировать()
ЗапуститьПриложение(КаталогИБ()+"\ish\WaterMark\WaterMark.exe -auto");
НайденФайл=ФС.НайтиПервыйФайл(КаталогИБ()+"\ish\WaterMark\*.pdf");
Пока ПустаяСтрока(НайденФайл) = 0 Цикл
НайденФайл=ФС.НайтиСледующийФайл();
КонецЦикла;
Если ПустаяСтрока(НайденФайл) = 1 Тогда
Тик = 0; // количество минут до завершения работы системы
ЗавершитьРаботуСистемы(0);
КонецЕсли;
КонецПроцедуры
//................................................................Е.И.
Процедура ПриОткрытии()
Сформировать();
Форма.Закрыть();
КонецПроцедуры
//................................................................Е.И.
Просим системного администратора запланировать запуск на сервере 4 – 6 – 8 -10… заданий по командному файлу Pom.bat с временным перерывом на завершение работы WaterMark.exe.
Следует понимать, что сеансы работы пользователя «Pom», пароль «1234», не должны перекрываться по времени обработки всех PDF файлов, для всех рабочих мест.
PDF файлы не должны содержать больше, приблизительно 200 страниц.
В противном случае, для терминальной сессии, можно получить сообщение о недостатке памяти.
Чтобы произвести обработку в 2 этапа, с водяным знаком, в разных цветах, и с разной степенью прозрачности, переименовываем уже обработанный файл для рабочего места 1 из «8655_ЧК -Труба.pdf.1» в «8655_ЧК -Труба.pdf».
Теперь он подлежит повторной обработке.
Результат двухэтапной обработки PDF файла.
Попытаемся добавить логотип некоей компании. Это могут быть файлы с расширением *.bmp, *.png, *.jpg.
Диалоговая форма приложения:
Результат добавления логотипа:
Сделано всё (ну почти всё) для обозначения своего авторского права на документацию.
Перейдем ко второму приложению.
Оно необходимо для просмотра PDF изображений деталей и сборочных единиц на экране монитора и ВСЁ.
Приложение PDFView.exe.
Инструментарий приложения интуитивно понятен.
Сохранять, сохранять как, выделить и копировать, экранные ножницы, Prt.Scr (снимок экрана), печать … недоступны.
Фотографирование с помощью внешних устройств будет содержать водяной знак на изображении.
Требования…
- 1С 7.7 должна обеспечить правильную выборку документации в привязке к конкретному рабочему месту и конкретному «Плану».
- PDFView.exe должен читать файлы с именем типа «8655_ЧК -Труба.pdf.1».
- Если документация некоего изделия состоит из множества PDF файлов, то у пользователя должен быть инструмент выбора конкретного файла.
- Пользователю должны быть недоступны любые разделы интерфейса 1С, кроме меню обработки запуска просмотра PDF файлов.
Идем по ранее описанному пути:
1. Создаём 5 пользователей 1С с административными правами и именем «Post1», «Post2», «Post3», «Post4», «Post5», и паролями, которые сложно забыть, типа «1111», «2222» и т.д. Пользователю они не доступны и используются только в файле скрипта.
2. Соответственно в терминальной сессии пользователей оставляем на экране пиктограмму запуска командного файла типа «Post1.bat». Доступа к непосредственному запуску 1С у него НЕТ.
@echo off
d: cd D:\1Cdb\ish\
wscript Post1.vbs /b /h:wscript
3. Создаём скрипт Post1.vbs со следующим содержанием:
dim err_code
sub my()
Dim v7
Dim s_path
Dim s_user
Dim s_pass
Dim s_report
Dim s_context
s_path = "D:\1Cdb\"
s_user = "Post1"
s_pass = "1111"
s_report="D:\1Cdb\ExtForms\Prosmotr.ert"
s_context = "Run"
Set v7 = CreateObject("V77.Application")
result = v7.Initialize(v7.RMTrade, "/D" & s_path & " /N" & s_user & " /P" & s_pass, "NO_SPLASH_SHOW")
if not result then
msgbox ="1C no start!"
exit sub
end if
err_code = 0
end sub
err_code = 255
my()
wscript.Quit(err_code)
4. Разрабатываем внешнюю обработку, которая обеспечивает интерфейс выбора «Плана» и позиционирование к рабочему месту оператора. В скрипте она имеет имя «Prosmotr.ert».
Внешний вид обработки:
Это единственное, что появится на экране.
Никаких меню, никаких окон 1С кроме этого.
Двойной клик по строке таблицы документации и она откроется для просмотра.
Текст обработки (1С 7.7 .... 7.70.027):
Перем КаталогФайл;
//.................................................................Е.И.
Функция ПолучитьНомерПоста()
Пользователь = ИмяПользователя();
НомерПоста = Прав(Пользователь,1);
Возврат Число(НомерПоста);
КонецФункции // ПолучитьНомерПоста
//.................................................................Е.И.
Процедура Документация()
Если СокрЛП(НомерПлана) = "" Тогда
Предупреждение("Введите номер Плана!",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;
ТДок.УдалитьСтроки();
КаталогФайл = "D:\1CDB\ish\WaterMark\";
ФГ=СоздатьОбъект("ФС");
ФГ.УстТекКаталог(КаталогФайл);
НомерПоста = ПолучитьНомерПоста();
Файл=ФГ.НайтиПервыйФайл(СокрЛП(НомерПлана)+"*.pdf."+Строка(НомерПоста));
Пока ПустаяСтрока(Файл)=0 Цикл
ТДок.НоваяСтрока();
ТДок.План = СокрЛП(НомерПлана);
Ключ = Найти(Файл,"_");
Имя = Сред(Файл,Ключ+1);
Имя = СтрЗаменить(Имя,"_"," ");
Имя = СтрЗаменить(Имя,".pdf."+Строка(НомерПоста),"");
ТДок.Документация = Имя;
ТДок.Файл = СокрЛП(Файл);
Файл=ФГ.НайтиСледующийФайл();
КонецЦикла;
фирма");
КонецПроцедуры
//.................................................................Е.И
Процедура ПриОткрытии()
ТДок.НоваяКолонка("План","Строка",10,,"План");
ТДок.НоваяКолонка("Документация","Строка",100,,"Документация");
ТДок.НоваяКолонка("Файл","Строка",200,,"Файл");
ТДок.ВидимостьКолонки("Файл",0);
КонецПроцедуры
//................................................................Е.И.
Процедура УправлениеТаблицейЗначений()
Если ТДок.КоличествоСтрок()>0 Тогда
С=ТДок.ТекущаяСтрока();
ВыбЗнач=ТДок.ПолучитьЗначение(С,"Файл");
ЗапуститьПриложение(КаталогФайл+"PDFView.exe " + Симв(34)+КаталогФайл+СокрЛП(ВыбЗнач)+Симв(34));
КонецЕсли;
КонецПроцедуры // УправлениеТаблицейЗначений
//................................................................Е.И.
Если системный администратор не заморочился на установку Вам нужных прав доступа, добавьте в процедуру глобального модуля… (1С 7.7 .... 7.70.027)
Процедура ПриНачалеРаботыСистемы()
…
Если (СокрЛП( ИмяПользователя()) = "Post1")
ИЛИ (СокрЛП( ИмяПользователя()) = "Post2")
ИЛИ (СокрЛП( ИмяПользователя()) = "Post3")
ИЛИ (СокрЛП( ИмяПользователя()) = "Post4")
ИЛИ (СокрЛП( ИмяПользователя()) = "Post5")
Тогда
ОткрытьФормуМодально("Отчет",,КаталогИБ()+"ExtForms\Prosmotr.ert");
КонецЕсли;
КонецПроцедуры // ПриНачалеРаботыСистемы()
После двойного клика по строке таблицы документации откроется окно PDFView.exe.
При попытке Print Screen будет выдано сообщение…
В рабочем режиме и сам не могу сделать снимок экрана, кроме как на внешнее устройство.
Приятной работы!