Имя: Пароль:
1C
1С v8
Связь между сервером и клиентом
,
0 Arzu
 
17.07.13
13:47
Есть документ с табличной частью. Перед удалением хочу все данные записать в Регистр сведений.
&НаКлиенте
Процедура ВзаиморасчетыПередУдалением(Элемент, Отказ)
   ТекущаяСтрока = Элементы.Взаиморасчеты.ТекущиеДанные;
   Режим = РежимДиалогаВопрос.ОКОтмена;
   Текст = "-------";
   Ответ = Вопрос(Текст, Режим, 0);
   Если Ответ = КодВозвратаДиалога.Отмена Тогда
   Отказ = Истина;
   Иначе
   ЗаписьУдаленныхСтрок(Объект.Номер);
   КонецЕсли;
КонецПроцедуры

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

Подскажите пожалуйста как правильней?
1 Arzu
 
17.07.13
13:47
Перед удалением строки имел ввиду
2 1Сергей
 
17.07.13
13:48
СуммаВрача - это сильно!
3 kosts
 
17.07.13
13:48
Записывать скорее всего нужно в "призаписи". Для чего это нужно, то?
4 Maxus43
 
17.07.13
13:49
зачем?
5 Maxus43
 
17.07.13
13:49
(2) ладно хоть не ПациентОрганы
6 kosts
 
17.07.13
13:51
Сделайте лучше отбор, что бы старые документы не маячили и ничего удалять не нужно.
7 Arzu
 
17.07.13
13:51
(3) Строки добавляются в течении месяца, вдруг если оператор случайно или намеренно удалил какую-то строку записать эту строку в регистр сведений, потом когда я смотрел знать что он удалил. Если все верно очищу эту строку из регистра сведений
8 Arzu
 
17.07.13
13:52
(6) один документ один месяц
9 kosts
 
17.07.13
13:55
(7) Как-то всё сложно.
10 drcrasher
 
17.07.13
13:56
кури передЗаписью()
11 Maxus43
 
17.07.13
13:58
Запросом, Передзаписью.
Вытаскиваешь различия между ТЧ ИБ и Объекта, пишешь разницу в регистр. Опираться на интерактивные действия юзера не надо
12 kosts
 
17.07.13
14:03
Если документов вводится мало, то сделай в метаданных копию документа (версии). При каждой записи своего документа делай полную копию документа, т.е. новую версию. Сделать просто, в подписке можно.
Только в документе версии нужно будет отключить уникальность.
Либо из БСП версионирование подтянуть...
13 Maxus43
 
17.07.13
14:04
(12) тут надо для анализа это, а анализировать версионирование неблагодарное дело...
14 1Сергей
 
17.07.13
14:07
У строки табличной части нет собственной ссылки
15 hhhh
 
17.07.13
14:18
(7) вот это - очень странная строка.

Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.ДеньМесяца


похоже не 1совская. Откуда-то вклинилась.
16 Arzu
 
17.07.13
14:23
Вообще-то мне нужно в этой процедуре

&НаКлиенте
Процедура ВзаиморасчетыПередУдалением(Элемент, Отказ)
   ТекущаяСтрока = Элементы.Взаиморасчеты.ТекущиеДанные;
   Режим = РежимДиалогаВопрос.ОКОтмена;
   Текст = "-------";
   Ответ = Вопрос(Текст, Режим, 0);
   Если Ответ = КодВозвратаДиалога.Отмена Тогда
   Отказ = Истина;
   Иначе
   // При нажатии ок записать эту строку в Регистр сведений. В тонком клиенте не получается, надо операцию выполнить на сервере и как-то передать сюда. Как это сделать?
   КонецЕсли;
КонецПроцедуры
17 Maxus43
 
17.07.13
14:25
(16) а если юзер из ТЧ удалит, потом передумает и не запишет документ? Не надо ориентироваться на его действия
18 1Сергей
 
17.07.13
14:44
вообще, вот этот кусок накладывает отпечаток на сознание:

 МенеджерЗаписи.Организация = Документы.ВзаиморасчетыСКлиентами.НайтиПоРеквизиту(Объект.Номер);
   МенеджерЗаписи.ДеньМесяца = Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.ДеньМесяца;
   МенеджерЗаписи.Контрагент = Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.Контрагент;
   МенеджерЗаписи.Цена = Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.Цена;
   МенеджерЗаписи.СуммаВрача = Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.СуммаВрача;
   МенеджерЗаписи.Касса = Документы.ВзаиморасчетыСКлиентами.Взаиморасчеты.Касса;
19 Arzu
 
17.07.13
14:49
(17) Дело в том что на кнопку удалить есть процедура которая выдает диалоговое окно Ок или Отмена, если отмена то возврат, если Ок то сразу идет запись в регистр сведений. Т.е. нет необходимости записывать документ.
20 Maxus43
 
17.07.13
14:53
(19) я не к тому, а к тому что если юзер не запишет документ - то по факту документ старый со всеми записями, и в регистре тоже запись
21 Arzu
 
17.07.13
15:01
(20) А если после записи в регистр вызову запись самого документа?
22 Maxus43
 
17.07.13
15:06
(21) а если пользователь не туда нажал и документ записывать не хотел?) это просто непривычное поведение документа, и лучше не надо имхо
23 kosts
 
17.07.13
15:09
(21) Я все же за версионирование. Что будет, если сотр возьмет и каждую ячейку строки изменит - вроде строку не удаляли, а вот не стало данных...
24 Arzu
 
17.07.13
15:10
(22) Понятно. Спасибо за внимание.
25 Arzu
 
17.07.13
15:11
(23) Надо бы посмотреть как устроен механизм версионирования.
26 kosts
 
17.07.13
15:13
(25) Можно по простому - просто копия документа.
27 kosts
 
17.07.13
15:17
Если строк в документе сильно много, то можно дополнительно скрытый реквизит в ТЧ завести, так сказать ИД, что бы можно было автоанализ делать - какие строки удалены, какие изменены, какие исправлены...
28 Arzu
 
17.07.13
15:24
А как мне запретить удаления оператору? Делаю так

&НаКлиенте
Процедура ВзаиморасчетыПередУдалением(Элемент, Отказ)
Если РольДоступна("Оператор") Тогда
   Отказ = Истина;    
КонецЕсли;
КонецПроцедуры

В тонком клиенте не идет, как из сервера передать?
29 kosts
 
17.07.13
15:28
(28) Вызвать серверную функцию, там проверить, назад вернуть отказ или нет.
30 Arzu
 
17.07.13
15:30
(29) Это-то я знаю, а вот как реализовать, вот в чем вопрос)
31 AaNnDdRrEeYy
 
17.07.13
15:52
(30) реализовать так:
1. написать функция серверную
&НаСервере
РольДоступнаСервер()
2. вернуть значение
Возврат РольДоступна("Оператор");
32 Arzu
 
17.07.13
16:09
(31)
&НаСервере
Функция ПроверкаДоступа()
   Если РольДоступна("Оператор") Тогда
   Отказ = Истина;
   КонецЕсли;
   Возврат РольДоступна("Оператор");
КонецФункции

&НаКлиенте
Процедура ВзаиморасчетыПередУдалением(Элемент, Отказ)
   ПроверкаДоступа();
КонецПроцедуры
33 Arzu
 
17.07.13
16:15
Замучился не знаю
34 НЕА123
 
17.07.13
16:18
&НаСервере
Функция ПроверкаДоступа()
   Возврат РольДоступна("Оператор");
КонецФункции

&НаКлиенте
Процедура ВзаиморасчетыПередУдалением(Элемент, Отказ)
   Отказ = ПроверкаДоступа();
КонецПроцедуры
35 Жан Пердежон
 
17.07.13
16:21
+1 к версионированию
36 Arzu
 
17.07.13
16:22
&НаСервере
Функция ПроверкаРоли()
   Оператор = РольДоступна("Оператор");
   Возврат Оператор;
КонецФункции


/////////////////////////////
Оператор = ПроверкаРоли();
   Если Оператор Тогда
       Отказ = Истина;
   КонецЕсли;

Работает!
37 EvgeniuXP
 
17.07.13
16:23
(36) код надо проще писать :)
38 Arzu
 
17.07.13
16:23
(34) Спасибо!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн