Как в 8.3 программно *без прав* записать в реквизит табличной части документа?

1. DWZ2 11.11.19 11:34 Сейчас в теме
В 1С 8.3 в табличной части документа есть реквизиты "Номенклатура" (типа "СправочникСсылка.Номенклатура") и "Цена". При интерактивном выборе номенклатуры автоматически подставляется цена из справочника, для чего в форме документа существует такой код:

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	Стр=Элементы.Товары.ТекущиеДанные;
	
	Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
		
	РассчитатьСумму();
КонецПроцедуры

&НаСервереБезКонтекста
Функция  ПолучитьЦену(Номенклатура)
	Возврат Номенклатура.ЦенаПродажи;
КонецФункции
Показать


По условию задачи у пользователя нет права на редактирование реквизита "Цена" (Если бы 1С разделяла программное и интерактивное изменение - вопроса бы не было)

Вопрос Как устанавливать цену при выборе номенклатуры в этом случае?

Есть привилегированный режим, но он работает только на сервере.

Я думал: "Сделаю как всегда - вызову вспомогательную серверную процедуру"

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	Стр=Элементы.Товары.ТекущиеДанные;
	
	УстановитьПривилегированныйРежимНаСервере(Истина);
	Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
	УстановитьПривилегированныйРежимНаСервере(Ложь);
	
	РассчитатьСумму();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УстановитьПривилегированныйРежимНаСервере(Включить)
	УстановитьПривилегированныйРежим(Включить);
КонецПроцедуры
Показать


Не работает

Если передать текущую строку на сервер и менять цену уже там
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	Стр.Цена=ПолучитьЦену(Элементы.Товары.ТекущиеДанные);
	
	РассчитатьСумму();
	
КонецПроцедуры

&НаСервере
Процедура  ПолучитьЦену(Стр)
	УстановитьПривилегированныйРежим(Истина);
	Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
	УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать


ругается Ошибка отображения типов: Отсутствует отбражение для типа 'ДанныеФормыЭлементКоллекции'

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

Что делать? Включать пользователю права по условию задачи нельзя!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
21. Azamatex 12 11.11.19 14:00 Сейчас в теме
(20)Тогда заполнение цены можно делать без привилегированного режима, а вот запись объекта с привилегированным. У вас что за конфигурация? Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.

Примерно так
ЗаполнитьДокумент(Объект.Ссылка);//Тут вы и делаете заполнение и запись в привилегированном режиме
ОповеститьОбИзменении(Объект.Ссылка);
	
ТекФорма = ПолучитьФорму("Документ.ИмяВашегоДокумента.ФормаОбъекта", Новый Структура("Ключ", Объект.Ссылка));
ТекФорма.Прочитать();
22. DWZ2 11.11.19 14:01 Сейчас в теме
(19) БОЛЬШОЕ спасибо!
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:

1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;


2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()

И в итоге имеем:

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
	Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
	РассчитатьСумму();
    
КонецПроцедуры

&НаСервере
Процедура Обработатьобъект(индекс)
    УстановитьПривилегированныйРежим(Истина);

	ДокОбъект = РеквизитФормыВЗначение("Объект");
	Стр = ДокОбъект.Товары[индекс];
    // Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
	Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
    ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
	
	УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 11.11.19 11:47 Сейчас в теме
(1)
у пользователя нет права на редактирование реквизита "Цена"
- как это настроено ?
7. DWZ2 11.11.19 12:45 Сейчас в теме
(2) см. рисунок
Прикрепленные файлы:
4. lefthander 11.11.19 11:48 Сейчас в теме
(1)перенести расчет цены в серверный модуль. Нет?
10. DWZ2 11.11.19 12:52 Сейчас в теме
(4) Уже. Ругается не на вычисление цены, а на ПРИСВАИВАНИЕ, потому что у юзера нет прав на изменение цены.
Прикрепленные файлы:
12. Xershi 1483 11.11.19 12:56 Сейчас в теме
(1) цена рассчитывает на основе вида цены и параметров документа.
Клиентские типы на сервер не нужно перебрасывать и все!
Посчитай цену на сервере и верни ее на клиент. А там уже меняй. Если есть права у пользователя.
Если нужно на сервере. Так редактируй объект, а не форму!!
alex-l19041; ice-net; chg; +3 Ответить
13. DWZ2 11.11.19 13:03 Сейчас в теме
(12)
Посчитай цену на сервере и верни ее на клиент.


Уже посчитал, уже вернул.

А там уже меняй. Если есть права у пользователя.


А если нет?
14. Xershi 1483 11.11.19 13:04 Сейчас в теме
(13) читай тогда (12) внимательно.
15. DWZ2 11.11.19 13:13 Сейчас в теме
(14) Нет, это ты читай внимательно.

Вернуть цену с сервера у меня проблем нет. Проблема записать цену в табличную часть, потому что у юзера нет прав.
Прикрепленные файлы:
25. Xershi 1483 11.11.19 14:07 Сейчас в теме
(15) в (19) прочитали за вас. Чукча не читатель!
3. Azamatex 12 11.11.19 11:48 Сейчас в теме
Вы вместо строки, попробуйте отправить только номенклатуру на сервер
8. DWZ2 11.11.19 12:46 Сейчас в теме
(3) Так я и отправлял. Проблема в том, что надо прописать цену в табличную часть, а прав нет и прив. режим на клиенте не работает.
16. Azamatex 12 11.11.19 13:16 Сейчас в теме
(8)Тогда заполнение и запись объекта делайте на сервере, где вы и будете включать привилегированный режим.
17. DWZ2 11.11.19 13:20 Сейчас в теме
(16) Вот я и хочу это сделать, но как?

Если передать текущую строку на сервер и менять цену уже там


&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    Стр.Цена=ПолучитьЦену(Элементы.Товары.ТекущиеДанные);
    
    РассчитатьСумму();
    
КонецПроцедуры

&НаСервере
Процедура  ПолучитьЦену(Стр)
    УстановитьПривилегированныйРежим(Истина);
    Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать


ругается Ошибка отображения типов: Отсутствует отбражение для типа 'ДанныеФормыЭлементКоллекции'


Или тут какое-то извращение нужно сделать - передать табличную часть или форму на сервер через строку или через хранилище или что?
18. Azamatex 12 11.11.19 13:33 Сейчас в теме
(17) Вы где прописываете этот код? В форме самого документа?
20. DWZ2 11.11.19 13:46 Сейчас в теме
21. Azamatex 12 11.11.19 14:00 Сейчас в теме
(20)Тогда заполнение цены можно делать без привилегированного режима, а вот запись объекта с привилегированным. У вас что за конфигурация? Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.

Примерно так
ЗаполнитьДокумент(Объект.Ссылка);//Тут вы и делаете заполнение и запись в привилегированном режиме
ОповеститьОбИзменении(Объект.Ссылка);
	
ТекФорма = ПолучитьФорму("Документ.ИмяВашегоДокумента.ФормаОбъекта", Новый Структура("Ключ", Объект.Ссылка));
ТекФорма.Прочитать();
24. DWZ2 11.11.19 14:07 Сейчас в теме
(21)
Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.

Тоже спасибо за совет. Буду знать. Кстати, об таких приёмах где-то написано? Или это тайное знание, передаваемое из уст в уста?

У вас что за конфигурация?


Тренировочная самописка. См. вложение. Требуется, чтобы Сидорчук видел цену в расходной накладной, но менять ей не мог. И чтобы при этом цена автоматически подставлялась из справочника "Номенклатура"
Прикрепленные файлы:
1Cv8.dt
26. Azamatex 12 11.11.19 14:33 Сейчас в теме
(24)В сети много примеров внешнего заполнения объекта, легко найти.
5. VmvLer 11.11.19 11:51 Сейчас в теме
сначала разберитесь с базовой логикой УФ и контекстов - очевидно, что есть пробелы.
просто нет смысла говорит о том как работать с посудомоечной машиной если человек не прочел инструкцию.

либо читаем инструкцию сами, либо пытаем "продавца"
11. DWZ2 11.11.19 12:54 Сейчас в теме
(5) "продавец" обещал разбрать на следующем занятии и "слил" вопрос. А мне нужно СРОЧНО.
6. VmvLer 11.11.19 11:56 Сейчас в теме
не надо жать на все кнопки сразу
сначала закроем крышку и пустим воду

&НаСервереБезКонтекста
Функция  ПолучитьЦену(Номенклатура)
    УстановитьПривилегированныйРежим(Истина);
    Возврат Номенклатура.ЦенаПродажи;
КонецПроцедуры
9. DWZ2 11.11.19 12:49 Сейчас в теме
(6) Цену-то я получу и без прив. режима. Вопрос в том, как её прописать в табличную часть?
19. ice-net 19 11.11.19 13:45 Сейчас в теме +0.24 $m
(9)
как-то так, без оптимизаций

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);

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

&НаСервере
Процедура Обработатьобъект(индекс)
     УстановитьПривилегированныйРежим(Истина);
     ДокОбъект = РеквизитФормыВЗначение("Объект");
     Стр = ДокОбъект.Товары[индекс];
     Стр.Цена=ПолучитьЦену(Стр .Номенклатура);
     РассчитатьСумму();
     ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
     УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать
22. DWZ2 11.11.19 14:01 Сейчас в теме
(19) БОЛЬШОЕ спасибо!
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:

1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;


2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()

И в итоге имеем:

&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
	Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
	РассчитатьСумму();
    
КонецПроцедуры

&НаСервере
Процедура Обработатьобъект(индекс)
    УстановитьПривилегированныйРежим(Истина);

	ДокОбъект = РеквизитФормыВЗначение("Объект");
	Стр = ДокОбъект.Товары[индекс];
    // Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
	Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
    ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
	
	УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать
23. ice-net 19 11.11.19 14:05 Сейчас в теме
(22) Какие обиды)) Просто привык все расчеты на сервере делать. Хорошего дня!) Хотя Вам подсказку еще в (12) дали
27. triviumfan 93 11.11.19 15:00 Сейчас в теме
(22)
Элементы.Товары.ТекущиеДанные.НомерСтроки-1

Нужно было просто передавать номенклатуру. Ваш код из шапки бы итак сработал.
Ошибка была в том, что вы передавали "ДанныеФормыЭлементКоллекции".
28. DWZ2 16.11.19 11:20 Сейчас в теме
> Нужно было просто передавать номенклатуру.

А можно пример кода? Мне нужно прописать цену, поэтому мне кажется, что текущая строка необходима.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот