Имя: Пароль:
1C
1С v8
Дайте мастеркласс - как дорабатывать, а потом обновлять типовые.
, ,
0 RomaH
 
naïve
28.01.13
08:08
А то как-то  школа франчайзи меня стороной обошла,
и терзают смутные сомнения, что возможно я чего-то не знаю

например, как изменять типовой текст модулей
как изменять (обновлять) типовые объекты (в основном напрягают движения документов, и регистраторы регистров)

Например: ЗУП
добавляю новый документ и новый регистр
новый документ делает движения по типовому регистру и по новому
а для нового регистра регистратором является новый документ и типовой документ

как обновить, что бы не забыть движения и регистраторы прописать у всех связаных объектов?
1 SeraFim
 
28.01.13
08:10
движения - в подписке
2 Мизантроп
 
28.01.13
08:16
купить у 1с софтину которая сама обновит как надо
3 RomaH
 
naïve
28.01.13
08:18
(2) что за софтина, где посмотреть?
а может я все неправильно делаю?
я сейчас через cf обновляю
4 Infsams654
 
28.01.13
08:19
5 cw014
 
28.01.13
08:24
Мастер класс:
1) С поддержки снимать не надо, надо включить возможность изменений. При этом все объекты должны быть со статусом "не редактируется"
2) Объекты, которые нужно редактировать, ставишь статус "редактировать с сохранением поддержки". Если редактируешь форму - весь объект на редактирование ставить не нужно, нужно ставить только эту форму
3) Изменения в модулях по возможности помещать в начало процедур или в конец процедур
4) Не использовать код в типовых процедурах, использовать общий модуль (дополнительный, свой), где и производить обработку. В типовых модулях ставить только вызов этих процедур. Комментировать все изменения
5) Вести карту изменений. При изменении какого либо объекта - вносить в карту запись по изменению
6) При обновлении - сверяться с картой изменений. Если есть какие либо обновления, затрагивающие модуль, который исправлен - можно сделать индивидуальную настройку обновления (выбрать процедуры которые необходимо обновить). После обновления, если была обновлена процедура, которая перетерлась обновлением - внести изменения по новой.
7) Желательно не трогать формы - неудобно потом на новой форме все вырисовывать и привязки рисовать. Можно программно создавать элементы формы - тоже вынести в общий модуль...

Кто чего добавить?
6 Demasiado
 
28.01.13
08:27
(4) судя по видео - хреномуть...
7 vicof
 
28.01.13
08:27
(5)  
0) Сделать бэкап :)
8 Бешеная Нога
 
28.01.13
08:28
(5) хорошо написано
9 RomaH
 
naïve
28.01.13
08:29
5) Вести карту изменений. При изменении какого либо объекта - вносить в карту запись по изменению  - вот от этого и хочу уйти - сейчас так и делается - накатываю конфигурацию, и вперед по списку - проверять

4) Не использовать код в типовых процедурах, использовать общий модуль (дополнительный, свой), где и производить обработку. В типовых модулях ставить только вызов этих процедур. Комментировать все изменения
вариант, но не всегда
допустим есть сложный модуль ... че-то там про расчет больничных, надо исправить - привести в соответсвие с законодательством - добавить пару строк в два места
если выеносить процедуру в свой модуль - это копипаст текущей типовой
при обновлении, типовая процедура может быть изменена, а исправления остануться на своих местах, это надо будет опять типовоую в свой модуль скопипастить, и исправить - сложнее
10 RomaH
 
naïve
28.01.13
08:32
1) С поддержки снимать не надо, надо включить возможность изменений. При этом все объекты должны быть со статусом "не редактируется"
+
7) Желательно не трогать формы - неудобно потом на новой форме все вырисовывать и привязки рисовать. Можно программно создавать элементы формы - тоже вынести в общий модуль...
а вот тут ... несостыковочка, по формам так и сделано, но для типизации, делаю выгрузку модулей конфигарации и парсингом в модули форм добавляю вызов своей процедуры в ПриОткрытии или в ПередОткрытием (во ВСЕ формы сразу)
11 cw014
 
28.01.13
08:36
(9) По возможности помещать код в конец процедуры... Но не обязательно

Приведи конкретный пример, подскажу как лучше в таком случае делать. У меня например есть в отчете процедура, которая "чуть-чуть" подправляет текст запроса, из-за чего отчет принимает другую форму.
12 cw014
 
28.01.13
08:37
(10) Жесть
13 i-rek
 
28.01.13
08:37
(5) здорово
только я предпочитаю избегать вносить изменения в конце процедуры, т.к. в окне сравнения-объединения приходится прыгать в конец, если текст длинный. повышаются шансы проморгать изменение.

добавлю: не комментировать изменения пометкой в конце строки кода //изменено
по той же причине. может не быть видно в окне сравнения-объединения
14 i-rek
 
28.01.13
08:38
и имея выбор: 2 точки вставки кода и оптимальный код, либо 1 точка и неоптимальный код - выбирать одну точку ;)
15 cw014
 
28.01.13
08:39
(13) Я комментирую примерно так:

// CW014 2013 [ Нужно что бы как бы так вот
МойОбщийМодуль.КакойТоКод();
// CW014 2013 ]
16 cw014
 
28.01.13
08:39
Да, хорошие добавления в (1) и в (7)
17 cw014
 
28.01.13
08:40
(10) Не рекомендуется так делать. Еще не видел таких задач, при которых "нужно во все формы" сделать. Если это формы документов - есть общие модули, которые вызываются в любой форме документа - можно туда воткнуть свою процедуру
18 vicof
 
28.01.13
08:40
(5) Насчет снимать или не снимать с поддержки. Когда конфа сильно переписана, проще подготовить цфник, с которого потом обновляться. Снять с поддержки и обновить типовым, чтобы поставить на поддержку.
19 vicof
 
28.01.13
08:42
(5) Некоторые не знают о попроцедурном сравнении модулей. Тоже можно в список включить.
20 cw014
 
28.01.13
08:42
(18) Не факт. На последнее место работы я пришел на сильно измененную УПП. Приходится протоколировать изменения, выносить печатные формы во внешние, в общем максимально приводить к типовому решению
21 cw014
 
28.01.13
08:43
(19) читай внимательно п. 6
22 vicof
 
28.01.13
08:44
(20) К типовому да, зачастую лучше к типовому приводить. Я так с ЗУПом у себя на предприятии поступаю. Но обновляться проще именно как я описал. Имхо.
23 vicof
 
28.01.13
08:45
(21) сорри, глаза протер
24 RomaH
 
naïve
28.01.13
08:47
пример (вставки выделены //Лобанов
изменения только в отдельной части расчета
обновление делается прасингом выгруженых модулей:

// Рассчитывает значение ресурса записи регистра расчета по ее реквизитам и дополнительным данным
//
// Параметры:
//  СтрокаДвижений    - рассчитываемая запись регистра расчета
//  ИсходныеДанные    - выборка из результата запроса с исходными данными для расчета
//  УправленческиеНачисления - булево, признак того, что это расчет управленческий
//  РегламентированныеНачисления - булево, признак того, что это регламентированное начисление
//  ОсновныеНачисленияОрганизаций - булево, признак того, что это именно основое регламентированное начисление
//  ДанныеДляПрогнозаНДФЛ - выборка из результата запроса с данными для прогнозирования НДФЛ
//  СведенияОДоначислениях - соответствие для хранения данных о доначислениях
//  КурсВалютыУпрУчета
//  ПовторныйРасчет - признак того, что выполняется повторный расчет (поддержка
//              способа ДоначислениеПоУправленческомуУчету)
//
// Возвращаемое значение:
//  Нет.
//
Процедура РассчитатьЗаписьРегистраРасчета(СтрокаДвижений,
                           ИсходныеДанные,
                           УправленческиеНачисления,
                           РегламентированныеНачисления,
                           РегламентированныеУдержания,
                           ОсновныеНачисленияОрганизаций,
                           ДополнительныеНачисленияОрганизаций,
                           ДанныеДляПрогнозаНДФЛ,
                           СведенияОДоначислениях,
                           КурсВалютыУпрУчета,
                           ПовторныйРасчет,
                           КомментироватьРасчет, ФормаКомментариев,
                           ГрафикиБезРабочегоВремени)
   
   ВидРасчета = СтрокаДвижений.ВидРасчета;
   СпособРасчета = ИсходныеДанные.СпособРасчета;
   Результат = 0;
   
   РезультатПолучен = Истина;
   
   ПоказательРазмер = "Показатель1";
   
   // предварительные действия перед расчетом для поддержки
   // способа расчета ДоначислениеПоУправленческомуУчету
   РасчетДоначисления = Ложь;
   Если РегламентированныеНачисления и СведенияОДоначислениях <> Неопределено Тогда
       Сведение = СведенияОДоначислениях.Получить(СтрокаДвижений.Сотрудник);
       Если Сведение = Неопределено Тогда
           Сведение = Новый Структура("КВыплатеПоУпрУчету,ЕстьДоначисление,ПрогнозНДФЛ,СуммарныйПроцент,УжеНачисленоДоДоначисления");
           Сведение.КВыплатеПоУпрУчету = 0;
           Сведение.СуммарныйПроцент = 0;
           Сведение.УжеНачисленоДоДоначисления = 0;
           Сведение.ЕстьДоначисление = Ложь;
           Сведение.ПрогнозНДФЛ = Новый Соответствие();
           СведенияОДоначислениях[СтрокаДвижений.Сотрудник] = Сведение;
       КонецЕсли;
       Если ОсновныеНачисленияОрганизаций
           И ИсходныеДанные.УчитыватьДоходПоПериодуДействия Тогда
           ПериодДохода = НачалоМесяца(ИсходныеДанные.ПериодДействияНачало);
       Иначе
           // здесь предполагаем, что в наборе записей не может быть записей с разными периодами регистрации
           ПериодДохода = СтрокаДвижений.ПериодРегистрации;
       КонецЕсли;
       СтрокаПрогноза = Сведение.ПрогнозНДФЛ.Получить(ПериодДохода);
       Если СтрокаПрогноза = Неопределено Тогда
           СтрокаПрогноза = ПроведениеРасчетовДополнительный.СоздатьСтрокуПрогнозаНДФЛ();
           Сведение.ПрогнозНДФЛ[ПериодДохода] = СтрокаПрогноза;
       КонецЕсли;
       Если ИсходныеДанные.СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоначислениеПоУправленческомуУчету Тогда
           РасчетДоначисления = Истина;
           Если не ПовторныйРасчет Тогда
               Сведение.ЕстьДоначисление = Истина;
               
               Если ОсновныеНачисленияОрганизаций Тогда
                   Сведение.КВыплатеПоУпрУчету = ?(ИсходныеДанные.КВыплатеПоУпрУчету = Null, 0, ИсходныеДанные.КВыплатеПоУпрУчету) * КурсВалютыУпрУчета[НачалоМесяца(ИсходныеДанные.ПериодДействияНачало)];
               Иначе
                   Сведение.КВыплатеПоУпрУчету = ?(ИсходныеДанные.КВыплатеПоУпрУчету = Null, 0, ИсходныеДанные.КВыплатеПоУпрУчету) * КурсВалютыУпрУчета[СтрокаДвижений.ПериодРегистрации];
               КонецЕсли;
               Сведение.СуммарныйПроцент = ?(ИсходныеДанные.СуммарныйПроцент = Null, 0, ИсходныеДанные.СуммарныйПроцент);
               Сведение.УжеНачисленоДоДоначисления = ?(ИсходныеДанные.УжеНачисленоДоДоначисления = Null, 0, ИсходныеДанные.УжеНачисленоДоДоначисления);
               Физлицо = ИсходныеДанные.Физлицо;
               // запомним поле "резидентство"
               Для Каждого СтрокаДляЗаполнения Из Сведение.ПрогнозНДФЛ Цикл
                   СтрокаДляЗаполнения.Значение.Резидент = ИсходныеДанные.Резидент;
               КонецЦикла;
               Если ПроведениеРасчетовДополнительный.ПозиционироватьДанныеПрогнозаНДФЛ(ДанныеДляПрогнозаНДФЛ, Физлицо) Тогда
                   Пока Истина Цикл
                       СтрокаДляЗаполнения = Сведение.ПрогнозНДФЛ.Получить(ДанныеДляПрогнозаНДФЛ.Период);
                       Если СтрокаДляЗаполнения = Неопределено Тогда
                           СтрокаДляЗаполнения = ПроведениеРасчетовДополнительный.СоздатьСтрокуПрогнозаНДФЛ();
                           Сведение.ПрогнозНДФЛ[ДанныеДляПрогнозаНДФЛ.Период] = СтрокаДляЗаполнения;
                       КонецЕсли;
                       // запоним остальные поля
                       ПроведениеРасчетовДополнительный.ЗаполнитьСтрокуПрогнозаНДФЛ(СтрокаДляЗаполнения, ДанныеДляПрогнозаНДФЛ);
                       Если не ДанныеДляПрогнозаНДФЛ.Следующий() Тогда
                           Прервать;
                           
                       КонецЕсли;
                       Если ДанныеДляПрогнозаНДФЛ.Физлицо <> Физлицо Тогда
                           Прервать;
                       КонецЕсли;
                   КонецЦикла;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   // расчет будем проводить только для авторассчитываемой записи
   Если СтрокаДвижений.Авторасчет Тогда
       
       ДатаЗакона255ФЗ = ПроведениеРасчетовДополнительный.ПолучитьДатуВступленияВСилуИзмененийПоСоциальнымПособиям2006();
       
       // этот Если... нужно расширять при появлении новых способов расчета или видов расчета,
       // которые не укладываются в тот или иной способ
       
       Если КомментироватьРасчет Тогда
           КомментарийВидаРасчета = ОбщегоНазначенияЗК.КомментарийРасчета("Расчет ", , ИсходныеДанные.ВидРасчетаНаименование, СтрокаДвижений.ВидРасчета);
           ОбщегоНазначенияЗК.КомментарийРасчета("Способ расчета: " + ИсходныеДанные.СпособРасчета, КомментарийВидаРасчета);
           КомментарийПорядкаРасчета = ОбщегоНазначенияЗК.КомментарийРасчета("Порядок расчета: " + ПроведениеРасчетов.ВизуализироватьФормулуРасчета(ИсходныеДанные.ВидРасчета, "Текст", РегламентированныеУдержания), КомментарийВидаРасчета);
           
           Если СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПочтовыйСбор
               ИЛИ СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.БанковскиеИздержки Тогда
               
               Если ЗначениеЗаполнено(ИсходныеДанные.Получатель) Тогда
               
                   ОбщегоНазначенияЗК.КомментарийРасчета("Получатель: " + ИсходныеДанные.Получатель, КомментарийПорядкаРасчета);
               
               КонецЕсли;
               
               Если ИсходныеДанные.ПоТарифу Тогда
           
                   ОбщегоНазначенияЗК.КомментарийРасчета("Тариф: " + ИсходныеДанные.ПорядокИсчисленияИздержек, КомментарийПорядкаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Процент: " + ИсходныеДанные.Процент, КомментарийПорядкаРасчета);
                   
               Иначе
               
                   ОбщегоНазначенияЗК.КомментарийРасчета("Фиксированный процент: " + ИсходныеДанные.Процент, КомментарийПорядкаРасчета);
                   
               КонецЕсли;
               
               ОбщегоНазначенияЗК.КомментарийРасчета("Сумма перевода: " + ИсходныеДанные.СуммаАлиментов, КомментарийПорядкаРасчета);
               
           КонецЕсли;
           
       КонецЕсли;
       
       // Процентом и от стажа процентом
       //    
       Если ПроведениеРасчетов.ПолучитьСписокНачисленийПроцентом().Найти(СпособРасчета) <> НеОпределено Тогда
           
           Если ОсновныеНачисленияОрганизаций И СтрокаДвижений.Сторно И НЕ СтрокаДвижений.РасчетнаяБазаЗаЕдиницуНормыВремени = 0 Тогда
               // при расчете сторно получаем "отнормированную" базу из реквизита записи регистра
               // и учтем отработанное время; для записей которые были рассчитаны ранее, этот реквизит пуст,
               // поэтому для них получим базу прежним способом
               ОтработанноеВремя = ?(ИсходныеДанные.ВидУчетаВремени = Перечисления.ВидыУчетаВремени.ПоДням, ИсходныеДанные.ОтработаноДней, ИсходныеДанные.ОтработаноЧасов);
               РезультатБаза = СтрокаДвижений.РасчетнаяБазаЗаЕдиницуНормыВремени * ОтработанноеВремя;
           Иначе
               РезультатБаза = ИсходныеДанные.РезультатБаза;
           КонецЕсли;
           
           // Размер - процент доплаты
           Если РезультатБаза = NULL Тогда
               Если ВидРасчета <> ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.РайонныйКоэффициент И СпособРасчета <> Перечисления.СпособыРасчетаОплатыТруда.СевернаяНадбавка Тогда // оставляем поведение ред.2.1
                   ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Не определены базовые начисления ");
               КонецЕсли;
           Иначе
               Если КомментироватьРасчет Тогда
                   КомментарийБазы = ОбщегоНазначенияЗК.КомментарийРасчета("Базовые начисления составили всего: " + РезультатБаза, КомментарийВидаРасчета,,,, Ложь);
                   РасшифровкаБазы = ИсходныеДанные.Выбрать();
                   Если Не РегламентированныеУдержания Тогда
                       Пока РасшифровкаБазы.Следующий() Цикл
                           Если РасшифровкаБазы.РезультатБаза <> 0 Тогда
                               ОбщегоНазначенияЗК.КомментарийРасчета(РасшифровкаБазы.ВидРасчетаРазрезНаименование + ": " + РасшифровкаБазы.РезультатБаза, КомментарийБазы);
                           КонецЕсли;
                       КонецЦикла;
                   КонецЕсли;
               КонецЕсли;
               
               Если РегламентированныеУдержания Тогда
                   УжеНачисленоВТекущемПериоде = ?(ИсходныеДанные.УжеНачисленоВТекущемПериоде = Null, 0, ИсходныеДанные.УжеНачисленоВТекущемПериоде);
                   Результат = Макс(РезультатБаза * СтрокаДвижений[ПоказательРазмер]/100 - УжеНачисленоВТекущемПериоде,0);
                   Если КомментироватьРасчет Тогда
                       ОбщегоНазначенияЗК.КомментарийРасчета("Процент: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
                       ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено в текущем периоде: " + УжеНачисленоВТекущемПериоде, КомментарийВидаРасчета);
                   КонецЕсли;
               Иначе
                   Результат = РезультатБаза * СтрокаДвижений[ПоказательРазмер]/100;
                   Если Не ИсходныеДанные.ВидРасчетаПериодДействияБазовый и Не ИсходныеДанные.БазовыйПериодПрошлыйМесяц Тогда
                       НормаВремени = ИсходныеДанные.НормаВремениЗаМесяц;
                       СообщениеОбОшибке = Ложь;
                       ОтработаноВремениОсновное = ОплачиваемоеВремя(ИсходныеДанные, СтрокаДвижений, КомментироватьРасчет, КомментарийВидаРасчета, СообщениеОбОшибке, ГрафикиБезРабочегоВремени);
                       Если НЕ СообщениеОбОшибке И НормаВремени = 0 Тогда
                           ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Нет рабочих дней в заданном периоде");
                       КонецЕсли;
                       Если НормаВремени = 0 Тогда
                           Результат = 0;
                       Иначе
                           Результат = Результат * ОтработаноВремениОсновное / НормаВремени;
                       КонецЕсли;
                       СтрокаДвижений.ОплаченоДнейЧасов = ОтработаноВремениОсновное * ?(СтрокаДвижений.Сторно,-1,1);
                   КонецЕсли;
                   Если КомментироватьРасчет Тогда
                       ОбщегоНазначенияЗК.КомментарийРасчета("Процент оплаты: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
                       Если Не ИсходныеДанные.ВидРасчетаПериодДействияБазовый и Не ИсходныеДанные.БазовыйПериодПрошлыйМесяц Тогда
                           ОбщегоНазначенияЗК.КомментарийРасчета("Отработанное время: " + ИсходныеДанные.ОтработаноВремени, КомментарийВидаРасчета);
                           ОбщегоНазначенияЗК.КомментарийРасчета("Норма времени: " + ИсходныеДанные.НормаВремениЗаМесяц, КомментарийВидаРасчета);
                       КонецЕсли;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
           
           // Процентом от облагаемых ЕСН начислений - для добровольных страховых взносов в ПФР на накопительную часть пенсии
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПроцентомОтОблагаемыхЕСННачислений Тогда
           
           Если ИсходныеДанные.ОблагаемыйЕСНДоход = NULL Тогда
               ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Отсутствуют доходы, облагаемые ЕСН ");
           Иначе
               Если КомментироватьРасчет Тогда
                   КомментарийБазы = ОбщегоНазначенияЗК.КомментарийРасчета("Облагаемые доходы составили всего: " + ИсходныеДанные.ОблагаемыйЕСНДоход, КомментарийВидаРасчета,,,, Ложь);
                   РасшифровкаБазы = ИсходныеДанные.Выбрать();
                   Пока РасшифровкаБазы.Следующий() Цикл
                       Если РасшифровкаБазы.ОблагаемыйЕСНДоход <> 0 Тогда
                           ОбщегоНазначенияЗК.КомментарийРасчета(РасшифровкаБазы.ВидРасчетаРазрезНаименование + ": " + РасшифровкаБазы.ОблагаемыйЕСНДоход, КомментарийБазы);
                       КонецЕсли;
                   КонецЦикла;
               КонецЕсли;
               
               // Размер - процент доплаты
               Если РегламентированныеУдержания Тогда
                   УжеНачисленоВТекущемПериоде = ?(ИсходныеДанные.УжеНачисленоВТекущемПериоде = Null, 0, ИсходныеДанные.УжеНачисленоВТекущемПериоде);
                   Результат = Макс(ИсходныеДанные.ОблагаемыйЕСНДоход * СтрокаДвижений[ПоказательРазмер]/100 - УжеНачисленоВТекущемПериоде,0);
                   Если КомментироватьРасчет Тогда
                       ОбщегоНазначенияЗК.КомментарийРасчета("Процент: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
                       ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено в текущем периоде: " + УжеНачисленоВТекущемПериоде, КомментарийВидаРасчета);
                   КонецЕсли;
               Иначе
                   Результат = ИсходныеДанные.ОблагаемыйЕСНДоход * СтрокаДвижений[ПоказательРазмер]/100;
                   Если КомментироватьРасчет Тогда
                       ОбщегоНазначенияЗК.КомментарийРасчета("Процент оплаты: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
           
           // ИсполнительныйЛистВПрожиточныхМинимумах
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИсполнительныйЛистВПрожиточныхМинимумах Тогда
           
           Если ПроведениеРасчетов.РассчитатьРесурсыПоАлгоритму("АлиментыВПрожиточныхМинимумах", КомментироватьРасчет, КомментарийВидаРасчета, СтрокаДвижений, ИсходныеДанные) Тогда
               Результат = СтрокаДвижений.Результат
           КонецЕсли;
           
           // ИсполнительныйЛистПроцентом
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИсполнительныйЛистПроцентом Тогда
           
           РезультатБаза = ИсходныеДанные.РезультатБаза;
           
           // Размер - процент удержания
           Если РезультатБаза = NULL Тогда
               ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Не определены базовые начисления");
               
           Иначе
               ИсчисленныйНалог            = ?(ИсходныеДанные.ИсчисленныйНалог = Null, 0, ИсходныеДанные.ИсчисленныйНалог);
               УжеНачисленоВТекущемПериоде = ?(ИсходныеДанные.УжеНачисленоВТекущемПериоде = Null, 0, ИсходныеДанные.УжеНачисленоВТекущемПериоде);
               
               Результат = Макс(((РезультатБаза - ?(ИсчисленныйНалог < 0, 0, ИсчисленныйНалог)) * СтрокаДвижений[ПоказательРазмер]/100) - УжеНачисленоВТекущемПериоде, 0);
               
               Если КомментироватьРасчет Тогда
                   КомментарийБазы = ОбщегоНазначенияЗК.КомментарийРасчета("Базовые начисления составили всего: " + РезультатБаза, КомментарийВидаРасчета,,,, Ложь);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Исчислено НДФЛ за текущий период: " + ИсчисленныйНалог + ?(ИсчисленныйНалог < 0, "; сумма налога исключена из расчета", ""), КомментарийВидаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено в текущем периоде: " + УжеНачисленоВТекущемПериоде, КомментарийВидаРасчета);
               КонецЕсли;
               
           КонецЕсли;
           
           // ИсполнительныйЛистПроцентомДоПредела
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИсполнительныйЛистПроцентомДоПредела Тогда
           
           РезультатБаза = ИсходныеДанные.РезультатБаза;
           
           // Размер - процент удержания
           Если РезультатБаза = NULL Тогда
               ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Не определены базовые начисления ");
           Иначе
               
               ИсчисленныйНалог            = ?(ИсходныеДанные.ИсчисленныйНалог = Null, 0, ИсходныеДанные.ИсчисленныйНалог);
               УжеНачисленоВТекущемПериоде = ?(ИсходныеДанные.УжеНачисленоВТекущемПериоде = Null, 0, ИсходныеДанные.УжеНачисленоВТекущемПериоде);
               ПределПоДокументуОснованию  = ?(ИсходныеДанные.ПределПоДокументуОснованию = Null, 0 ,ИсходныеДанные.ПределПоДокументуОснованию);
               УжеНачисленоЗаВсюИсторию    = ?(ИсходныеДанные.УжеНачисленоЗаВсюИсторию = Null, 0, ИсходныеДанные.УжеНачисленоЗаВсюИсторию);
               
               Результат = Макс(((РезультатБаза - ?(ИсчисленныйНалог < 0, 0, ИсчисленныйНалог)) * СтрокаДвижений[ПоказательРазмер]/100) - УжеНачисленоВТекущемПериоде, 0);
               // Ограничим результат расчета в случае достижения предела удержания
               Результат = Мин(Результат, ПределПоДокументуОснованию  - УжеНачисленоЗаВсюИсторию);
               
               Если КомментироватьРасчет Тогда
                   КомментарийБазы = ОбщегоНазначенияЗК.КомментарийРасчета("Базовые начисления составили всего: " + РезультатБаза, КомментарийВидаРасчета,,,, Ложь);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Исчислено НДФЛ за текущий период: " + ИсчисленныйНалог + ?(ИсчисленныйНалог < 0, "; сумма налога исключена из расчета", ""), КомментарийВидаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено в текущем периоде: " + УжеНачисленоВТекущемПериоде, КомментарийВидаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Предел по документу основанию: " + ПределПоДокументуОснованию, КомментарийВидаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено за всю историю: " + УжеНачисленоЗаВсюИсторию, КомментарийВидаРасчета);
               КонецЕсли;
               
           КонецЕсли;
           
           // ИсполнительныйЛистФиксСуммойДоПредела
           //        
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ИсполнительныйЛистФиксСуммойДоПредела Тогда
           
           ПределПоДокументуОснованию  = ?(ИсходныеДанные.ПределПоДокументуОснованию = Null, 0 ,ИсходныеДанные.ПределПоДокументуОснованию);
           УжеНачисленоЗаВсюИсторию    = ?(ИсходныеДанные.УжеНачисленоЗаВсюИсторию = Null, 0, ИсходныеДанные.УжеНачисленоЗаВсюИсторию);
           
           // Ограничим результат расчета в случае достижения предела удержания
           Результат = Мин(СтрокаДвижений[ПоказательРазмер], ПределПоДокументуОснованию  - УжеНачисленоЗаВсюИсторию);
           
           Если КомментироватьРасчет Тогда
               ОбщегоНазначенияЗК.КомментарийРасчета("Предел по документу основанию: " + ПределПоДокументуОснованию, КомментарийВидаРасчета);
               ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено за всю историю: " + УжеНачисленоЗаВсюИсторию, КомментарийВидаРасчета);
           КонецЕсли;
           
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПочтовыйСбор ИЛИ
                   СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.БанковскиеИздержки Тогда
           
           Если ПроведениеРасчетов.РассчитатьРесурсыПоАлгоритму("ПочтовыеПереводы", КомментироватьРасчет, КомментарийВидаРасчета, СтрокаДвижений, ИсходныеДанные) Тогда
               Результат = СтрокаДвижений.Результат
           КонецЕсли;
           
           // УдержаниеФиксированнойСуммой
           //        
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.УдержаниеФиксированнойСуммой Тогда
           
           УжеНачисленоВТекущемПериоде = ?(ИсходныеДанные.УжеНачисленоВТекущемПериоде = Null, 0, ИсходныеДанные.УжеНачисленоВТекущемПериоде);
           // Размер - сумма удержания
           // за месяц должно удержаться ровно столько, сколько указано в документе
           Результат = СтрокаДвижений[ПоказательРазмер] - УжеНачисленоВТекущемПериоде;
           
           Если КомментироватьРасчет Тогда
               ОбщегоНазначенияЗК.КомментарийРасчета("Размер удержания: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
               ОбщегоНазначенияЗК.КомментарийРасчета("Ранее начислено в текущем периоде: " + УжеНачисленоВТекущемПериоде, КомментарийВидаРасчета);
           КонецЕсли;
           
           // ФиксированнойСуммой
           // ПоДоговоруФиксированнойСуммой
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ФиксированнойСуммой или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоДоговоруФиксированнойСуммой Тогда
           // Размер - сумма доплаты
           Результат = СтрокаДвижений[ПоказательРазмер];
           
           Если КомментироватьРасчет Тогда
               ОбщегоНазначенияЗК.КомментарийРасчета("Размер начисления: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
           КонецЕсли;
           
           // НулеваяСумма
           //        
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.НулеваяСумма Тогда
           // Ничего не считаем
           
           // ПоМесячнойТарифнойСтавкеПоДням
           // ПоМесячнойТарифнойСтавкеПоЧасам
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоМесячнойТарифнойСтавкеПоДням или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоМесячнойТарифнойСтавкеПоЧасам или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ОтСтажаПоМесячнойТарифнойСтавкеПоДням или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ОтСтажаПоМесячнойТарифнойСтавкеПоЧасам Тогда
           
           НормаВремени = ИсходныеДанные.НормаВремениЗаМесяц;
           СообщениеОбОшибке = Ложь;
           ОтработаноВремениОсновное = ОплачиваемоеВремя(ИсходныеДанные, СтрокаДвижений, КомментироватьРасчет, КомментарийВидаРасчета, СообщениеОбОшибке, ГрафикиБезРабочегоВремени);
           Если НЕ СообщениеОбОшибке И НормаВремени = 0 Тогда
               ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Нет рабочих дней в заданном периоде");
           КонецЕсли;
           Если НормаВремени <> 0 Тогда
               Результат = СтрокаДвижений[ПоказательРазмер] * ОтработаноВремениОсновное / НормаВремени;
               Если КомментироватьРасчет Тогда
                   ОбщегоНазначенияЗК.КомментарийРасчета("Тарифная ставка: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
                   ОбщегоНазначенияЗК.КомментарийРасчета("Норма времени: " + НормаВремени, КомментарийВидаРасчета);
               КонецЕсли;
           КонецЕсли;
           
           СтрокаДвижений.ОплаченоДнейЧасов = ОтработаноВремениОсновное * ?(СтрокаДвижений.Сторно,-1,1);
           
           // ПоЧасовойТарифнойСтавке
           // ПоДневнойТарифнойСтавке
           //
       ИначеЕсли СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоЧасовойТарифнойСтавке или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоДневнойТарифнойСтавке или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ОтСтажаПоЧасовойТарифнойСтавке или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ОтСтажаПоДневнойТарифнойСтавке или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоплатаЗаВечерниеЧасы или
           СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ДоплатаЗаНочныеЧасы Тогда
           
           ОтработаноВремениОсновное = ОплачиваемоеВремя(ИсходныеДанные, СтрокаДвижений, КомментироватьРасчет, КомментарийВидаРасчета, , ГрафикиБезРабочегоВремени);
           Результат = СтрокаДвижений[ПоказательРазмер] * ОтработаноВремениОсновное;
           Если КомментироватьРасчет Тогда
               ОбщегоНазначенияЗК.КомментарийРасчета("Тарифная ставка: " + СтрокаДвижений[ПоказательРазмер], КомментарийВидаРасчета);
               ОбщегоНазначенияЗК.КомментарийРасчета("Отработанное время: " + ОтработаноВремениОсновное, КомментарийВидаРасчета);
           КонецЕсли;
           
           СтрокаДвижений.ОплаченоДнейЧасов = ОтработаноВремениОсновное * ?(СтрокаДвижений.Сторно,-1,1);
           
           // ВыходноеПособие    и  СохраняемыйЗаработокНаВремяТрудоустройства
       ИначеЕсли ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.ВыходноеПособие ИЛИ
           ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисленияОрганизаций.СохраняемыйЗаработокНаВремяТрудоустройства Тогда
           
           Если НЕ СтрокаДвижений.Сторно Тогда
               Если
                   ИсходныеДанные.СреднийЗаработок = NULL
                   ИЛИ (СтрокаДвижений.ВидУчетаВремени = Перечисления.ВидыУчетаВремени.ПоЧасам и ИсходныеДанные.ОтработаноЧасовПоСреднему = 0)
                   ИЛИ (СтрокаДвижений.ВидУчетаВремени = Перечисления.ВидыУчетаВремени.ПоДням и ИсходныеДанные.ОтработаноДнейПоСреднему = 0) Тогда
                   ОбщегоНазначенияЗК.ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": Нет данных для расчета среднего заработка");
                   СтрокаДвижений.Результат = 0;
                   Возврат;
               КонецЕсли;
           КонецЕсли;
           
           ПроцентОплаты = 100;
           ОплачиваемоеВремя = СтрокаДвижений[ПоказательРазмер];
           //Если СтрокаДвижений.ВидУчетаВремени = Перечисления.ВидыУчетаВремени.ПоЧасам Тогда
           //    // переводим дни в часы: количество недель * длительность рабочей недели
           //    ОплачиваемоеВремя = ОплачиваемоеВремя / ИсходныеДанные.ЧислоДнейВНеделе * ИсходныеДанные.ДлительностьРабочейНедели;
           //КонецЕсли;
           
           // Рассчитаем заработок за день (или за час для суммированного учета времени)
           Если СтрокаДвижений.ВидУчетаВремени = Перечисления.ВидыУчетаВремени.ПоЧасам Тогда
               ЗаработокЗаЕдиницуВремени = Окр(ИсходныеДанные.СреднийЗаработок / ИсходныеДанные.ОтработаноЧасовПоСреднему,2);
           Ина
25 cw014
 
28.01.13
08:48
В общем данные правила я использую для себя - и меня они полностью удовлетворяют дефакто. Всем остальным - просто мои советы - если хотите как то по другому делать - бога ради, никто не заставляет.

Да и к тому же я специально написал в конце: Кто чего добавить?

Ибо хорошим советам и сам стараюсь следовать - помогает
26 cw014
 
28.01.13
08:49
(24) Нигде в коде Лобанова не увидел, сорри
28 RomaH
 
naïve
28.01.13
08:51
по коду - фиг с ним, тут проблем вобщем-то и нет
вопрос по взаимосвязям регистраторов и движений типовых и не типовых
только ручным отслеживанием?
29 cw014
 
28.01.13
08:56
(27) Ну в общем можно и так:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"НЕОПРЕДЕЛЕНО КАК ВариантЗаполненияСреднего",
       "ВЫБОР...";
// Лобанов 2013 [
ДополнительныйМодульЛобановЗП.ИзменитьЗапросПоПособию(ТекстЗапроса);
// Лобанов 2013 ]


А это уже легче менять
30 cw014
 
28.01.13
08:58
(28) Конечно соглашусь, что если в типовой документ добавляется движение по какому либо регистру - это утяжеляет процесс обновления, но не так сильно, как кажется на первый взгляд, если опять же вести карту изменений. Если новый документ что-то пишет в типовой регистр - у регистра включать возможность изменений не нужно
31 Фокусник
 
28.01.13
09:03
(5)+ если программно не удобно добавлять элементы: обычные (не упр.) типовые формы (элементы) лучше не трогать, а заменять на свои копированием типовых. При обновлении следить, если есть изменения - копировать типовую форму и заново вносить свои изменения в элементах
32 cw014
 
28.01.13
09:04
(31) Как вариант, да
33 PCcomCat
 
29.01.13
16:15
Отмечусь.
34 aka AMIGO
 
29.01.13
16:18
(33) тебе не видно кнопку "Закладка" ?
35 PCcomCat
 
29.01.13
16:22
(34)Я здоровый человек, пусть хранится в "Темы с моим участием".
36 aka AMIGO
 
29.01.13
16:23
(35) с кнопкой туда и попадает :)
37 PCcomCat
 
29.01.13
16:24
(36) Век живи - век учись! Спасибочки! Теперь буду знать.
38 alex-pro
 
29.01.13
17:11
(30) "что если в типовой документ добавляется движение по какому либо регистру - это утяжеляет процесс обновления,"
ЛВП.
Что мешает юзать подписки?
В ней добавляй свои движения по регистрам и все.
Если типовой и нужны другие движения по нему, я бы сторнировал (очищал)типовые движения и рисовал свои в той же подписке. В чем усложнение?
39 Конфигуратор1с
 
29.01.13
17:46
(38) Наверное вопрос в том, что меняется состав регистров, в котором участвует документ. Сравнивать проблемно
40 К_Дач
 
29.01.13
18:16
За саморекламу не сочтите только
http://infostart.ru/public/169826/
41 Волшебник
 
31.01.13
11:44
(0) Вот ещё статья:
http://infostart.ru/public/171266/
42 Фокусник
 
31.01.13
17:46
(41) Сквозной манипиар :)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn