Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
1
1C 8.x

ТаблицаФормы (Событие ПередУдалением), РегистрСведенийКлючЗаписи

09.06.2013, 18:54. Показов 6704. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Есть ТаблицаФормы , данные она берет из Динамического Списка который в свою очередь представляет собой - список записей РС. Нужно было чтобы при удалении нескольких строк ТаблицыФормы каждая строка (Которая является РегистрСведенийКлючЗаписи) заносилась в РеквизитФормы (ТЗ) чтобы потом распологая данными об удаленных записях РС можно было изменить другие записи по опр. алгоритму. Воспользовался событием ПередУдалением.

1C
1
2
3
4
5
6
7
8
&НаКлиенте
Процедура СписокПередУдалением(Элемент, Отказ) 
    ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления(Элемент.ВыделенныеСтроки);
КонецПроцедуры
 
НаСервере
Процедура ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления(Знач МассивКлЗаписей)
......... итд
По сути с задачей справился. Только возникли пару вопросов:
- Смотрел в отладчике : Процедура СписокПередУдалением почему то вызывается 2 раза - а следовательно и вызывается процедура ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления. Почему Событие ПередУдалением вызывается 2 раза?
- Вначале в процедуру ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления - передавал МассивКлЗаписей - то есть без кл слова Знач
1C
1
 
Добавлено через 7 минут
1C
1
Процедура ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления(МассивКлЗаписей)
В массив входят РегистрСведенийКлючЗаписи.
И была ошибка: Поле Объекта не доступно для записи.
Хотя в самой процедуре только присваивал строкам Реквизита формы (тз) значения РегистрСведенийКлючЗаписи по полям соответственно. Почему ошибка ведь я ничего не присваивал а только считывал? (когда написал кл слово знач ошибка исчезла) ????

Заранее премного благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2013, 18:54
Ответы с готовыми решениями:

MaskedTextBox1 событие по системным часам - что должно вызывать это событие?
Добрый день! Помогите разобраться с ситуацией пожалуйста. На форме висит элемент maskedTextBox с...

Событие выбора строки при выборе мышкой событие обрабатывается два раза
Есть JTable, обрабатываю событие выбора строки след. образом: ListSelectionModel r =...

Принудительно вызвать событие, если произошло другое событие
Сразу оговорюсь, это тема про события, а НЕ про Windows Forms, да бы ни кто не переносил тему. В...

Как обработать событие click и событие нажития стрелки?
Допустим есть кнопка влево-вправо для горизонтального листания товаров. Как нужно кроссбраузерно...

9
Модератор
Эксперт 1С
3784 / 2964 / 589
Регистрация: 10.03.2011
Сообщений: 11,669
Записей в блоге: 1
09.06.2013, 22:24 2
Читаем синтаксис помощник

ТаблицаФормы (FormTable)
ПередУдалением (BeforeDeleteRow)
Синтаксис:

ПередУдалением(<Отказ>)
Параметры:

<Отказ>

Тип: Булево.
Признак отказа от записи объекта. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись объекта выполнена не будет.
Значение по умолчанию: Ложь.
Описание:

Вызывается перед удалением строки или группы строк.
Примечание:

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.
1
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
09.06.2013, 23:58  [ТС] 3
Dethmontt Уважение. Прочитал не внимательно...

И ошибка (Поле Объекта не доступно для записи) тоже из-за использования серверной процедуры? я правильно понял?

Наверно я использовал какой то корявый способ для передачи ВСЕХ выделенных строк (Элемент.ТекущиеДанные использовать нельзя так как там последняя строка которую выделил пользователь). Есть какой нибудь способ (чтобы передать в ТЗ или Массивы все Измерения РС которые содержатся в строках таблицы формы При удаленни НЕСКОЛЬКИХ строк ползователем в форме списка) по проще и прозорливее ???

Заранее благодарен.
0
Модератор
Эксперт 1С
3784 / 2964 / 589
Регистрация: 10.03.2011
Сообщений: 11,669
Записей в блоге: 1
10.06.2013, 00:26 4
Давай саму задачу еще раз... Не понятно какие именно строки тебе нужны и зачем
0
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
10.06.2013, 01:45  [ТС] 5
Есть РегистрСведений (ЦенаПоНоменклатуре) . У него есть реквезит - ДинамикаЦены (Который является ПеречислениеСсылка.ДинамикаЦены) . в соответствие с которым : если по сравнению с прошлой записью цена выросла то он присваивается перечислению - ЦенаПовысилась (значение Перечисления ДинамикаЦены). Если Упала - ЦенаПовысилась (значение Перечисления ДинамикаЦены). Если Осталась Неизменной - ЦенаОсталасьНеИзменной (значение Перечисления ДинамикаЦены).

В модуле Набора записей я накодил:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Процедура ПередЗаписью(Отказ, Замещение)
    
    Для каждого ЗаписьРС Из ЭтотОбъект Цикл
        ОпределитьДинамикуЦены(ЗаписьРС); 
    КонецЦикла;   
        
КонецПроцедуры
 
&НаСервере
Процедура ОпределитьДинамикуЦены(ЗаписьРС) Экспорт  
    
    ПослЦенаДаннойЗаписи = СерверныйМодуль.ПолучитьПоследнююЦену_ВРСЦенаПоНоменклатуре_ПоДаннымИзмерениям(
    ЗаписьРС.Период,ЗаписьРС.Номенклатура,ЗаписьРС.Контрагент,ЗаписьРС.ЕденицаИзмерения);
        
    Если ЗаписьРС.Цена = ПослЦенаДаннойЗаписи ИЛИ ПослЦенаДаннойЗаписи = Неопределено Тогда
        ЗаписьРС.ДинамикаЦены = Перечисления.ДинамикаЦены.ЦенаОсталасьНеИзменной; 
        
    ИначеЕсли ЗаписьРС.Цена > ПослЦенаДаннойЗаписи Тогда
        ЗаписьРС.ДинамикаЦены = Перечисления.ДинамикаЦены.ЦенаПовысилась;
        
    ИначеЕсли ЗаписьРС.Цена < ПослЦенаДаннойЗаписи Тогда
        ЗаписьРС.ДинамикаЦены = Перечисления.ДинамикаЦены.ЦенаПонизилась; 
 
    КонецЕсли;
 
КонецПроцедуры
На самом деле
Для каждого ЗаписьРС Из ЭтотОбъект Цикл
ОпределитьДинамикуЦены(ЗаписьРС);
КонецЦикла;

в объекте ЭтотОбъект сушествует тоько одна запись РС у которой необходимо установить ДинамикаЦены (Реквезит - ПеречислениеСсылка.ДинамикаЦены)

Функция СерверныйМодуль.ПолучитьПоследнююЦену_ВРСЦенаПоНоменклатуре_ПоДаннымИзмерениям - создает запрос и по таким же измеренииям находит цену которая соответствует данным измерениям (только которя была сделана раньше), и возвращает ее (Если более ранней записи нет то Неопределенно)

Вот текст запроса:
1C
1
2
3
4
5
6
7
8
9
10
11
             "ВЫБРАТЬ ПЕРВЫЕ 1
    |   ЦенаПоНоменклатуре.Цена
    |ИЗ
    |   РегистрСведений.ЦенаПоНоменклатуре КАК ЦенаПоНоменклатуре
    |ГДЕ
    |   ЦенаПоНоменклатуре.Период < &ПериодЭтойЗаписи
    |   И ЦенаПоНоменклатуре.Номенклатура = &СсылкаНаНоменклатура
    |   И ЦенаПоНоменклатуре.Контрагент = &СсылкаНаКонтрагента
    |   И ЦенаПоНоменклатуре.ЕденицаИзмерения = &СсылкаНаЕденицуИзмерения
    |УПОРЯДОЧИТЬ ПО
    |   Период Убыв";
Если В форме списка пользователь удаляет несколько строк (Он конечно может удалят и по одной , Тогда можно восползоваться Элемент.ТекущиеДанные в событии ПередУдалением(ТаблицыФормы) ) то мне необходимо знать какие строки он выделил. А точнее у каждую строку занести ТЗ (где у нее будут колонки - период и измерения). Чтобы потом Зная какие строки удалены правилно поставить реквизит ДинамикаЦены.

