1с запрет на изменение реквизита документа

Ermak
13.03.2013 13:38 Прочитано: 11275

Подскажите что я не так делаю, выдает ошибку

{Документ.Подписаный.Форма.ФормаДокумента.Форма(20)}: Поле объекта не обнаружено (Доступность)
Результат.Ответственный.Доступность = Ложь;

Код 1C v 8.х

 Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Форма1.Ссылка,
| Форма1.Ответственный
|ИЗ
| Документ.Форма1 КАК Форма1
|ГДЕ
| Форма1.Организация = &Организация
| И Форма1.Квартал = &Квартал";

Запрос.Параметры.Вставить("Организация", ЭлементыФормы.Организация.Значение);
Запрос.Параметры.Вставить("Квартал", ЭлементыФормы.Квартал.Значение);
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
Результат.Ответственный.Доступность = Ложь;
КонецЦикла;

Ответственный тип Справочник

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
13.03.2013 13:56 Ответ № 1

так ты же это перебираешь результат запроса — в нем только выборка и нет ни какой доступности!

Ermak
13.03.2013 16:12 Ответ № 2

А как тогда можно сделать через запрос?

E_Migachev
13.03.2013 17:16 Ответ № 3

(2) Ermak, ни как… запрос служит только для получения данных…
А что ты хочешь ограничить, расскажи подробнее

Ermak
13.03.2013 17:19 Ответ № 4

я хочу при нажатии на кнопку в документе Подпись, в документе Документы.Форма1 реквизит Ответственный был не доступен для редактирования

DJ_Serega
13.03.2013 17:40 Ответ № 5

(4) Ermak, я так понял, если нажали на ПОДПИСЬ, то редактировать ответственного вообще нельзя?
Вижу выход только через дополнительный реквизит. При нажатии на ПОДПИСЬ устанавливать как истина, снимать доступность у открытого документа и при открытии проверять «доступно или нет»

Ermak
13.03.2013 17:51 Ответ № 6

Да вы правильно поняли, при нажатии вообще редактировать нельзя.
А можно на пример как через дополнительный реквизит

E_Migachev
13.03.2013 18:03 Ответ № 7

В модуле кнопки подпись напиши:
Код 1C v 8.х

 ЭлементыФормы.Ответсвенный.Доступность = Не РеквизитХраненияДоступностиБулево;   

создай РеквизитХраненияДоступностиБулево

Ermak
13.03.2013 19:34 Ответ № 8

а как обратиться к документу Документы.Форма1 так как кнопка подписи находится в Документы.Подпись

DJ_Serega
13.03.2013 22:08 Ответ № 9

Код 1C v 8.х

 
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Форма1.Ссылка КАК Документ
|ИЗ
| Документ.Форма1 КАК Форма1
|ГДЕ
| Форма1.Организация = &Организация
| И Форма1.Квартал = &Квартал"
;

Запрос.Параметры.Вставить("Организация", ЭлементыФормы.Организация.Значение);
Запрос.Параметры.Вставить("Квартал", ЭлементыФормы.Квартал.Значение);
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ДокументБлокировки = Результат.Документ.ПолучитьОбъект();
ДокументБлокировки.РеквизитХраненияДоступностиБулево = Истина;
ДокументБлокировки.Записать(РежимЗаписиДокумент.Запись);
КонецЦикла;

На корректность кода (если что) не обращайте внимания. Писал «от руки» *09 Но смысл думаю будет доставлен *17


Изменено 13.03.13 22:10:49

Ermak
14.03.2013 08:55 Ответ № 10

Не много код не понял, создал реквизит РеквизитХраненияДоступности в документе Форма1 и добавил код в документ Подпись, после нажатия на кнопку все равно можно редактировать документ Форма1.


Изменено 14.03.13 09:02:52

DJ_Serega
14.03.2013 18:44 Ответ № 11

(10) Ermak, а при открытии не забыл доступность устанавливать исходя из зна чения нового реквизита?
Пенечитай (7) E_Migachev,

Ermak
14.03.2013 19:17 Ответ № 12

(11) DJ_Serega, Я не понимаю, реквизит Ответственный находится в документе Форма1, а кнопка Подпись находится в документе Подпись, если я напиши он не поймет что за реквизит Ответственный.

DJ_Serega
14.03.2013 23:00 Ответ № 13

Приду домой напишу. А то с телефона сижу *07

E_Migachev
15.03.2013 00:11 Ответ № 14

(12) Ermak, Форма1 и Подпись это формы одного документа???

DJ_Serega
15.03.2013 02:00 Ответ № 15

(14) E_Migachev, та походу разные это документы
.(12) Ermak, тебе нужно получить объект документа ответственный и в нем установить запрет на изменение реквизита. И ПриОткрытии того (запрещенного) документа проверять на доступность изменения.
Что бы тебе помочь более детально, нам нужно знать как между собой связаны документ Подпись с документом Ответственный.

Ermak
15.03.2013 08:35 Ответ № 16

Если вы имеет это объединение то у них есть два одинаковый реквизита, это Квартал и Организация, по этим реквизитам я делал отбор в документе Форма1Код 1C v 8.х

 Запрос.Параметры.Вставить("Организация",  ЭлементыФормы.Организация.Значение);
Запрос.Параметры.Вставить("Квартал", ЭлементыФормы.Квартал.Значение);

смысл такой, устанавливаю данные в документе подпись для организации и квартал, он ищет в документ Форма1 такие же данные когда находит документы с этими же данными то делает реквизит ответственный не доступным.
Больше эти документы не чем не объединяются.

Ermak
15.03.2013 13:49 Ответ № 17

Всем спасибо я разобрался!
Кому нужно вот код

В Документы.Подпись

Код 1C v 8.х

 Процедура Кнопка1Нажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Форма1.Ссылка КАК Ссылка
|ИЗ
| Документ.Форма1 КАК Форма1
|ГДЕ
| Форма1.Организация = &Организация
| И Форма1.Квартал = &Квартал";

Запрос.Параметры.Вставить("Организация", ЭлементыФормы.Организация.Значение);
Запрос.Параметры.Вставить("Квартал", ЭлементыФормы.Квартал.Значение);
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
ДокументБлокировки = Результат.Ссылка.ПолучитьОбъект();
ДокументБлокировки.РеквизитХраненияДоступности = Ложь;
ДокументБлокировки.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
КонецПроцедуры

Документы.Форма1

Код 1C v 8.х

 Процедура ПриОткрытии()
ЭлементыФормы.Ответственный.Доступность = РеквизитХраненияДоступности;
КонецПроцедуры
Ermak
15.03.2013 13:56 Ответ № 18

А можно как нибудь через запрос сделать это действие

ЭлементыФорым…..Доступность = РеквизитХраненияДоступности;

чтобы каждый реквизит не прописывать.

Ermak
15.03.2013 17:06 Ответ № 19

Подскажите, тут я обращаюсь к документуКод 1C v 8.х

 "ВЫБРАТЬ
| Форма1.Ссылка
|ИЗ
| Документ.Форма1 КАК Форма1
|ГДЕ
| Форма1.Организация = &Организация
| И Форма1.Квартал = &Квартал
| И Форма1.Ссылка <> &Ссылка";

и использую ссылку

а если я буду обращаться к регистру накопления там же не ссылки как мне быть тогда?

Код 1C v 8.х

 "ВЫБРАТЬ
| Форма1.Организация,
| Форма1.Квартал,
| Форма1.Исполнитель,
| Форма1.Номенклатура,
| Форма1.Группа,
| Форма1.Подгруппа,
| Форма1.БазЕдиница,
| Форма1.Тип,
| Форма1.Количество,
| Форма1.Цена,
| Форма1.Сумма,
| Форма1.СуммаНДС
|ИЗ
| РегистрНакопления.Форма1 КАК Форма1
|ГДЕ
| Форма1.Организация = &Организация
| И Форма1.Квартал = &Квартал";

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

DJ_Serega
16.03.2013 03:44 Ответ № 20

(19) Ermak, через регистр можно либо через ссылку в измерении или реквизите либо через регистратор.
(18) Ermak, запрос только выбирает данные. Их можно только посмотреть. Что бы изменить, нужно получать объект.

DJ_Serega
16.03.2013 03:48 Ответ № 21

(17) Ermak, у тебя нюансик. По умолчанию реквизит доступности = ложь. А значит изменение всегда заблокировано. Лучше установить блокировку если реквизит приобретет истину. А то получается что в новых документах у тебя уже изменять нельзя.

Ermak
18.03.2013 08:56 Ответ № 22

(20) DJ_Serega, можно пример а то плохо понятно.
(21) DJ_Serega, точно я не заметил, а что вы имеете ввиду блокировку. У меня смысл был такой, я создаю документ Подпись, нажимаю там на кнопку и блокирую все документы с установленными параметрами Организация и Квартал, а почему новые теперь блокируются не понятно.

DJ_Serega
19.03.2013 00:35 Ответ № 23

(22) Ermak, по 21му теперь исправили и оно корректно? *17

(22) Ermak, с (20) DJ_Serega это по поводу (19) Ermak? Если «истина» *17 тогда где-то так:

Код 1C v 8.х

 
ЗапросБлокировка = Новый Запрос(
"ВЫБРАТЬ
| РегистрНакопления1.Регистратор КАК ДокументБлокировкиРегистратор,
| РегистрНакопления1.Измерение1 КАК ДокументБлокировкиИзмерение,
| РегистрНакопления1.Ресурс1 КАК ТутТолькоЧисло,
| РегистрНакопления1.Реквизит2 КАК ДокументБлокировкиРеквизит
|ИЗ
| РегистрНакопления.РегистрНакопления1 КАК РегистрНакопления1
|ГДЕ
| РегистрНакопления1.Регистратор.Номер = &Номер
| И РегистрНакопления1.Регистратор.Дата = &Дата"
);
ЗапросБлокировка.УстановитьПараметр("Номер", НомерПоиска);
ЗапросБлокировка.УстановитьПараметр("Дата", ДатаПоиска);

РезультатБлокировкаВыполнить = ЗапросБлокировка.Выполнить();
Если РезультатБлокировкаВыполнить.Пустой() Тогда
Предупреждение("Документы для блокировки не найдены.");
Возврат;
КонецЕсли;

РезультатБлокировка = РезультатБлокировкаВыполнить.Выбрать();
Пока РезультатБлокировка.Следующий() Цикл

Если НужныйДокумент = "Это регистратор" Тогда
ОбъектБлокировки = РезультатБлокировка.ДокументБлокировкиРегистратор.ПолучитьОбъект();
ОбъектБлокировки.РеквизитХраненияДоступности = Истина;
ОбъектБлокировки.Записать();
КонецЕсли;

Если НужныйДокумент = "Это Измерение" Тогда
ОбъектБлокировки = РезультатБлокировка.ДокументБлокировкиИзмерение.ПолучитьОбъект();
ОбъектБлокировки.РеквизитХраненияДоступности = Истина;
ОбъектБлокировки.Записать();
КонецЕсли;

Если НужныйДокумент = "Это Ресурс" Тогда
// Такого быть не может ;)
КонецЕсли;

Если НужныйДокумент = "Это реквизит" Тогда
ОбъектБлокировки = РезультатБлокировка.ДокументБлокировкиРеквизит.ПолучитьОбъект();
ОбъектБлокировки. РеквизитХраненияДоступности = Истина;
ОбъектБлокировки.Записать();
КонецЕсли;

КонецЦикла;

*09


Изменено 19.03.13 00:37:20 по причине: Очепятки ))

Ermak
20.03.2013 09:34 Ответ № 24

(23) DJ_Serega, по 21 я не исправил, не могу додумать как это сделать, можете подсказать

DJ_Serega
21.03.2013 00:02 Ответ № 25

(24) Ermak, вот ответ (7) E_Migachev

Ermak
22.03.2013 10:18 Ответ № 26

(25) DJ_Serega, я не понимаю этот кодКод 1C v 8.х

 	|	РегистрНакопления1.Измерение1 КАК ДокументБлокировкиИзмерение,
| РегистрНакопления1.Ресурс1 КАК ТутТолькоЧисло,
| РегистрНакопления1.Реквизит2 КАК ДокументБлокировкиРеквизит

Вы имеете ввиду поставить любое измерение и ресурс и реквизит? Мне нужно заблокировать полностью документ, чтобы его можно было только смотреть.


Изменено 22.03.13 10:18:51

DJ_Serega
25.03.2013 12:25 Ответ № 27

Ссылка на документ может быть там где ДокументБлокировки. Вы его таким образом получите для того что бы заблокировать.

Ermak
25.03.2013 12:30 Ответ № 28

че та я не много не понимаю, можете лучше примером показать

DJ_Serega
25.03.2013 22:51 Ответ № 29

(28) Ermak, я ж писал в (23) DJ_Serega.
Если нужный документ находится в измерении тогда «Это измерение», если в реквизите тогда «Это реквизит».
Допустим нужный документ для блокировки это Регистратор регистра. Тогда код по блокировке будет:
Код 1C v 8.х

 
Пока РезультатБлокировка.Следующий() Цикл

ОбъектБлокировки = РезультатБлокировка.ДокументБлокировкиРегистратор.ПолучитьОбъект();
ОбъектБлокировки.РеквизитХраненияДоступности = Истина;
ОбъектБлокировки.Записать();

КонецЦикла;

Ermak
26.03.2013 12:11 Ответ № 30

(29) DJ_Serega, Большое спасибо разобрался! Сделал не много по другому. )

DJ_Serega
26.03.2013 20:46 Ответ № 31

(30) Ermak, Главное что разобрался и сделал *02
Наша задача «помочь» выполнена *12

з.ы.: темку то можно и закрыть *17

Ermak
27.03.2013 09:05 Ответ № 32

Хорошо )

Ermak
27.03.2013 09:05 Ответ № 33

Вопрос закрыт!

Подсказка: Для выделения Кода используйте (в редакторе).

Ограничение на изменение реквизита документа на уровне ролей

Я
   drdroid

14.02.11 — 19:54

Создаю новую роль, в ней необходимо установить ограничение на редактирование документа — пользователь с этой ролью должен иметь право изменять в этом документе только один конкретный реквизит, для остальных реквизитов доступ только на чтение. Т.е. он может сохранить/провести документ только если не пытался изменить любой реквизит документа, кроме одного разрешенного.

В книге знаний статья этого не описывает.

  

Партнерская программа EFSOL Oblako

   poligraf

1 — 14.02.11 — 19:59

(0) Может я и не прав… Но RLS, например, тебе не поможет. Поскольку он отрабатывает в момент чтения данных, т.е. при открытии. А тебе надо при записи документа — пилить и пилить.

   drdroid

2 — 14.02.11 — 20:05

В RLS есть право «Изменение», думаю можно наложить ограничение на него и запросом сравнить реквизиты до изменения и после, если все реквизиты, кроме указанного, остались без изменений то разрешить изменение иначе запретить, вот только как получить значения реквизитов до изменения и после изменения.
Да и топорный это способ.

   Defender aka LINN

3 — 14.02.11 — 20:30

(2) Ну, расскажи, как ты получишь «реквизиты до изменения и после» в запросе RLS.

   drdroid

4 — 14.02.11 — 21:13

О если б я знал как это сделать, в SQLPlus это сделать легко, а вот в запросе RLS… наверно надо дополнительный регистр с неким подобием версионирования — но это тот еще изврат… Наверно таки ПриЗаписи() или доступность на форме менять…

   AlexNew

5 — 14.02.11 — 21:15

(4) Наверно таки ПередЗаписью()

   Mitriy

6 — 14.02.11 — 21:16

(0) переходи на 8.2…

   DmitrO

7 — 14.02.11 — 21:18

наверно таки ПриОткрытии :)

   AlexNew

8 — 14.02.11 — 21:20

(7) Проверку ПриОткрытии(), или доступность реквизитов?

   DmitrO

9 — 14.02.11 — 21:26

(8)проверку роли или права и управление доступностью реквизитов и поведением стандартных кнопок
(6)а там что, разьве легче?

   Mitriy

10 — 14.02.11 — 21:29

(9) ну там как бы вплоть до реквизитов можно права устанавливать…

   DmitrO

11 — 14.02.11 — 21:35

(10)тока на просмотр ведь, пишется-то все равно весь объект.

   Mitriy

12 — 14.02.11 — 21:38

(11) «пользователь с этой ролью должен иметь право изменять в этом документе только один конкретный реквизит, для остальных реквизитов доступ только на чтение»

я как-то неправильно понял эту фразу из сабжа?

   Mily

13 — 14.02.11 — 21:44

Все реквизиты документа из однго месте? А если наложить запрет на регистр, в котором хранятся этот самый реквизит, например?

   ILM

14 — 14.02.11 — 21:46

Эх, почему наши доблестные молодые коллеги любят решать всё шашкой, на козе, в валенках, по уши в г…не?

Какую роль вы создаете? Для одного реквизита? А для другого другую роль? Вы случайно не функцию согласования или утверждения реализуете?
Пилите БП и задачи пользователя. На Задачу делайте форму — пусть правит реквизит, и толкает процесс дальше.

Господи, ну когда они наконец-то изучат 1С?

   ILM

15 — 14.02.11 — 21:49

На краяйняк, добавьте этот реквизит в форме, как переменную нужного типа. И перед закрытием пишите в свой объект.

   DmitrO

16 — 14.02.11 — 21:55

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

   drdroid

17 — 14.02.11 — 23:39

(14) Нет, не функция согласования и нет, роль не на один реквизит, и еще раз нет — тут БП городить нецелесообразно.
Роль существенно ограничивает права, по сути для большинства объектов доступ только на чтение, но есть документ в котором необходимо менять статус, при этом надо исключить возможность умышленного/неумышленного изменения других реквизитов. Да, я думаю было бы удобно (и логично) реализовать это ограничениями RLS, но так как RLS не позволяет это сделать без костылей, то останавливаюсь на изменении доступности полей.

   Jackman

18 — 15.02.11 — 01:38

Если РольДоступна(Метаданные.Роли.НужныеПрава) Тогда

   Для каждого тек из  ЭлементыФормы Цикл

               Если (ТипЗнч(тек)= Тип(«ПолеВвода»)) Тогда
           тек.ТолькоПросмотр = Истина;
       КонецЕсли;

               Если (ТипЗнч(тек)= Тип(«Флажок»))или(ТипЗнч(тек)= Тип(«ТабличноеПоле»)) Тогда
           тек.Доступность = Ложь;
       КонецЕсли;
   КонецЦикла;

ЭлементыФормы.НужныйРеквизит.ТолькоПросмотр = Ложь;

КонецЕсли;

   drdroid

19 — 15.02.11 — 10:17

(18) Спасибо, примерно так и думал.

   Kerk

20 — 15.02.11 — 10:27

(18) Как я понял это только на форме ограничение…
Остается дырка программного изменения, так же обработка группового изменения (Геморно, но если «вредителю» нужно, он это сделает)…

  

drdroid

21 — 15.02.11 — 12:38

(19) Это уже через RLS закрою возможность открытия внешних обработок/отчетов и некоторых внутренних.

В 1С можно настроить ограничения по ролям, т.е. запретить пользователям с определенной ролью изменять какие либо реквизиты или объекты конфигурации. Например, при создание или открытии какого либо документа (справочника) можно запретить изменять номер, дату или другие необходимые элементы. На практики подобные задачи встречаются довольно часто, так как некоторые пользователи могут поменять дату документ или его номер, тем самым нарушить учет документооборота. Реализовать все это достаточно просто.

Программное ограничения по ролям в 1С

Допустить у нас в базе есть роль «Пользователь» и нам необходимо всем учетным записям с данной ролью запретить изменять номер и дату документа поступления, а так же указывать в поле «Ответственный» наименование роли.

1C Ограничения по ролям

Для этого в обработчике события «При создании на сервере» пишем вот такой код.

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

Думаю в нем все понять, если учетная запись под которой создается документ имеет роль «Пользователь» тогда запрещаем редактировать «Номер», «Дату» и в поле «Ответственный» подставляем значение из справочника «Пользователи» которое найдем по коду. Под данным кодом в справочнике находиться «Пользователь».

1C Как ограничить доступ к некоторым реквизитам документа для определённой роли программно

Запустим 1С и посмотрим что получилось, в итоге ввести что-то с клавиатуры в поля «Номер», «Дата» не получиться.

1C Как ограничить доступ к некоторым реквизитам для определённой роли

Но если у данного поля есть возможность выбора, например, как у даты то изменить её все же буде возможно.

1C Как ограничить доступ к некоторым реквизитам для определённой роли программно

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

Элементы.Дата.Доступность = Ложь;
Элементы.Номер.Доступность = Ложь;
Элементы.Отвественный.Доступность = Ложь;
1C отключаем доступность

В этом случае пользователь уже ни чего не сможет сделать.

1С как отключить доступность по ролям

Вариантов реализации подобных задач очень много, я показал один из, возможно он даже не самый оптимальной. Если Вы знаете другой обязательно поделитесь!!!

Кстати механизм подставления «Ответственного» тут не совсем корректен, так как в базе может быть много пользователей 10, 20 и если у всех у них есть роль «Пользователь» то она и будет подставляться, тут необходимо подставлять имя пользователя а не роли, с помощью ПользователиИнформационнойБазы.ТекущийПользователь() но об этом в следующей статье.

В одном из занятий курса Настройка и доработка прав доступа, профилей пользователей и RLS в типовых конфигурациях рассматривается работа с подсистемой БСП “Запрет редактирования реквизитов объектов”. На конкретном примере тренер реализовывает запрет редактирования ряда полей и табличной части “Товары” на форме документа “План продаж”.

Напомним, что для реализации запрета редактирования данных формы нужно выполнить ряд действий, среди которых:

  1. Подключение документа к подсистеме БСП

Общий модуль ЗапретРедактированияРеквизитовОбъектовПереопределяемый

Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами()

Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт    
 //++ НЕ ГОСИС
ОбменДаннымиУТУП.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты);
Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта");//-- НЕ ГОСИС

 //++ изменения
 Объекты.Вставить(Метаданные.Документы.ПланПродаж.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта");
 //-- изменения    
КонецПроцедуры

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

Вопрос

Добрый день! Как заблокировать доступ не к табличной части целиком, а к отдельной колонке табличной части? Например: Товары.Номенклатура.

Ответ тренера

Добрый день! Для блокировки редактирования отдельной колонки табличной части, например, колонки “Номенклатура”, нужно исправить код функции ПолучитьБлокируемыеРеквизитыОбъекта() на следующий:

Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
Результат = Новый Массив;
Результат.Добавить("Статус;ФормаПровестиИЗакрыть,ФормаЗаписать,ФормаПровести");
Результат.Добавить("НачалоПериода;УстановитьИнтервал");
Результат.Добавить("ОкончаниеПериода");
Результат.Добавить("Сценарий");
Результат.Добавить("ВидПлана");
Результат.Добавить("Товары.Номенклатура; ТоварыНоменклатура, ТоварыПоПериодамНоменклатура");
Возврат Результат;
КонецФункции

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

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

Иногда необходимо разрешить редактирование некоторых реквизитов документа без перепроведения. Например: Комментарий, АдресКонтрагента, КонтактноеЛицо. Ещё бывает необходимым разрешить изменение отдельных реквизитов в закрытых документах. Например, поставить отметку о состоянии доставки и написать комментарий.

В модуле менеджера документа пишем функцию, которая определяет массив допустимых к редактированию реквизитов

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// Возвращает массив имён реквизитов, разрешённых для изменнения без перепроведения.

// Если получен параметр типа Массив, то имена реквизитов добавляются в него

Функция ПолучитьМассивРеквизитовИзменяемыхБезПерепроведения(МассивРеквизитовДопустимыхКИзменению = Неопределено) Экспорт

Если Не ТипЗнч(МассивРеквизитовДопустимыхКИзменению) = Тип(«Массив») Тогда

МассивРеквизитовДопустимыхКИзменению = Новый Массив;

КонецЕсли;

//Типовые реквизиты

МассивРеквизитовДопустимыхКИзменению.Добавить(«Грузополучатель»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьНомер»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьДата»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьНомер»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьВыдана»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьЧерезКого»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«Комментарий»);

МассивРеквизитовДопустимыхКИзменению.Добавить(«АдресДоставки»);

//Добавленные реквизиты

Возврат МассивРеквизитовДопустимыхКИзменению;

КонецФункции

В модуле ОбщегоНазначения пишем функции общие для всех документов.

// сравниваем реквизиты документа из базы данных с записываемым объектом

// имена изменённых реквизитов запихываем в массив

Функция ПолучитьСписокИзменённыхРеквизитов(ДокОбъект) Экспорт

СписокИзменённыхРеквизитов = Новый Массив;

Ссылка = ДокОбъект.Ссылка;

мдОбъекта = ДокОбъект.Метаданные();

// сравниваем стандартные реквизиты

Для Каждого Реквизит из мдОбъекта.СтандартныеРеквизиты Цикл

Если ДокОбъект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда

СписокИзменённыхРеквизитов.Добавить(Реквизит.Имя);

КонецЕсли;

КонецЦикла;

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

РедактированиеЗаднимЧислом = Ложь;

МассивРеквизитовДопустимыхКИзменению = Документы.РеализацияТоваровУслуг.ПолучитьМассивРеквизитовИзменяемыхБезПерепроведения();

СписокИзменённыхРеквизитов = ОбщегоНазначения.ПолучитьСписокИзменённыхРеквизитов(ЭтотОбъект);

СписокИзменённыхРеквизитовВызывающихПерепроведение = ОбщегоНазначения.МожноЗаписыватьБезПерепроведения(ЭтотОбъект, МассивРеквизитовДопустимыхКИзменению, СписокИзменённыхРеквизитов);

Если СписокИзменённыхРеквизитовВызывающихПерепроведение = «» И Проведен И СписокИзменённыхРеквизитов.Количество() > 0 Тогда

РежимЗаписи = РежимЗаписиДокумента.Запись;

ИначеЕсли НЕ РедактированиеЗаднимЧислом и Дата < НачалоДня(ТекущаяДата()) И Не РольДоступна(«ПравоАдминистрирования») Тогда

Сообщить(«Недостаточно прав для проведения реализации « + Номер + » « + Строка(Дата) +

» задним числом. Изменены реквизиты: « + СписокИзменённыхРеквизитовВызывающихПерепроведение);

Отказ = Истина;

КонецЕсли;

 

Оцените статью:

Загрузка…

Если Вы заметили ошибку, то выделите ее мышью и нажмите Ctrl+Enter

Понравилась статья? Поделить с друзьями:
  • 1с запрос проверка на заполнение реквизита
  • 1с изменить реквизит справочника обработка
  • 1с история изменения реквизита справочника
  • 1с как обновить реквизит управляемой формы
  • 1с как обратиться к реквизиту формы отчета