Имя: Пароль:
1C
1С v8
Оцените правильность обработки проведения
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
AdBlock убивает бесплатный контент. 1Сергей