Например у нас есть записи в Таблице формы:

Число Товар Цена ДинамикаЦены
- 01.05 майонез 20 Цена Осталась Неизменной (Так как перед ней нет более ранних записей с такими измерения)
- 02.05 майонез 24 Цена Повысилась
- 03.05 майонез 23 Цена Понизилась
- 04.05 майонез 21 Цена Понизилась


Например я выделяю вторую и третью запись и удаляю их запись
- 04.05 майонез 21 Цена Понизилась ---- должна измениться ---- - 04.05 майонез 21 Цена Повысилась

для того чтобы изменить Реквизит ДинамикаЦены в таких записях (перед которыми удалили записи с такими же измерениями только более ранние) мне нужны измерения удаленных строк ТаблицыФормы (Вероятно В виде ТЗ).

Я решил эту проблему так:

1C
1
2
3
4
5
6
7
8
9
10
&НаКлиенте
Процедура СписокПередУдалением(Элемент, Отказ)
    
    ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления(Элемент.ВыделенныеСтроки);
КонецПроцедуры
 
&НаСервере
Процедура ДобавитьВРеквизит_ТЗВыдСтр_ВсеЗаписи_РСЦенПоНоменкл_ДляИсправления(Знач МассивКлЗаписей)
 
.... итд
и затем добавлял в Реквизит Формы -ТЗ все эти строки , затем с помощью запроса находил записи которые надо исправить (наподобе примера) и изменял в них реквизит ДинамикаЦены.


И кстати хотя в Синтакс помощнике и написано (В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере). функция работала ,однако почемуто вызывалась два раза и поэтому записи требующие исправления - перезаписывались 2 раза (Хотя и с Верным значением реквизита ДинамикаЦены).

Но мне кажется что путь который я избрал для Получения ТЗ (реквизита формы) в которой хранятся удаляемые строки изначально Коряватый. Прошу вас подсказать более естественный путь.

заранее премног благодарен
0
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
12.06.2013, 13:02  [ТС] 6
Добрый день. Я чего то намудрил, так что ли?
0
Модератор
Эксперт 1С
3784 / 2964 / 589
Регистрация: 10.03.2011
Сообщений: 11,669
Записей в блоге: 1
12.06.2013, 14:17 7
На кой фиг нужен этот реквизит? - ДинамикаЦены

Добавлено через 1 минуту
Зачем динамику хранить в реквизите?
1
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
14.06.2013, 15:57  [ТС] 8
Для того чтобы в любой момент времени можно было из РС получить информацию как изменилась цена по данным измерениям в сравнении с предыдущей записью. а не высчиитывать такой реквизит программно.

Вобщем понимаю что намудрил. Однако заинтерисовал сам вопрос : Как сохранить(и куда лучше? В глобальную переменную или в реквизит формы?) все данные (из выделенных строчек) ТаблицыФормы ПередУдалением?

Добавлено через 3 минуты
Для последующей манипуляции с этими данными...
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
15.06.2013, 03:00 9
зачем мираж сохранять? пока сохраняешь, динамика изменится... ну, в файл сохрани, для укрепления самооценки
1
8 / 8 / 0
Регистрация: 04.12.2012
Сообщений: 409
15.06.2013, 13:54  [ТС] 10
Понял что намудрил.
0
15.06.2013, 13:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2013, 13:54
Помогаю со студенческими работами здесь

В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того, что событие А произошло
В каждом из n независимых испытаний событие А происходит с вероятностью p. Найти вероятность того,...

Если есть форма и есть событие, а процедуры, его обрабатывающей нет в исходниках, то как это событие обрабатывается?
Друзья! Изучаю синтаксис дельфи. Ну то есть к примеру такой код: procedure...

Класс: Как обработать событие последнего объекта в форме, не создавая в классе объекта промежуточное событие?
Итак! Проблема состоит в следующем! Имеется класс в который входит объект второго класса. В...

Событие при активации textbox. Или событие при изменения фокуса
Здравствуйте. Подскажите можно ли создать свое событие происходящий вовремя активации textbox....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru