Как в 8.3 программно *без прав* записать в реквизит табличной части документа?
В 1С 8.3 в табличной части документа есть реквизиты "Номенклатура" (типа "СправочникСсылка.Номенклатура") и "Цена". При интерактивном выборе номенклатуры автоматически подставляется цена из справочника, для чего в форме документа существует такой код:
По условию задачи у пользователя нет права на редактирование реквизита "Цена" (Если бы 1С разделяла программное и интерактивное изменение - вопроса бы не было)
Вопрос Как устанавливать цену при выборе номенклатуры в этом случае?
Есть привилегированный режим, но он работает только на сервере.
Я думал: "Сделаю как всегда - вызову вспомогательную серверную процедуру"
Не работает
Если передать текущую строку на сервер и менять цену уже там
ругается Ошибка отображения типов: Отсутствует отбражение для типа 'ДанныеФормыЭлементКоллекции'
Думал, вынесу присвоение цены в привилегированный клиентский модуль, а они бывают только серверные.
Что делать? Включать пользователю права по условию задачи нельзя!
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Стр=Элементы.Товары.ТекущиеДанные;
Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
РассчитатьСумму();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦену(Номенклатура)
Возврат Номенклатура.ЦенаПродажи;
КонецФункции
ПоказатьПо условию задачи у пользователя нет права на редактирование реквизита "Цена" (Если бы 1С разделяла программное и интерактивное изменение - вопроса бы не было)
Вопрос Как устанавливать цену при выборе номенклатуры в этом случае?
Есть привилегированный режим, но он работает только на сервере.
Я думал: "Сделаю как всегда - вызову вспомогательную серверную процедуру"
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Стр=Элементы.Товары.ТекущиеДанные;
УстановитьПривилегированныйРежимНаСервере(Истина);
Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
УстановитьПривилегированныйРежимНаСервере(Ложь);
РассчитатьСумму();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьПривилегированныйРежимНаСервере(Включить)
УстановитьПривилегированныйРежим(Включить);
КонецПроцедуры
ПоказатьНе работает
Если передать текущую строку на сервер и менять цену уже там
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Стр.Цена=ПолучитьЦену(Элементы.Товары.ТекущиеДанные);
РассчитатьСумму();
КонецПроцедуры
&НаСервере
Процедура ПолучитьЦену(Стр)
УстановитьПривилегированныйРежим(Истина);
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показатьругается Ошибка отображения типов: Отсутствует отбражение для типа 'ДанныеФормыЭлементКоллекции'
Думал, вынесу присвоение цены в привилегированный клиентский модуль, а они бывают только серверные.
Что делать? Включать пользователю права по условию задачи нельзя!
По теме из базы знаний
- Выгрузка-загрузка любых данных из 1С (и измененных) в XML между похожими конфигурациями (ФАЙЛ, HTTP, COM) ЛЮБЫХ баз 1С 8.1-8.3 с обработкой и поиском данных по произвольным полям поиска
- Конфигурация "Весовая ред. 3.0" для Платформы 1С 8.3
- Загрузка чеков в 1С из ФНС в документы БП, УНФ, ERP, КА и УТ
- Прикрепление внешних файлов к документам и справочникам 1С 8.3
- Конвертация данных 3.0: приемы работы. Обзор. Часть 2
Найденные решения
(20)Тогда заполнение цены можно делать без привилегированного режима, а вот запись объекта с привилегированным. У вас что за конфигурация? Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.
Примерно так
Примерно так
ЗаполнитьДокумент(Объект.Ссылка);//Тут вы и делаете заполнение и запись в привилегированном режиме
ОповеститьОбИзменении(Объект.Ссылка);
ТекФорма = ПолучитьФорму("Документ.ИмяВашегоДокумента.ФормаОбъекта", Новый Структура("Ключ", Объект.Ссылка));
ТекФорма.Прочитать();
(19) БОЛЬШОЕ спасибо!
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:
1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()
И в итоге имеем:
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:
1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()
И в итоге имеем:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
РассчитатьСумму();
КонецПроцедуры
&НаСервере
Процедура Обработатьобъект(индекс)
УстановитьПривилегированныйРежим(Истина);
ДокОбъект = РеквизитФормыВЗначение("Объект");
Стр = ДокОбъект.Товары[индекс];
// Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) цена рассчитывает на основе вида цены и параметров документа.
Клиентские типы на сервер не нужно перебрасывать и все!
Посчитай цену на сервере и верни ее на клиент. А там уже меняй. Если есть права у пользователя.
Если нужно на сервере. Так редактируй объект, а не форму!!
Клиентские типы на сервер не нужно перебрасывать и все!
Посчитай цену на сервере и верни ее на клиент. А там уже меняй. Если есть права у пользователя.
Если нужно на сервере. Так редактируй объект, а не форму!!
(16) Вот я и хочу это сделать, но как?
Или тут какое-то извращение нужно сделать - передать табличную часть или форму на сервер через строку или через хранилище или что?
Если передать текущую строку на сервер и менять цену уже там
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Стр.Цена=ПолучитьЦену(Элементы.Товары.ТекущиеДанные);
РассчитатьСумму();
КонецПроцедуры
&НаСервере
Процедура ПолучитьЦену(Стр)
УстановитьПривилегированныйРежим(Истина);
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показатьругается Ошибка отображения типов: Отсутствует отбражение для типа 'ДанныеФормыЭлементКоллекции'
Или тут какое-то извращение нужно сделать - передать табличную часть или форму на сервер через строку или через хранилище или что?
(20)Тогда заполнение цены можно делать без привилегированного режима, а вот запись объекта с привилегированным. У вас что за конфигурация? Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.
Примерно так
Примерно так
ЗаполнитьДокумент(Объект.Ссылка);//Тут вы и делаете заполнение и запись в привилегированном режиме
ОповеститьОбИзменении(Объект.Ссылка);
ТекФорма = ПолучитьФорму("Документ.ИмяВашегоДокумента.ФормаОбъекта", Новый Структура("Ключ", Объект.Ссылка));
ТекФорма.Прочитать();
(21)
Тоже спасибо за совет. Буду знать. Кстати, об таких приёмах где-то написано? Или это тайное знание, передаваемое из уст в уста?
Тренировочная самописка. См. вложение. Требуется, чтобы Сидорчук видел цену в расходной накладной, но менять ей не мог. И чтобы при этом цена автоматически подставлялась из справочника "Номенклатура"
Если типовая, то я рекомендовал бы использовать механизм внешнего заполнения объекта.
Тоже спасибо за совет. Буду знать. Кстати, об таких приёмах где-то написано? Или это тайное знание, передаваемое из уст в уста?
У вас что за конфигурация?
Тренировочная самописка. См. вложение. Требуется, чтобы Сидорчук видел цену в расходной накладной, но менять ей не мог. И чтобы при этом цена автоматически подставлялась из справочника "Номенклатура"
Прикрепленные файлы:
1Cv8.dt
сначала разберитесь с базовой логикой УФ и контекстов - очевидно, что есть пробелы.
просто нет смысла говорит о том как работать с посудомоечной машиной если человек не прочел инструкцию.
либо читаем инструкцию сами, либо пытаем "продавца"
просто нет смысла говорит о том как работать с посудомоечной машиной если человек не прочел инструкцию.
либо читаем инструкцию сами, либо пытаем "продавца"
(9)
как-то так, без оптимизаций
как-то так, без оптимизаций
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
КонецПроцедуры
&НаСервере
Процедура Обработатьобъект(индекс)
УстановитьПривилегированныйРежим(Истина);
ДокОбъект = РеквизитФормыВЗначение("Объект");
Стр = ДокОбъект.Товары[индекс];
Стр.Цена=ПолучитьЦену(Стр .Номенклатура);
РассчитатьСумму();
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать
(19) БОЛЬШОЕ спасибо!
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:
1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()
И в итоге имеем:
Ну вот, теперь благодаря ice-net всё работает. Не в обиду, маленькие уточнения:
1) ПолучитьЦену() - это вспомогательная процедура для клиента. На сервере сработает и напрямик
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
2) РассчитатьСумму() - это клиентская процедура, поэтому она должна находиться в ТоварыНоменклатураПриИзменении()
И в итоге имеем:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
Обработатьобъект(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
РассчитатьСумму();
КонецПроцедуры
&НаСервере
Процедура Обработатьобъект(индекс)
УстановитьПривилегированныйРежим(Истина);
ДокОбъект = РеквизитФормыВЗначение("Объект");
Стр = ДокОбъект.Товары[индекс];
// Стр.Цена=ПолучитьЦену(Стр.Номенклатура);
Стр.Цена=Стр.Номенклатура.ЦенаПродажи;
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот