1. DWZ2 11.11.19 11:34 Сейчас в теме

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

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

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

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


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

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

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

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

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

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


Не работает

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

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


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

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

Что делать? Включать пользователю права по условию задачи нельзя!
Вознаграждение за ответ
Показать полностью
Найденные решения
21. Azamatex 8 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 759 11.11.19 12:56 Сейчас в теме
(1) цена рассчитывает на основе вида цены и параметров документа.
Клиентские типы на сервер не нужно перебрасывать и все!
Посчитай цену на сервере и верни ее на клиент. А там уже меняй. Если есть права у пользователя.
Если нужно на сервере. Так редактируй объект, а не форму!!
alex-l19041; ice-net; chg; +3 Ответить
13. DWZ2 11.11.19 13:03 Сейчас в теме
(12)
Посчитай цену на сервере и верни ее на клиент.


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

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


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

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

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


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

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


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


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

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

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

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


Тренировочная самописка. См. вложение. Требуется, чтобы Сидорчук видел цену в расходной накладной, но менять ей не мог. И чтобы при этом цена автоматически подставлялась из справочника "Номенклатура"
Прикрепленные файлы:
1Cv8.dt
26. Azamatex 8 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 18 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 18 11.11.19 14:05 Сейчас в теме
(22) Какие обиды)) Просто привык все расчеты на сервере делать. Хорошего дня!) Хотя Вам подсказку еще в (12) дали
27. triviumfan 10 11.11.19 15:00 Сейчас в теме
(22)
Элементы.Товары.ТекущиеДанные.НомерСтроки-1

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

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

Вакансии

Программист/Cтарший программист 1С
Москва
зарплата от 100 000 руб. до 250 000 руб.
Полный день

Программист 1С
Калининград
зарплата от 60 000 руб. до 80 000 руб.
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день

Программист 1С
Новосибирск
зарплата от 80 000 руб. до 150 000 руб.
Полный день

Программист 1С
Красноярск
зарплата от 50 000 руб.
По совместительству