Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 мар 2024, 11:39

Как запретить операторам менять документ задним числом?

Автор nicom83049, 03 ноя 2021, 10:18

0 Пользователей и 1 гость просматривают эту тему.

nicom83049

Доброго времени суток.
Имеется 7.7 торговля+склад редакции 9.2

Столкнулся с такой ситуацией, что операторы изменяют документ (бывает цену установят другую или удалят или добавят позицию) которому уже пару дней и больше... Можно запретить операторам это делать?
т.е. смысл в чем: Операторы приняли заказ, набили, провели и все... Если надо что-то изменить, то что-бы это делал либо старший кассир, либо бухгалтер, либо зав.складом.

ls600

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

alexandr_ll

nicom83049, http://warenic.narod.ru/doc12.html

Статья "1С:Предприятие 7.7": управляем правами пользователей

Однако очень хочется разграничить не только (и не столько) права на объект в целом, но и на некоторые действия над ним из диалогов форм. А также не на все объекты данного вида, а только на некоторые.*

"B16_ФормаЭлемента". В справочник Элементы вносим идентификаторы элементов диалога в виде текста.
При начале работы система по имени определяет текущего пользователя, находит его в справочнике Пользователи (если не находит, то заводит нового) и сохраняет ссылку на текущий элемент в глобальной переменной ( в ТиС 9.х - глПользователь). Теперь достаточно при открытии любой формы найти ее в справочнике Формы и установить доступность согласно реквизиту Доступность (число: 1 или 0) справочника Элементы. Примечания:
* Для того, чтобы каждый раз не вводить руками все элементы подчиненных справочников, их можно скопировать вместе с элементом-родителем при помощи обработки
Копирование ветки справочника. назад
** Можно воспользоваться отчетом: Просмотрщик внутренних кодов объектов агрегатного типа. назад

наверх

Реализация стандартными методами.

В глобальном модуле пропишем процедуры установки доступности форм и элементов:

Функция УстановкаФормы(Конт, Имя) Экспорт
Перем Спр;
Спр=СоздатьОбъект(
"Справочник.Формы");
Спр
.ИспользоватьВладельца(глПользователь);
Если Спр.НайтиПоНаименованию(Имя)=
1 Тогда
// поиск текущей формы в справочнике
Конт
=Спр.ТекущийЭлемент();
Возврат
1;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат
0;
КонецЕсли;
КонецФункции
Функция УстановкаДоступности(Конт, Имя) Экспорт
Спр
=СоздатьОбъект(
"Справочник.Элементы");
Спр
.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=
1 Тогда
Возврат Спр.Доступность;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента
Возврат
0; // т.е. если доступ не описан, то запрещен (по умолчанию)
КонецЕсли;
КонецФункции

В каждый модуль пропишем следующий код

Перем Конт;
Процедура ПриОткрытии()
Если УстановкаФормы(Конт,
"B12_ФормаСписка")=0 тогда
// здесь: B12_ФормаСписка - это идентификатор формы
// B - справочник
// 12 - ID вида справочника
// ФормаСписка - наименование формы
// По этому идентификатору будет осуществляться поиск в справочнике Формы

СтатусВозврата(
0);
Возврат;
КонецЕсли;
Форма.Кнопка.Доступность(УстановкаДоступности(Конт,
"Кнопка"));
// здесь: Кнопка - это идентификатор элемента формы
// т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент

КонецПроцедуры

Если требуется скрывать некоторые элементы на форме, тогда потребуется ввести еще один атрибут в справочник Элементы: Видимость. Однако, видимостью управлять сложнее, так как при использовании многослойных форм включение слоя автоматически включает видимость помещенных на него элементов (при этом доступность не изменяется). Чтобы корректно отработать управление видимостью, придется вникать в логику программы. Однако, есть способ попроще.
На форму помещаем текст с формулой Контроль() (текст должен быть виден всегда, т.е. находиться в постоянно отображаемом слое или его видимость должна устанавливаться принудительно), а в текст модуля

Функция Контроль()
// т.к. нет возможности перебрать все элементы в цикле, то придется описывать каждый элемент
// в целом, функции "УстановкаВидимости" и "УстановкаДоступности" аналогичны.

Если УстановкаВидимости(Конт,
"Кнопка")=0 тогда
// т.о. если нужно скрыть, то скрываем
Форма.Наименование.Видимость(
0);
КонецЕсли;
Возврат
"";
КонецПроцедуры

Таким образом, элементы на форме будут скрываться при каждом обновлении и не придется разбираться и править программное управление видимостью в модулях, которые могут быть довольно сложны в многослойных формах.
Для повышения скорости работы функции, можно создать список принудительно скрываемых реквизитов (однократно выбрав из справочника Элементы) и далее работать без вызова глобальной функции УстановкаВидимости().

Вот пример для формы ФормаСписка справочника 12: элемент (колонка) Код невидим, элемент Кнопка виден и недоступен.

doc12_2.GIF

Как видно, стандартные методы, реализованные на платформе 1С:Предприятие 7.7, не обладают достаточной гибкостью. Необходимо описывать доступность/видимость всех элементов формы, которым предполагается управлять. Примечание
На самом деле, есть возможностьне управлять доступностью и видимостью в цикле. Реализуется это следующим образом:
создаем обработку, в модуле директива #ЗагрузитьИзФайла; программно создаем текст модуля для этой обработки;
Процедура ПриОткрытии()
Конт=Форма.Параметр;
// пример текста:
Конт.Кнопка.Доступность(
1);
СтатусВозврата(
0);
КонецПроцедуры

записываем текст модуля в файл программно открываем форму этой обработки, в качестве параметра передаем контекст обрабатываемой формы

наверх

наверх

Ограничение действий пользователя.

В стандартной ТиС 9.х контроль некоторых действий реализован при помощи справочника ПолномочияПользователей. С его помощью отслеживались такие действия:

  • Разрешить редактирование таблиц
  • Разрешить продавать резерв
  • Разрешить превышение кредита
  • Разрешить редактирование цен в документах
  • Разрешить печать непроведенных документов
Но опять-таки нет возможности отследить, чтобы пользователь, не мог, например, вводить элементы в определенную группу справочника или не мог изменить "не свои" документы...

Для того, чтобы ограничить действия пользователя, необходимо их как-то идентифицировать. Создадим еще один справочник Действия, также подчиненный справочнику Формы. В реквизит Действие будем записывать число; 1-действие разрешено, 0-запрещено.
В глобальном модуле пишем

Функция УстановкаПрав(Конт, Имя) Экспорт
Спр
=СоздатьОбъект(
"Справочник.Действия");
Спр
.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=
1 Тогда
Возврат Спр.Действия;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента

Возврат
0; // т.е. если действие не описно, то запрещено (по умолчанию)
КонецЕсли;
КонецФункции

В модуле формы документа:

Процедура ВводНового(Признак, Объект)
Если УстановкаПрав(Конт,
"ВводНового")=0 тогда
СтатусВозврата(
0);
Возврат;
КонецЕсли;
Если Признак=
1 тогда
Если УстановкаПрав(Конт,
"КопированиеДокумента")=0 тогда
СтатусВозврата(
0);
Возврат;
КонецЕсли;
КонецЕсли;
Автор
=ГлПользователь;
КонецПроцедуры
Процедура ПриЗаписи()
Если ТекущийДокумент().Выбран()=
1 тогда
Если УстановкаПрав(Конт,
"ЗаписьСуществующего")=0 тогда
СтатусВозврата(
0);
КонецЕсли;
Иначе
Если УстановкаПрав(Конт,
"ЗаписьНового")=0 тогда
СтатусВозврата(
0);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
УстановкаФормы(Конт,
"O14_Форма");

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

doc12_3.GIF

Для накладывания различных условий, нужно добавить в справочник Действия реквизит Объект (неопределенного типа).
Функция УстановкаПрав(Конт, Имя) Экспорт
Спр
=СоздатьОбъект(
"Справочник.Действия");
Спр
.ИспользоватьВладельца(Конт);
Если Спр.НайтиПоНаименованию(Имя)=
1 Тогда
Имя=Спр.ТекущийЭлемент();
Возврат
1;
Иначе
// здесь можно предусмотреть автоматическое создание нового элемента

Возврат
0; // т.е. если действие не описно, то запрещено (по умолчанию)
КонецЕсли;
КонецФункции

Теперь функция вернет в вызывающий модуль найденнный элемент справочника Действия для доступа к его реквизитам. Это позволит, например, автоматически устанавливать отбор по объекту в общем журнале документов или форме списка справочника.

Действие="УстанавливатьОтбор";
Если УстановкаПрав(Конт, Действие)=
1 тогда
Если Действие.Объект.Выбран()=
1 Тогда
УстановитьОтбор
(
"Автор", Действие.Объект);
КонецЕсли;
КонецЕсли;

Ну и для большего прикола, внесем еще один реквизит: Шаблон (строка подходящей длины). Шаблон можно обрабатывать при попощи функции


Шаблон(
"["+Спр.Шаблон+"]");
Суть данного метода вот в чем. Функция вычисляет выражение в скобках и возвращает строку, которую можно анализировать на равенство/неравенство. Например:
Если Шаблон(
"["+Спр.Шаблон+"]")="1" Тогда Обработку выбора реквизита в формах делаем так.
Процедура ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагСтандОбр)
// навеяно обсуждением на Т1С "Как открыть группу справочника?"
Спр
=СоздатьОбъект
("Справочник.Элементы");
Спр
.ИспользоватьВладельца(ID_);
Если Спр.НайтиПоНаименованию(ЭлементДиалога) =
1 Тогда
// ТипВид - это тип и вид значения реквидита что-то типа"Справочник.Контрагенты"

Что
=Спр.ТипВид;
Конт
=
"";
Если Лев(Что,
10)="Справочник" Тогда
// открываем заранее разрешенную для выбора группу

ОткрытьФорму(Что,Конт);
Конт
.ИспользоватьРодителя(Спр.Объект,
0);
ИначеЕсли Лев(Что,
8)="Документ" Тогда
// используется для выбора

ОткрытьФорму(
"Журнал.ДляВыбора",Конт);
Конт
.УстановитьОтбор(Прав(Что,СтрДлина(Что)-
9),Спр.Объект);
КонецЕсли;
ФлагСтандОбр
=
0;
КонецЕсли;
КонецПроцедуры

Вот так выглядит форма настройки действий.
В шаблон можно вносить несложные условия, например: ТекущийЭлемент().ЭтоГруппа()
Или даже действия: ИспользоватьРодителя(Спр.Объект,0) (имеет смысл при открытии формы списка справочника: в данном случае для пользователя установится режим просмотра только конкретной группы).
doc12_4.GIF

А это настройки элементов формы.
Отбор устанавливается

  • для справочника: по группе справочника;
  • для документа:
    • по виду документа
    • по значению общего реквизита документа
    • по значению графы отбора.
Фильтр по: служит для описания объекта, по которому осуществляется отбор.
doc12_5.GIF

наверх

Пример конфигурации можно скачать здесь.


nicom83049

Цитата: alexandr_ll от 03 ноя 2021, 13:38nicom83049, http://warenic.narod.ru/doc12.html
Вроде то что надо.
Только не понятно с самого начала:
Добавлять в самое начало глобального модуля? Или в самый конец? Что-то и так и так попробовал, изменений не обнаружил.

Так-же написано: В каждый модуль пропишем следующий код
Это в какой? Где этот модуль найти, и как я понимаю, он не один?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск