Имя: Пароль:
1C
1C 7.7
v7: Как запретить печать документов без сохранения
0 AJIeLLIka
 
20.10.15
16:24
Привет всем! Нужно некоторым пользователям запретить печать документов без сохранения. Чтобы не получилось так, что они распечатали документ а потом просто закрыли не сохранив.
В настройках прав пользователя нашел параметр "Печать документов без сохранения", но он не влияет на погоду, документ распечатывается без сохранения если галочка стоит и если не стоит.

Друзья, подскажите, можно ли это реализовать штатными средствами?

Сделать это нужно в 1С-Рарус:Магазин
1 aka AMIGO
 
20.10.15
16:27
ИМХО, есть такая функция: Выбран();
Если =1, то док записан, можно печатать.
2 Масянька
 
20.10.15
16:27
(0) Поставь минимальные полномочия :)
3 Злопчинский
 
20.10.15
16:30
фигня какая.
на каждом документе должен быть колонтитиул
в котором
дата время печати
кто распечатал
.
ну допустим документа нет а распечатка есть.
люлей навешать и все тому кто распечатал.
.
но люля вешать - это надо иметь политическую волю. как гитлер.
4 Масянька
 
20.10.15
16:30
+ (2) Справочник -> ПолномочияПользователей
5 Масянька
 
20.10.15
16:31
(3) Вот тебя слушаешь и понимаешь - "Никакой демократии!" :)
6 Злопчинский
 
20.10.15
16:32
(5) каждый автоматизатор в душе гестаповец
7 Злопчинский
 
20.10.15
16:33
вот ща
направление развиваем
с руководятелом одно обговаривается
а в инфе приходит фигня всякая
повбывавбы
8 Масянька
 
20.10.15
16:35
(7) "руководятел" - американец што ли? :)))))))))
9 Абыр
 
20.10.15
17:01
(0) Проверять Выбран() или Проведен(), если печать допускается не просто записанных, но и проведенных документов.
Если допускается изменение документов, но при этом следует запретить печать до сохранения изменений, то еще и Модифицированность() использовать.
10 Абыр
 
20.10.15
17:03
Хотя, насколько я понимаю, в (0) не погромист, и просто хочет без кодирования, чтобы ткнули в нужную галочку.
11 AJIeLLIka
 
20.10.15
17:18
(10) Совершенно верно! Я не программист, и если есть легкий путь, который я смогу своими силами выполнить, было бы здорово. Если нет, то конечно же обратимся к спецам. Но спасибо вам и остальным за помощь.

А для чего тогда интересно параметр: "Печать документов без сохранения"?
12 Масянька
 
20.10.15
17:24
(11) Для не проведенных документов.
13 Злопчинский
 
20.10.15
18:31
(12) я бы сказал для НЕСОХРАНЕННЫХ документов... (то есть новых или модифицированных, но не сохраненных)
14 HawkEye
 
20.10.15
19:00
(0) файлик 1cv7.md выложи
15 Mikeware
 
20.10.15
20:09
(3) я ещё добавлял verstamp. Несколько раз помогало. Ну и на многостраничных документах на второй и далее страницах - вид, номер, дата документа. И,естественно, везде штрихкод.
16 Pahomich
 
20.10.15
20:17
(0) Еще к предложенному можно в функцию Печать() добавить в начало Сохранить()...
17 Pahomich
 
20.10.15
20:20
(16) Вернее Записать()
18 Mikeware
 
20.10.15
20:46
(16) ну что за чушь...
19 Pahomich
 
20.10.15
21:04
(18) Чушь не чушь, но задачу запрета печати без сохранения решает.
20 Pahomich
 
20.10.15
21:07
(19) Кстати, верстампы и колонтитулы эту задачу не решают, а только предоставляют информацию о нарушении.
21 oslokot
 
20.10.15
21:08
В типовых клюшках, помнится, нельзя распечатать торг-12 не засейвив док
22 Злопчинский
 
20.10.15
21:09
В тисе механизм впф удобный
Но он именно для печати заточен
А есть такие печати которые можно и непроведенные печатать
И проведенные
А штатно так не выкрутиться
Часть впф хочется чтобы была видна только под конкретные значения конкретных реквизитов
Вот и есть мысль флажки разрешения печати выгести в файл настроек впф и аналогично например что такаято впф доступна только если контрагент шапки равен петров
Типа так
Делал ктото такое расширение
Или опять придется самому пилить?
23 Злопчинский
 
20.10.15
21:11
(20)  эээ коллега
Типовые еонфиги это учетные конфиги
То есть двигающие воздух
Если делать по уму то надо кардинально переколбашивать

Например можно тупо
На форму функцию
Если в функции документ новый или не сохранен после изменений то доступностьвидимость кнопок печати равно нулю
24 oslokot
 
20.10.15
21:15
А еще можно создать док, напечатать из него кучу разных печ.форм каждый раз пересохраняя, а как надоест, закинуть его от глаз подальше, на 01.01.3001
25 Pahomich
 
20.10.15
21:18
(23) Получается лучшее решение это (1) плюс учет модифицированности  документа и в зависимости от этого и флажков в справочнике сотрудники определять доступность кнопок печати.
26 Mikeware
 
20.10.15
22:06
(25) и (1) тоже немного чушь. Основное - модифицированность().
А сохранение - должно быть процессом, осознанным пользователем.... чтоб не было - "я случайно исправила, а ваша программа сохранила"
27 Mikeware
 
20.10.15
22:07
(22) пилить... там два десятка строк...
28 Builder
 
20.10.15
22:10
Делал в свое время механизм сохранения всех печатных форм при выводе на печать. Поймали одного менеджера и турнули с позором - на печать выводил одно, правил док и сохранял в базе другое.
29 Злопчинский
 
20.10.15
22:21
(28) Предопределенная формексовская ПриПечати() - и тупо складировать в подпапки по именам юзверей
30 Злопчинский
 
20.10.15
22:22
(27) ну так давай! а то я уставши, а у меня 2 ноября война...
31 Сияющий в темноте
 
20.10.15
23:50
(28) они бывают ещё умнее когда форму в ексель переносят и т п
а некоторые гиганты мысли просто готовую напечатанную и дома при6ося
32 vcv
 
21.10.15
05:01
(6) "каждый автоматизатор в душе гестаповец"
Я у себя сделал, то бы при печати внутрь базы сохранялась печатная форма, привязанная к документу. Печатные формы защищены от удаления, документ, соответственно, удалить тоже нельзя, потому как ссылка на него есть.

Бухгалтерия пришла с претензией: не можем удалить документ.
И состоялся зачудительный разговор:
(я) Не можете, потому что документ печатался и покупателю, по всей видимости, отдана накладная;
(бух) А зачем нам всякая фигня в базе? (дословно)
(я) А зачем вы всякую фигню в базу вводите, да еще и печатаете?

:)
33 Aleksey
 
21.10.15
05:56
(22) Я делал в виде обработке такое, т.е. у документа одна печатная форма, в которой формируется список доступных печатных форм, при необходимости пользователь галками определяет какие печатные формы нужны, выбирает принтер и автоматом печатается, даже на экран не выводиться (ТЧ выводится как ТЗ на форме для просмотра)
34 Mikeware
 
21.10.15
07:21
(33) У меня все равно длиннее... :-)
У меня для каждого контрагента без вывода на экран печатался свой набор форм, установленный договором (или пакет по умолчанию, если не установлен)
35 Pahomich
 
21.10.15
07:51
(34) Возможно это правильное и эффективное решение...но только задачи имеющей весьма косвенное отношение к задаче, поставленной автором ветки и чисто конкретно её не решающее!
36 vde69
 
21.10.15
08:32
(3) я себе сделал такую фишку:

на каждом документе печатается штрих код в котором зашит ID документа и его контрольные значения (для некоторых документов это сумма, для других другие параметры, от всех параметров скопом я получаю один хеш и его храню в штрих коде),

тем самым при сканировании ШК с документа я сразу определяю соответствие электронного и бумажного документа.

ОЧЕНЬ УДОБНО!!!!
37 Mikeware
 
21.10.15
09:12
(36) Плюсую!
38 Mikeware
 
21.10.15
09:13
(35)Задача автора решается четырьмя строчками в модуле формы:
Если Модифицированность()=1 Тогда
  Сообщить("Нефиг");
  возврат;
КонецЕсли;
39 vde69
 
21.10.15
09:21
(37) собственно идея не моя, это налоговая придумала для регламентированной отчетности лет 10 назад (когда они ввели двухмерный ШК), но вот реализовать такой поход для внутреннего документооборота - моя идея...

где реально применяется
1. при разборках со складом (у них гранится первичка по которой они отгружаю/принимают), при "спорных" моментах проходим сканером и моментально находим в юазе все изменения "задним числом"
2. при подписи на бумаге счетов, скан и ты уверен, что счет заведен в систему.

единственный минус - возможность редактировать печатную форму в екселе (при этом ШК будет старый), тут у меня есть идея присобачить имедж сканет и сканировать с распознаванием пару ключевых параметров (количество строк и общую сумму/количество), но пока не допилил...
40 Pahomich
 
21.10.15
09:22
(38) Думаю ты погорячился - это запрет на печать для всех изменивших документ, даже для создавшего его и после сохранения исправившего какую то мелочь, а надо для некоторых...Да, и в какую процедуру ты добавишь эти строки?
41 Pahomich
 
21.10.15
09:27
(39) Это все отлично, но это проверка тобой документов твоей фирмы. Для многих клиентов, кому предназначен данный документ, это непременимо.
42 Mikeware
 
21.10.15
09:27
(39) я такое собирался сделать примерно тогда же - еще на Территории обсуждали... я собрался тогда почитать книжки (типа Питерсона или вильямса), да потом сменил работу - и руки так и не дошли, ограничился просто идентификацией
43 vde69
 
21.10.15
09:38
(41) ни разу не встречал организацию которая печатает документы нужные "чужой" и не нужной "своей"
44 Pahomich
 
21.10.15
10:49
(43) Ты счет-фактуры и накладные клиенту не передаешь?
45 Злопчинский
 
21.10.15
11:08
(36) тоже плюсую но с оглядкой. совпадение шк на печформе с базой не гарантирует что в проведении документа тот же результат, что и раньше - у нас же любят писать алгоритмы, зависящие от реквизитов, которые не находятся впрямую в документе...
.
но по этому пути я тоже думаю штрихкодировать
если на клюшках - можно поиметь функцию расчета для шк?
и шк сам большой получается?
46 Злопчинский
 
21.10.15
11:09
(44) да запросто такое может быть... например безвозмездная отгрузка. как правило клиентам нафиг не нужны ни счф, ни торг12. а у нас - оно есть...
47 Mikeware
 
21.10.15
11:22
(45) "проведение" ни при чем... вопрос в совпадении ключевых реквизитов.
совпадение ШК не гарантирует, что еквизиты не менялись, но вот несовпадение - гарантирует, что менялись.
48 Mikeware
 
21.10.15
11:24
(46) просто Pahomich как всегда, пишет не разобравшись (т.е. с точностью до наеборот)
49 Злопчинский
 
21.10.15
11:24
(47) согласен, по этому пути и планирую...
и где, блин, обещанные 22 строчки??? ;-)
50 vde69
 
21.10.15
11:25
(45) у меня влазит в Code128

// НомерДока - это тип документа числом, накладая - 1, реализация - 2 и так далее.
    мСтрокаШапка = НомерДока + "," + СсылкаНаОбъект.УникальныйИдентификатор();
    мСтрокаШапка = СтрЗаменить(мСтрокаШапка, "-", "");
    ОбластьШапка.Рисунки.ШтрихКодШапка.Объект.ТипКода = 4;
    ОбластьШапка.Рисунки.ШтрихКодШапка.Объект.Сообщение = ВРег(мСтрокаШапка);




Функция ПолучитьХешТоварнойЧастиУпр (ДокументСсылка) Экспорт
    СтрокаДляХеша = "";
    мТЗ = Новый ТаблицаЗначений;
    мТЗ.Колонки.Добавить("Номенклатура");
    мТЗ.Колонки.Добавить("Количество");
    мТЗ.Колонки.Добавить("Единица");
    
    Для Каждого эл из ДокументСсылка.Товары Цикл
        НоваяСтрока = мТЗ.Добавить();
        НоваяСтрока.Номенклатура = СокрЛП(эл.Номенклатура.УникальныйИдентификатор());
        НоваяСтрока.Количество = эл.Количество;
        НоваяСтрока.Единица = СокрЛП(эл.ЕдиницаИзмерения.УникальныйИдентификатор());
    КонецЦикла;
    
    СтрокаДляХеша = "";
    мТЗ.Сортировать("Номенклатура");
    Для Каждого эл из мТЗ Цикл
        СтрокаДляХеша = СтрокаДляХеша + эл.Номенклатура + "," + эл.Количество + "," + эл.Единица + ";";
    КонецЦикла;
    
    Результат = ВычислитьХешСтрокиПоАлгоритмуMD5(СтрокаДляХеша);
    Возврат Результат;
КонецФункции
51 Mikeware
 
21.10.15
11:32
(49) у меня сейчас на ноуте клюшек-то нету... снес, потому, что опенконф не ставится.... (точнее, он-то ставится, но конфигуратор падает).
сейчас поставлю, по скайпу наберу...
52 Злопчинский
 
21.10.15
11:33
ну... да...
а контрагента? а договор? (в некоторых доках указывается) а дата документа (частенько двигают)..? еще что-то?
53 Mikeware
 
21.10.15
11:35
(52) ну так пихай в строку для хэша что надо - главное, проверять так же...
(50) сколько длина хэша?
54 vde69
 
21.10.15
11:35
(50)+
вру, у меня верхний штрих код - это ссылка на документ, а нижний - хеш :)
55 vde69
 
21.10.15
11:37
АлгоритмХеша = "1";
    
    мСтрокаПодвал = АлгоритмХеша + "," + Криптография.ПолучитьХешТоварнойЧастиУпр(СсылкаНаОбъект);
    ОбластьПодвал.Рисунки.ШтрихКодПодвал.Объект.ТипКода = 4;
    ОбластьПодвал.Рисунки.ШтрихКодПодвал.Объект.Сообщение = ВРег(мСтрокаПодвал);
56 Злопчинский
 
21.10.15
11:41
да, какая длина хеша получается..?
57 vde69
 
21.10.15
11:47
считай :)

75B0CD562640064F6608A170CAA96E48
58 vde69
 
21.10.15
11:48
а вообще его можно делать ЛЮБОЙ длины
59 vde69
 
21.10.15
11:49
оставлю полный код получения хеша


// Возвращает хеш по алгоритму MD5 для произвольной строки.
//
// Параметры:
//  Строка - Строка - произвольная строка любой длины
//
// Возвращаемое значение:
//  Строка - хеш, вычисленный из строки
Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка) Экспорт
    
    a = ЧислоВБинарныйМассив(1732584193); // 01 23 45 67; (шестнадцатеричное представление, сначала младший байт)
    b = ЧислоВБинарныйМассив(4023233417); // 89 AB CD EF;
    c = ЧислоВБинарныйМассив(2562383102); // FE DC BA 98;
    d = ЧислоВБинарныйМассив(271733878);  // 76 54 32 10;
    
    X = Новый Массив(16); // X - блок данных размером 512 бит, массив из 32-битных слов
    
    // разбиваем строку на блоки по 512 бит
    МассивБлоковИзСтроки = ПолучитьМассивБлоковБайтовИзСтроки(Строка);
    
    // для каждого блока производим расчет
    Для НомерБлока = 0 По МассивБлоковИзСтроки.Количество() - 1 Цикл
        Блок = МассивБлоковИзСтроки[НомерБлока];
        Для НомерСлова = 0 По 15 Цикл
            Слово = 0;
            Для НомерБайта = 1 По 4 Цикл
                Слово = Слово + Блок[НомерСлова 4 + НомерБайта - 1] Pow(256, НомерБайта - 1);
            КонецЦикла;
            X[НомерСлова] = Слово;
        КонецЦикла;
        
        // в последний блок дописываем длину строки в битах
        Если НомерБлока = МассивБлоковИзСтроки.Количество() - 1 Тогда
            РазмерСтрокиВБитах = СтрДлина(Строка) 8;
            X[14] = РазмерСтрокиВБитах % Pow(2,32); // сначала младшие 4 байта
            X[15] = Цел(РазмерСтрокиВБитах / Pow(2,32)) % Pow(2,64); // если длина превосходит (2^64 - 1) бит, то старшие биты откидываем
        КонецЕсли;
        РассчитатьБлок(a, b, c, d, X);
    КонецЦикла;
    
    Результат = ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(a))
              + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(b))
              + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(c))
              + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(d));
    
    Возврат Результат;
    
КонецФункции

// ВычислитьХешСтрокиПоАлгоритмуMD5

Функция ПолучитьМассивБлоковБайтовИзСтроки(Знач Строка)
    Результат = Новый Массив;
    Строка = Строка + Символ(128); // единичный бит + выравнивание нолями до байта
    Пока СтрДлина(Строка) > 0 Цикл
        БлокБайтов = ПолучитьБлокБайтовИзСтроки(Лев(Строка, 64));
        Результат.Добавить(БлокБайтов);
        
        // если последние 8 байт получились не нулевые, то добавляем ещё один нулевой блок
        Если СтрДлина(Строка) > 56 И СтрДлина(Строка) < 64 Тогда
            Результат.Добавить(ПолучитьБлокБайтовИзСтроки(""));
        КонецЕсли;
        
        Строка = Сред(Строка, 65);
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция ПолучитьБлокБайтовИзСтроки(Знач Строка)
    Результат = Новый Массив;
    Для Позиция = 1 По СтрДлина(Строка) Цикл
        Результат.Добавить(КодСимвола(Сред(Строка, Позиция, 1)));
    КонецЦикла;
    
    // дополняем блок нолями
    Для Индекс = Позиция По 64 Цикл
        Результат.Добавить(0);
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Процедура РассчитатьБлок(a, b, c, d, X)
    aa = СкопироватьМассив(a);
    bb = СкопироватьМассив(b);
    cc = СкопироватьМассив(c);
    dd = СкопироватьМассив(d);
    
    // раунд 1
    ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 0],  7, 3614090360); // 0xd76aa478 /
1 /
    ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 1], 12, 3905402710); // 0xe8c7b756 /
2 /
    ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 2], 17,  606105819); // 0x242070db /
3 /
    ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 3], 22, 3250441966); // 0xc1bdceee /
4 /
    ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 4],  7, 4118548399); // 0xf57c0faf /
5 /
    ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 5], 12, 1200080426); // 0x4787c62a /
6 /
    ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 6], 17, 2821735955); // 0xa8304613 /
7 /
    ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 7], 22, 4249261313); // 0xfd469501 /
8 /
    ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 8],  7, 1770035416); // 0x698098d8 /
9 /
    ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 9], 12, 2336552879); // 0x8b44f7af /
10 /
    ВыполнитьОперациюСФункциейF(c,d,a,b, X[10], 17, 4294925233); // 0xffff5bb1 /
11 /
    ВыполнитьОперациюСФункциейF(b,c,d,a, X[11], 22, 2304563134); // 0x895cd7be /
12 /
    ВыполнитьОперациюСФункциейF(a,b,c,d, X[12],  7, 1804603682); // 0x6b901122 /
13 /
    ВыполнитьОперациюСФункциейF(d,a,b,c, X[13], 12, 4254626195); // 0xfd987193 /
14 /
    ВыполнитьОперациюСФункциейF(c,d,a,b, X[14], 17, 2792965006); // 0xa679438e /
15 /
    ВыполнитьОперациюСФункциейF(b,c,d,a, X[15], 22, 1236535329); // 0x49b40821 /
16 /
    
    // раунд 2
    ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 1],  5, 4129170786); // 0xf61e2562 /
17 /
    ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 6],  9, 3225465664); // 0xc040b340 /
18 /
    ВыполнитьОперациюСФункциейG(c,d,a,b, X[11], 14,  643717713); // 0x265e5a51 /
19 /
    ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 0], 20, 3921069994); // 0xe9b6c7aa /
20 /
    ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 5],  5, 3593408605); // 0xd62f105d /
21 /
    ВыполнитьОперациюСФункциейG(d,a,b,c, X[10],  9,   38016083); //  0x2441453 /
22 /
    ВыполнитьОперациюСФункциейG(c,d,a,b, X[15], 14, 3634488961); // 0xd8a1e681 /
23 /
    ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 4], 20, 3889429448); // 0xe7d3fbc8 /
24 /
    ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 9],  5,  568446438); // 0x21e1cde6 /
25 /
    ВыполнитьОперациюСФункциейG(d,a,b,c, X[14],  9, 3275163606); // 0xc33707d6 /
26 /
    ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 3], 14, 4107603335); // 0xf4d50d87 /
27 /
    ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 8], 20, 1163531501); // 0x455a14ed /
28 /
    ВыполнитьОперациюСФункциейG(a,b,c,d, X[13],  5, 2850285829); // 0xa9e3e905 /
29 /
    ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 2],  9, 4243563512); // 0xfcefa3f8 /
30 /
    ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 7], 14, 1735328473); // 0x676f02d9 /
31 /
    ВыполнитьОперациюСФункциейG(b,c,d,a, X[12], 20, 2368359562); // 0x8d2a4c8a /
32 /
    
    // раунд 3
    ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 5],  4, 4294588738); // 0xfffa3942 /
33 /
    ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 8], 11, 2272392833); // 0x8771f681 /
34 /
    ВыполнитьОперациюСФункциейH(c,d,a,b, X[11], 16, 1839030562); // 0x6d9d6122 /
35 /
    ВыполнитьОперациюСФункциейH(b,c,d,a, X[14], 23, 4259657740); // 0xfde5380c /
36 /
    ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 1],  4, 2763975236); // 0xa4beea44 /
37 /
    ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 4], 11, 1272893353); // 0x4bdecfa9 /
38 /
    ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 7], 16, 4139469664); // 0xf6bb4b60 /
39 /
    ВыполнитьОперациюСФункциейH(b,c,d,a, X[10], 23, 3200236656); // 0xbebfbc70 /
40 /
    ВыполнитьОперациюСФункциейH(a,b,c,d, X[13],  4,  681279174); // 0x289b7ec6 /
41 /
    ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 0], 11, 3936430074); // 0xeaa127fa /
42 /
    ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 3], 16, 3572445317); // 0xd4ef3085 /
43 /
    ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 6], 23,   76029189); //  0x4881d05 /
44 /
    ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 9],  4, 3654602809); // 0xd9d4d039 /
45 /
    ВыполнитьОперациюСФункциейH(d,a,b,c, X[12], 11, 3873151461); // 0xe6db99e5 /
46 /
    ВыполнитьОперациюСФункциейH(c,d,a,b, X[15], 16,  530742520); // 0x1fa27cf8 /
47 /
    ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 2], 23, 3299628645); // 0xc4ac5665 /
48 /
    
    // раунд 4
    ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 0],  6, 4096336452); // 0xf4292244 /
49 /
    ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 7], 10, 1126891415); // 0x432aff97 /
50 /
    ВыполнитьОперациюСФункциейI(c,d,a,b, X[14], 15, 2878612391); // 0xab9423a7 /
51 /
    ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 5], 21, 4237533241); // 0xfc93a039 /
52 /
    ВыполнитьОперациюСФункциейI(a,b,c,d, X[12],  6, 1700485571); // 0x655b59c3 /
53 /
    ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 3], 10, 2399980690); // 0x8f0ccc92 /
54 /
    ВыполнитьОперациюСФункциейI(c,d,a,b, X[10], 15, 4293915773); // 0xffeff47d /
55 /
    ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 1], 21, 2240044497); // 0x85845dd1 /
56 /
    ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 8],  6, 1873313359); // 0x6fa87e4f /
57 /
    ВыполнитьОперациюСФункциейI(d,a,b,c, X[15], 10, 4264355552); // 0xfe2ce6e0 /
58 /
    ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 6], 15, 2734768916); // 0xa3014314 /
59 /
    ВыполнитьОперациюСФункциейI(b,c,d,a, X[13], 21, 1309151649); // 0x4e0811a1 /
60 /
    ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 4],  6, 4149444226); // 0xf7537e82 /
61 /
    ВыполнитьОперациюСФункциейI(d,a,b,c, X[11], 10, 3174756917); // 0xbd3af235 /
62 /
    ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 2], 15,  718787259); // 0x2ad7d2bb /
63 /
    ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 9], 21, 3951481745); // 0xeb86d391 /
64 /
    
    a = БинарнаяСумма(a, aa);
    b = БинарнаяСумма(b, bb);
    c = БинарнаяСумма(c, cc);
    d = БинарнаяСумма(d, dd);
КонецПроцедуры

Процедура ВыполнитьОперациюСФункциейF(a, b, c, d, X, s, t)
    ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, c), ПобитовоеИ(ПобитовоеНе(b), d)), a, b, X, s, t);
КонецПроцедуры

Процедура ВыполнитьОперациюСФункциейG(a, b, c, d, X, s, t)
    ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, d), ПобитовоеИ(ПобитовоеНе(d), c)), a, b, X, s, t);
КонецПроцедуры

Процедура ВыполнитьОперациюСФункциейH(a, b, c, d, X, s, t)
    ВыполнитьОперацию(ПобитовоеИсключающееИли(ПобитовоеИсключающееИли(b, c), d), a, b, X, s, t);
КонецПроцедуры

Процедура ВыполнитьОперациюСФункциейI(a, b, c, d, X, s, t)
    ВыполнитьОперацию(ПобитовоеИсключающееИли(ПобитовоеИли(ПобитовоеНе(d), b), c), a, b, X, s, t);
КонецПроцедуры

Процедура ВыполнитьОперацию(q, a, b, X, s, t)
    a = БинарнаяСумма(ЦиклическийСдвигВлево(БинарнаяСумма(БинарнаяСумма(a, q), ЧислоВБинарныйМассив((X + t) % Pow(2,32))), s), b);
КонецПроцедуры

Функция ЧислоВБинарныйМассив(Знач Число, Знач ВсегоРазрядов = 32)
    Результат = Новый Массив;
    ТекущийРазряд = 0;
    Пока ТекущийРазряд < ВсегоРазрядов Цикл
        ТекущийРазряд = ТекущийРазряд + 1;
        Результат.Добавить(Булево(Число % 2));
        Число = Цел(Число / 2);
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция БинарныйМассивВЧисло(Массив)
    Результат = 0;
    Для НомерРазряда = -(Массив.Количество()-1) По 0 Цикл
        Результат = Результат
2 + Число(Массив[-НомерРазряда]);
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция ЧислоВШестнадцатеричномПредставлении(Знач Число, Знач КоличествоБайт = 4)
    Результат = "";
    СтрокаСимволов = "0123456789ABCDEF";
    Для НомерБайта = 1 По КоличествоБайт Цикл
        ПредставлениеБайта = "";
        Для Счетчик = 1 По 2 Цикл
            ПредставлениеБайта = Сред(СтрокаСимволов, Число % 16 + 1, 1) + ПредставлениеБайта;
            Число = Цел(Число / 16);
        КонецЦикла;
        
        // порядок байтов: начиная с младшего
        Результат = Результат + ПредставлениеБайта;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция ПобитовоеИ(БинарныйМассив1, БинарныйМассив2)
    Результат = Новый Массив;
    Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл
        Результат.Добавить(БинарныйМассив1[Индекс] И БинарныйМассив2[Индекс]);
    КонецЦикла;    
    Возврат Результат;
КонецФункции

Функция ПобитовоеИли(БинарныйМассив1, БинарныйМассив2)
    Результат = Новый Массив;
    Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл
        Результат.Добавить(БинарныйМассив1[Индекс] Или БинарныйМассив2[Индекс]);
    КонецЦикла;    
    Возврат Результат;
КонецФункции

Функция ПобитовоеИсключающееИли(БинарныйМассив1, БинарныйМассив2)
    Результат = Новый Массив;
    Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл
        Результат.Добавить(БинарныйМассив1[Индекс] <> БинарныйМассив2[Индекс]);
    КонецЦикла;    
    Возврат Результат;
КонецФункции

Функция ПобитовоеНе(БинарныйМассив)
    Результат = Новый Массив;
    Для Каждого Элемент Из БинарныйМассив Цикл
        Результат.Добавить(Не Элемент);
    КонецЦикла;    
    Возврат Результат;
КонецФункции

Функция ЦиклическийСдвигВлево(БинарныйМассив, КоличествоРазрядов)
    Результат = Новый Массив(БинарныйМассив.Количество());
    Для Разряд = 0 По БинарныйМассив.Количество()-1 Цикл
        Результат[(Разряд + КоличествоРазрядов) % БинарныйМассив.Количество()] = БинарныйМассив[Разряд];
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция БинарнаяСумма(БинарныйМассив1, БинарныйМассив2)
    Результат = Новый Массив;
    ДобавитьКРазряду = Ложь;
    Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл
        Результат.Добавить(БинарныйМассив1[Индекс] <> БинарныйМассив2[Индекс] <> ДобавитьКРазряду);
        ДобавитьКРазряду = (0 + БинарныйМассив1[Индекс] + БинарныйМассив2[Индекс] + ДобавитьКРазряду) > 1;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция СкопироватьМассив(Массив)
    Результат = Новый Массив;
    Для Каждого Элемент Из Массив Цикл
        Результат.Добавить(Элемент);
    КонецЦикла;
    Возврат Результат;
КонецФункции
60 Злопчинский
 
21.10.15
11:50
(57) спасибо, кэп, посчитал!
(58) тогда придется извращаться с двумернгыми или длинный ШК бить на части и усложнять процедуру сканирования...
.
я считал когда хотел такую хрень сделать - где-то до 48 знаков влазит без проблем для считывания...
.
и какой тип ШК использовать - какой из них плотный..?
61 Злопчинский
 
21.10.15
11:51
(59) спсб тб дбр члвк! ;-)
62 Злопчинский
 
21.10.15
11:53
я как-то одному хомячку на заказ сделал целое РМ по маркировке и сканированию - правильные налевр, неправильные направо...
.
но где эта хрень - хз... ;-)
.
а в конторе надо внедрять для отслеживания пути доков - со статусами, где находится, какие проблемы и прочее - бо бухи вообще не могут сами "автоматизироваться" - и это еще при условии что у нас мизерный как я считаю документооборот и дохренища самовывозов с оформлением доков по месту...
63 Mikeware
 
21.10.15
12:02
(57)Да, чой-то я тормознул. в шестнадцатеричке - 32 символа... Переотдыхался. Размер хэша МД5 - 128 бит. Можно, конечно, и ужать, подняв СС до 36...
(58)а вот насчет "любой длины"... гонишь, имхо
(59) Ёпрст приводил гораздо короче, с использованием js и MSScriptControl
64 vde69
 
21.10.15
12:11
(63) можно делать 16, 32, 64, 128 байт, да и вообще есть разные реализации например CRC32 которые дают разный результат.

по поводу "короче", сабж будет гарантировано работать на линухе а MSScriptControl будет???

а вообще код не мой, а стыренный с инета и немного адаптированный...
65 Pahomich
 
21.10.15
13:32
(48) И в чем же я не разобрался? В ветке был поставлен вопрос о запрете печати без сохранения, а не о контроле документооборота. У вас обсуждение свелось исключительно к последнему. Я привык отвечать на поставленный вопрос, а ты привык навешивать ярлыки без достаточных оснований...