|
Оцените правильность обработки проведения | ☑ | ||
---|---|---|---|---|
0
zelenprog
25.06.12
✎
16:45
|
Написал свою первую обработку проведения на 8.2 на управляемых формах!
Проверьте пожалуйста, правильно ли я сделал? Суть в следующем. Надо вести простой учет сотрудников организации: принят, уволен. Есть периодический регистр сведений для этого, в нем два реквизита: Сотрудник и СтатусСотрудника. Прием на работу выполняется документом "ПриемНаРаботу". Этот документ в табличной части содержит просто список сотрудников, и при проведении делает записи в регистр. Перед формированием движений нам нужно проверить, чтобы принимаемые на работу сотрудники еще не были приняты. Эту проверку я сделал отдельной процедурой. Есть ли какие замечания по моему коду? &НаСервере Функция ПроверкаПроведения() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СотрудникиОрганизацииСрезПоследних.Сотрудник, | СотрудникиОрганизацииСрезПоследних.СтатусСотрудника, | СотрудникиОрганизацииСрезПоследних.Регистратор |ИЗ | РегистрСведений.СотрудникиОрганизации.СрезПоследних( | &пзПериод, | Сотрудник В (&пзСотрудники) | И СтатусСотрудника = &Статус) КАК СотрудникиОрганизацииСрезПоследних"; Запрос.УстановитьПараметр("пзПериод", ЭтотОбъект.Дата); Запрос.УстановитьПараметр("пзСотрудники", ЭтотОбъект.РаботникиОрганизации.ВыгрузитьКолонку("Сотрудник")); Запрос.УстановитьПараметр("Статус", Перечисления.СтатусСотрудника.Принят); Результат = Запрос.Выполнить(); Возврат Результат; КонецФункции Процедура ОбработкаПроведения(Отказ, Режим) Результат = ПроверкаПроведения(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); лЕстьПринятые = ЛОЖЬ; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл лЕстьПринятые = Истина; Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Сотрудник уже принят на работу: " + ВыборкаДетальныеЗаписи.Соответствие + Символы.ПС + "Регистратор: " + ВыборкаДетальныеЗаписи.Регистратор; Сообщение.Сообщить(); КонецЦикла; Если лЕстьПринятые = Истина Тогда Отказ = Истина; Возврат; КонецЕсли; Движения.СотрудникиОрганизации.Записывать = Истина; Для Каждого ТекСтрокаРаботникиОрганизации Из РаботникиОрганизации Цикл Движение = Движения.СотрудникиОрганизации.Добавить(); Движение.Период = Дата; Движение.Сотрудник = ТекСтрокаРаботникиОрганизации.Сотрудник; Движение.СтатусСотрудника = Перечисления.СтатусСотрудника.Принят; КонецЦикла; КонецПроцедуры |
|||
1
Eugene_life
25.06.12
✎
16:51
|
(0) А у меня зато длиннее!! :-D
|
|||
2
zelenprog
25.06.12
✎
17:42
|
(1) не, ну серьезно
есть какие косяки? |
|||
3
zelenprog
25.06.12
✎
17:43
|
есть же ведь определенные принципы, которые надо соблюдать
|
|||
4
х86
25.06.12
✎
17:54
|
(0)на крайний случай смотри как в типовых сделано
|
|||
5
ЧашкаЧая
25.06.12
✎
17:54
|
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
лЕстьПринятые = Истина; Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Сотрудник уже принят на работу: " + ВыборкаДетальныеЗаписи.Соответствие + Символы.ПС + "Регистратор: " + ВыборкаДетальныеЗаписи.Регистратор; Сообщение.Сообщить(); КонецЦикла; И будет сообщение вызываться столько раз сколько строк в выборке, лучше это завернуть в Если Тогда. |
|||
6
zelenprog
26.06.12
✎
11:19
|
(4) ну я смотрел в типовой УТ, только там таких простых примеров нету,
там все наворочено, из "ОбработкиПроведения" вызываются процедуры общих модулей, короче ничего не понял |
|||
7
zelenprog
26.06.12
✎
11:20
|
(5) ага, поправлю
|
|||
8
Maxus43
26.06.12
✎
11:22
|
(6) нормально там всё, по аналогии делай, ибо потом после тебя другой кодер будет разбираться ещё, а так всё знакомо будет
|
|||
9
EasyRider
26.06.12
✎
11:25
|
Думаю нужно еще "Для Изменения" в запрос вставить,чтобы не провелись документы по одному и тому же сотруднику.
|
|||
10
EasyRider
26.06.12
✎
11:27
|
+(9)хотя нет,туплю.Действия все равно последовательно будут выполняться
|
|||
11
zelenprog
26.06.12
✎
12:04
|
(8) я понимаю что в типовых все нормально
|
|||
12
zelenprog
26.06.12
✎
12:05
|
(8)+ просто надо сначала всю логику типовой изучить, чтобы свой код разделить на процедуры по аналогии как в типовой,
я этого еще не осилил, но буду стремиться :) |
|||
13
zelenprog
26.06.12
✎
12:07
|
в общем похоже грубых ошибок нету,
меня это радует :) |
|||
14
es3000
26.06.12
✎
16:12
|
(0) есть косяк в запросе: как сейчас сделан запрос, он никогда не вернет записи о том, что сотрудник был уволен, так как стоит отбор записей регистра по статусу: "И СтатусСотрудника = &Статус"
надо запрос переделать так: Запрос.Текст = "ВЫБРАТЬ | ШтрихКодыСрезПоследних.Действие, | ШтрихКодыСрезПоследних.Соответствие, | ШтрихКодыСрезПоследних.СтатусСотрудника, | ШтрихКодыСрезПоследних.Регистратор |ИЗ | РегистрСведений.ШтрихКоды.СрезПоследних( | &пзПериод, | Действие = &Действие | И Соответствие В (&пзСотрудники)) КАК ШтрихКодыСрезПоследних |ГДЕ | СтатусСотрудника = &Статус"; |
|||
15
zelenprog
26.06.12
✎
16:21
|
(14) ага
|
|||
16
zelenprog
26.06.12
✎
16:23
|
Еще заметил косяк: если перепроводить документ, то он выдает "сотрудник уже принят на работу", то есть запрос захватывает записи регистра, созданные самим документом.
Как от этого избавиться? |
|||
17
Maxus43
26.06.12
✎
16:24
|
Запрос.УстановитьПараметр("пзПериод", Новый Граница(ЭтотОбъект.Дата, ВидГраницы.исключая));
|
|||
18
zelenprog
26.06.12
✎
16:45
|
(17) не помогает
|
|||
19
rotting
26.06.12
✎
16:48
|
(18)Запрос.УстановитьПараметр("пзПериод", ЭтотОбъект.МоментВремени());
|
|||
20
unregistered
26.06.12
✎
16:53
|
(18) Бери не границу, а предыдущую дату (полагаю, что у регистра периодичность - день).
И вообще сам запрос я бы делал не по списку сотрудников полученному из табличной части через Объект.РаботникиОрганизации.Выгрузить, а запросом с левым соединением табличной части документа с регистром. |
|||
21
Фауст
26.06.12
✎
16:53
|
ДЛЯ ИЗМЕНЕНИЯ поставь в запрос, а то дед локи будут
|
|||
22
zelenprog
26.06.12
✎
17:00
|
(20) да, точно, запрос не срабатывает из-за периодичности регистра,
сработало так: Новый Граница(НачалоДня(ЭтотОбъект.Дата), ВидГраницы.Исключая) |
|||
23
zelenprog
26.06.12
✎
17:00
|
(21) что значит "ДЛЯ ИЗМЕНЕНИЯ"?
|
|||
24
Maxus43
26.06.12
✎
17:01
|
(23) не обращай внимания, не твой случай
|
|||
25
Фауст
26.06.12
✎
17:06
|
Для изменения нужно ставить когда сначала читаешь из регистра а потом в этот же регистр пишешь, если блокировки у тебя автоматические.
|
|||
26
zelenprog
26.06.12
✎
17:07
|
(24) ОК
а на будущее где можно почитать про "ДЛЯ ИЗМЕНЕНИЯ"? в справке не нашел |
|||
27
zelenprog
26.06.12
✎
17:09
|
(25) ну вроде бы это мой случай
|
|||
28
Maxus43
26.06.12
✎
17:10
|
(26)
Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных. Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции (с) СП |
|||
29
zelenprog
26.06.12
✎
17:20
|
(28) что такое "СП"?
|
|||
30
Maxus43
26.06.12
✎
17:32
|
(29) это F1
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |