ЗУП для начинающих программистов

Публикация № 76206

Сообщество - Пользователю системы

В статье описана структура и взаимосвязь процедур и фунций расчетных документов и общего модуля "ПроведениеРасчетов" конфигурации ЗУП8. Статья расчитана для ознакомления начинающими программистами и внедренцами ЗУП. Также будет полезна тем, кто переходит с ЗиК77.

ЗУП для начинающих программистов

Конфигурация ЗУП8 (Зарплата и Управление Персоналом) –  одна из самых сложных типовых конфигураций для понимания начинающими программистами.

Новичку сложно самому разобраться в структуре и взаимосвязях процедур и функций,предназначенных для расчета, а еще сложнее понять почему все сделано именно так.

Часто неопытный программист, «проковырявшись» в общем модуле «ПроведениеРасчетов» несколько часов, наконец, с радостью находит место в процедуре «РассчитатьЗаписьРегистраРасчета» (это самая простая для понимания процедура в модуле), где рассчитывается нужный ему способ расчета и «тулит» туда запросы и сложные обработки данных, что бы изменить или добавить что-то в алгоритме.

 

Для таких программистов и предназначена эта статья. В статье рассматриваются только самые сложные механизмы конфигурации, связанные с проведением расчетов. Описание составлено с использованием украинской версии конфигурации редакции 2.1, но подойдет и для российской, так как концепция конфигураций одинаковая. Также справедливо все написанное для соответствующих подсистем УПП редакции 1.2 для Украины.

НАЧАЛО

При разработке типовой конфигурации ЗУП (Зарплата и Управление Персоналом) для платформы 8, компания 1С преследовала две важные цели:

1.      Скорость (производительность) выполнения расчетов.

2.      Возможность ручной корректировки результатов расчета.

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

Регистры расчета

Для проведения расчетов конфигурация ЗУП использует регистры расчета. Регистры расчета обладают следующими уникальными свойствами, которые не присущи другим типам регистров:

1.      Конкуренция по периоду действия.

2.      Связь с графиком.

3.      Возможность получения базы.

4.      Регистрация необходимости перерасчетов.

Эти уникальные свойства регистров расчета, а также связанные с ними виртуальные таблицы подробно описаны в книгах М. Радченко «Практическое пособие разработчика» (главы 9 и 10) и «Профессиональная разработка в системе 1С:Предприятие 8» (глава 10 «Реализация сложных периодических расчетов»).

Также на эту тему есть хорошие видеокурсы…

Типовая структура документа расчета

В большинстве случаев структура табличных частей документов совпадает со структурой соответствующих регистров расчета.

 

Большинство модулей расчетных документов реализовано однотипно. В модуле расчетного документа обычно содержатся процедуры:

1.      ЗаполнитьНачисления (или аналогичная, предназначенная для заполнения табличной части документа)

2.      РассчитатьНачисления (или аналогичная, предназначенная для расчета табличной части документа)

 

Структура процедуры «РассчитатьНачисления» модуля документа:

1.      Выполняется запрос по табличной части документа:

        ВыборкаПоНачислениям = СформироватьЗапросПоНачислениям().Выбрать();

2.      Создаются рабочие наборы записей необходимого(ых) регистра(ов) расчета:

        НаборОсновныеНачисления = РегистрыРасчета.ОсновныеНачисленияРаботниковОрганизаций.СоздатьНаборЗаписей();

3.      В цикле обходится результат запроса. Каждая строка проверяется на правильность заполнения и добавляется в наборы (созданные на шаге 1):

 

    Пока ВыборкаПоНачислениям.Следующий() Цикл

       
ПроверитьЗаполнениеСтрокиНачисления(ВыборкаПоШапкеДокумента,ВыборкаПоНачислениям, Отказ);
        Если НЕ
Отказ Тогда
           
// Заполним записи в наборах записей регистров
           
ДобавитьСтрокуОсновныхНачислений(ВыборкаПоНачислениям, НаборОсновныеНачисления);
           
МассивИндексыСтрокНачисления.Добавить(ВыборкаПоНачислениям.НомерСтроки-1);

        КонецЕсли;

    КонецЦикла;

«МассивИндексыСтрокНачисления» используется если необходимо рассчитать не все строки документа, а только некоторые (например, только по одному работнику). «МассивИндексыСтрокНачисления» используется в общем модуле «ПроведениеРасчетов» в процедуре «РассчитатьЗаписиНабора».

4.      Наборы записываетсяются в регистры:

       НаборОсновныеНачисления.Записать();

5.      Если табличная часть документа некорректно заполнена и какая-то строка не прошла проверку на заполнение, то наборы очищаются и пустые наборы записываются в регистры. Далее расчет не производится:

       Если Отказ Тогда
              
// Если есть какие-то проблемы - удаляем движения (тут нет транзакции)
               // Удаляем движения
              
НаборОсновныеНачисления.Очистить();
              
НаборОсновныеНачисления.Записать();

               Возврат;
       КонецЕсли;

6.      Если все хорошо, то в наборы добавляются записи сторно, для чего используется механизм дополнений регистра расчета:

       ТаблицаСторноЗаписей = НаборОсновныеНачисления.ПолучитьДополнение();
        ...

       Для каждого
СтрокаСторно Из ТаблицаСторноЗаписей Цикл
              
// Заполним записи в наборе записей регистра
              
Движение = НаборОсновныеНачисления.Добавить();
              
ЗаполнитьЗначенияСвойств(Движение, СтрокаСторно);
              
Движение.Сторно                         = Истина;
       ...

       КонецЦикла;

Функция «ПолучитьДополнение» набора записей регистра расчета получает дополнительные данные, позволяющие выполнить сторнирование записей прошлых периодов регистрации при вводе текущего набора записей. Подробнее об этой функции можно почитать в синтаксис-помошнике.

7.      Наборы опять записываются в регистры

НаборОсновныеНачисления.Записать();

8.      Вызывается экспортная процедура «РассчитатьЗаписиРегистраРасчета» общего модуля «Проведение расчетов»:

ПроведениеРасчетов.РассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРаботниковОрганизаций",
              
НаборОсновныеНачисления,
              
Начисления,
              
МассивИндексыСтрокНачисления,
              
Сотрудники,
              
КомментироватьРасчет);

В процедуре выполняется расчет записей набора регистра расчета по определенным алгоритмам. Результатом расчета являются заполненные ресурсы «Результат» и «ОплаченоДнейЧасов» в записях набора. Также процедура обновляет результаты расчета в табличной части документа. Подробно общий модуль «Проведение расчетов» будет описан далее.

9.      Наборы очищаются и пустыми записываются в регистры:

       НаборОсновныеНачисления.Очистить();
       НаборОсновныеНачисления.Записать();

10.   Записывается и сам документ:

       Записать();

Таким образом в табличной части документа появляются рассчитанные данные.

 

При проведении документа расчета его табличная часть, соответствующая регистру расчета, просто записывается в регистр расчета и никакие вычисления уже не производятся.

 

Здесьу начинающего программиста может возникнуть два вопроса:

1.      Почему нельзя выполнить расчеты при проведении документа?

2.      Как и когда при расчете используются уникальные свойства регистров расчета?

Ответ на первый вопрос:

Вспомним вторую цель конфигурации «Возможность ручной корректировки результатов расчета». Именно после расчета и до проведения документа пользователь может корректировать расчеты. При проведении в регистры расчета запишутся уже исправленные данные. Кстати откорректированные строки помечаются специальным признаком и при последующих расчетах не изменяются.

 

Ответ на второй вопрос:

Уникальные свойства регистров расчета становятся доступными после записи наборов в регистры  и используются в процедуре «РассчитатьЗаписиРегистраРасчета» общего модуля «Проведение расчетов».

 

Необычным для понимания является то, что основной функционал документа реализован в обработчике кнопки «Рассчитать», а не в обработчике «ОбработкаПроведения» как в большинстве документов конфигураций оперативного учета или бухгалтерии.

Виды расчетов

Совместно с регистрами расчета в конфигурации используются планы видов расчета. Планы видов расчета представляют собой списки всех начислений и удержаний, расчет которых возможен в конфигурации. В планах видов расчета описываются специфические свойства начислений и удержаний (видов расчета), используемых при расчете. Самыми важными свойствами видов расчета в конфигурации являются:

1.      Категория расчета

2.      Способ расчета

Свойство «Категория расчета» определяет последовательность расчета записей. Вначале будут рассчитаны виды расчета с категорией «Первичное», затем «Зависимое первого уровня», затем «Зависимое второго уровня» и т.д. Для чего это надо рассмотрим на примере.

 Допустим, мы используем начисление «Премия», которое рассчитывается как процент от начисленного по окладу. Очевидно, что при расчете премии уже должно быть рассчитано начисление по окладу. Поэтому виду расчета «Начислено по окладу» необходимо установить категорию «Первичное», а виду расчета «Премия» необходимо установить категорию «Зависимое первого уровня».

 

Свойство «Способ расчета» определяет алгоритм, который будет применяться при расчете данного вида расчета. Так как способы расчета задаются в перечислении, то список алгоритмов конфигурации ограничен, и пользователь не имеет возможности добавить новый алгоритм. Точнее, пользователь имеет возможность использовать универсальные способы расчета, в которых можно задавать различные формулы, но многие не используют эту возможность, а просят программиста добавить новый способ расчета.

 

Еще важно понять, что категория и способ расчета не являются встроенными (предопределенными) реквизитами плана видов расчета, поддерживаемые на уровне платформы, поэтому их обработка выполняется средствами прикладного решения - конфигурации.

Общий модуль «ПроведениеРасчетов»

Процедура модуля «РассчитатьЗаписиРегистраРасчета».

Процедура «РассчитатьЗаписиРегистраРасчета» является основной экспортной процедурой общего модуля «ПроведениеРасчетов» и предназначена для расчета набора записей определенного регистра расчета. Результатами расчета являются ВСЕ ресурсы регистра расчета.

Процедура вызывается из модулей всех расчетных документов при нажатии на кнопку «Рассчитать». Перед вызовом в документах формируется и записывается набор записей, который будет рассчитываться. Основными параметрами вызова процедуры являются имя регистра («ИмяРегистра» типа «Строка»), собственно сам набор записей («НаборЗаписейРегистра» типа «НаборЗаписейРегистраРасчета»)

Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра,
      
НаборЗаписейРегистра,
      
ТабличнаяЧастьДокумента = Неопределено,
      
МассивИндексыСтрокТабличнойЧасти = Неопределено,
      
Сотрудники = Неопределено,
      
КомментироватьРасчет = Ложь,
      
СотрудникиРасчетОтОбратного = Неопределено) Экспорт

Если в процедуру будет передан параметр «ТабличнаяЧастьДокумента», то результаты расчета будут помещены в табличную часть документа.

Описание работы процедуры:

1.      Определяется список видов расчета, которые необходимо рассчитать:

ТаблицаВидовРасчета = НаборЗаписейРегистра.Выгрузить();
ТаблицаВидовРасчета.Свернуть("ВидРасчета");
ВидыРасчетов = ТаблицаВидовРасчета.ВыгрузитьКолонку("ВидРасчета");

2.      Выполняется запрос по плану видов расчета. Выбираются различные категории, способ и показатели расчетов. Выборка ограничивается видами расчета из списка. Результат группируется и упорядочивается по категории расчета.

3.      Далее для каждой категории составляется массивы способов и показателей расчета:

Пока ВыборкаКатегорий.Следующий() Цикл
   
МассивСпособовРасчета = Новый Массив;       // Массив способов расчета текущий категории
   
МассивПоказателей     = Новый Массив;       // Массив видов показателей схем мотивации
   
...
   
ВложеннаяВыборка = ВыборкаКатегорий.Выбрать();
    Пока
ВложеннаяВыборка.Следующий() Цикл
   
МассивСпособовРасчета.Добавить(ВложеннаяВыборка.СпособРасчета);
           Если
ИмяПВР = "ОсновныеНачисленияОрганизаций" Тогда
                  Если
ВложеннаяВыборка.Показатель1 <> Null Тогда
                         
МассивПоказателей.Добавить(ВложеннаяВыборка.Показатель1);
                  КонецЕсли;
                ...
           КонецЕсли;
        ...
    КонецЦикла;

 

4.      С помощью функции «ПолучитьСтруктуруНеобходимыхДанных» определяются какие данные будут необходимы для расчета:

НеобходимыеДанные = ПолучитьСтруктуруНеобходимыхДанных(МассивСпособовРасчета, МассивПоказателей);

Параметрами вызова являются массивы способов и показателей расчета. Функция возвращает структуру флагов необходимых данных, значение каждого флага (элемента) которой может принимать булево значение. «Истина» будет установлена только для тех элементов структуры, которые будут необходимы для расчета. Функция «ПолучитьСтруктуруНеобходимыхДанных» будет подробно описана далее.

5.      Рассчитывается фактический период действия записей набора:

НаборЗаписейРегистра.Записать(Истина, ТолькоЗапись);

При выполнении записи переменной «ТолькоЗапись» присвоено значение «Ложь» (до начала цикла по категориям), поэтому выполняется запись с расчетом фактического периода действия (см. второй параметр процедуры в синтаксис-помошнике).

После первой записи переменной «ТолькоЗапись» присваивается значение «Истина», так как расcчитывать период действия нужно только один раз (при первой записи, когда рассчитывается первая категория).

ТолькоЗапись = Истина;

При расчете следующих категорий набор будет записан без расчета фактического периода действия, что значительно повышает производительность выполнения расчетов.

6.      С помощью функции «ПолучитьДанныеДляРасчета» получаем ВСЕ, необходимые для расчета текущей категории, данные:

ИсходныеДанные = ПолучитьДанныеДляРасчета(ИмяРегистра, ВыборкаКатегорий.КатегорияРасчета, НеобходимыеДанные, Регистратор, Организация, ПериодРегистрации, , Сотрудники, КомментироватьРасчет);

Структура «НеобходимыеДанные» передается в функцию через одноименный параметр. Функция возвращает выборку из результата запроса, полями которого являются исходные данные для ВСЕХ расчетов текущей категории. Функция «ПолучитьДанныеДляРасчета» является самой сложной функцией общего модуля «ПроведениеРасчетов» и будет подробно описана далее.

7.      С помощью процедуры «РассчитатьЗаписиНабора» производится расчет записей набора для которых получены исходные данные:

РассчитатьЗаписиНабора(ИсходныеДанные, НаборЗаписейРегистра, НеобходимыеДанные, ТабличнаяЧастьДокумента, МассивИндексыСтрокТабличнойЧасти, КомментироватьРасчет,, СотрудникиРасчетОтОбратного);

Через параметры в процедуру передаются исходные данные для расчетов ( структура «ИсходныеДанные»), определенные ранее с помощью функции «ПолучитьДанныеДляРасчета» и набор записей регистра. В этой же процедуре происходит заполнение табличной части документа, если передан параметр «ТабличнаяЧастьДокумента».

8.      После расчета набор записей регистра опять записывается, но уже без расчета фактического периода действия:

НаборЗаписейРегистра.Записать(Истина, ТолькоЗапись);

9.      Далее выполняются специфические действия только для регистра расчета «ВзносыВФонды»(для украинских конфигураций):

Если ИмяРегистра = "ВзносыВФонды"  Тогда
   
ИсходныеДанныеСторно = ПолучитьДанныеДляРасчетаСторноВзносовВФонды( Регистратор, ЭтоВзносы, Сотрудники, КомментироватьРасчет);
   
РассчитатьЗаписиНабораСторноВзносовВФонды(ИсходныеДанныеСторно, НаборЗаписейРегистра, ТабличнаяЧастьДокумента, МассивИндексыСтрокТабличнойЧасти, КомментироватьРасчет);
КонецЕсли;
                          

Замечания по доработке:

Обычно эта процедура не требует доработок.

Функция «ПолучитьСтруктуруНеобходимыхДанных»

Функция возвращает структуру флагов необходимых для расчета данных, значение каждого флага(элемента) которой может принимать булево значение. Функция анализирует массив способов и показателей расчета и устанавливает значение «ИСТИНА» только для тех элементов структуры, которые необходимы для расчета. Текст функции можно разделить на три части:

1.      Создание структуры необходимых данных со всеми флагами, установленными в значение «ЛОЖЬ»:

       НеобходимыеДанные = Новый Структура;
      
НеобходимыеДанные.Вставить("База", Ложь);
      
НеобходимыеДанные.Вставить("БазаПоНазначению", Ложь);
      
НеобходимыеДанные.Вставить("БазаПоНоменклатурнойГруппе", Ложь);
      
НеобходимыеДанные.Вставить("БазаУдержаний", Ложь);
       ...

2.      Обход массива способов расчета и установки флагов, необходимых данных для каждого способа:

             Для Каждого СпособРасчета Из МассивСпособРасчета Цикл
               Если  
СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ГосударственноеПособие Тогда
                     
НеобходимыеДанные.ГосударственноеПособие = Истина;
                     
НеобходимыеДанные.ГосударственноеПособиеУчитыватьВремя = Истина;
               ИначеЕсли     
СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ПоМесячнойТарифнойСтавкеПоЧасам Тогда
                     
НеобходимыеДанные.ОтработаноВремени = Истина;
                     
НеобходимыеДанные.НормаВремени = Истина;
                     
НеобходимыеДанные.НормаВремениЗаМесяц = Истина;
                    ...
               КонецЕсли;
       КонецЦикла;
                                    

3.      Обход массива показателей расчета и установки флагов, необходимых данных для каждого способа:

             Для Каждого Показатель Из МассивПоказателей Цикл
              
НеобходимыеДанные.СдельныйЗаработок = НеобходимыеДанные.СдельныйЗаработок Или Показатель = Справочники.ПоказателиСхемМотивации.СдельнаяВыработка;
            ...
       КонецЦикла;

 

Замечания по доработке:

При добавлении нового способа расчета обязательно приходится добавлять секцию «ИначеЕсли» в текст этой функции. Категорически не рекомендуется для нового способа расчета устанавливать те флаги, которые для его расчета не нужны, так как это понижает производительность! Если новый способ расчета требует новых флагов, то их необходимо добавить в первую часть процедуры.

 Функция «ПолучитьДанныеДляРасчета»

Функция «ПолучитьДанныеДляРасчета» является самой важной и самой сложной в общем модуле «ПроведениеРасчетов». Функция анализирует флаги необходимых данных, составляет по ним текст запроса и возвращает выборку из результата запроса, полями которого являются исходные данные для вычисления ВСЕХ видов расчета текущей категории. Текущая категория передается в функцию через один из параметров. Текст функции можно разделить на две части:

1.      Определение текстов вложенных запросов с использованием временных таблиц;

2.      Анализ флагов необходимых данных, составление по ним текста запроса и установка параметров запроса.

В конце функции выполняется запрос и возвращается результат запроса. Использование итогов в запросе и обход по группировкам необходим для поддержки режима комментирования расчета, а именно для возможности расшифровки базы.

Первая часть находится выше строки:

       Запрос = Новый Запрос();

и содержит определение текстов запросов ВСЕХ возможных временных таблиц.

В большинстве вложенных запросов основной таблицей является выборка из рассчитываемого регистра расчета, которая должна соответствовать рассчитываемым записям:

       СводныеИндивидуальныеГрафикиТекст =
      
"ВЫБРАТЬ
       |      Основной.НомерСтроки КАК НомерСтроки,
       |ПОМЕСТИТЬ ВТСводныеИндивидуальныеГрафики
       |ИЗ
       |      РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основной

В подобных запросах используется отбор по регистратору и признаку авторасчета:

       |ГДЕ
       |      Основной.Авторасчет
       |      И Основной.Регистратор = &ПарамРегистратор

Так как такие вложенные запросы связываются с основным по номеру строки, индексировать их временные таблицы нужно также по номеру строки:

       |ИНДЕКСИРОВАТЬ ПО

       |      НомерСтроки";

 

Во второй части в зависимости от имени регистра расчета создается текст запроса. Вторую часть функцию можно разделить также на две части:

1.      Составление текста секции «ВЫБРАТЬ» (полей выборки) запроса;

2.      Добавление в запрос текстов левых соединений.

Первая часть начинается со строки предложения «ВЫБРАТЬ»:

 

               ТекстЗапроса =
              
"ВЫБРАТЬ

и заканчивается строкой предложения «ИЗ»:

               ТекстЗапроса = ТекстЗапроса + "
               |ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций Как Основной"
;

В первой части в зависимости от установленных флагов необходимых данных в секцию «ВЫБРАТЬ» добавляются нужные поля:

Если НеобходимГрафик Тогда
   
ТекстЗапроса = ТекстЗапроса + ",
       |      ЕСТЬNULL(СводныеИндивидуальныеГрафики.ОшибкаВводаИндивидуальногоГрафикаРаботы, ЛОЖЬ) КАК ОшибкаВводаИндивидуальногоГрафикаРаботы,
       |      ЕСТЬNULL(ВремяВведенноеВЦеломЗаПериод.ОшибкаВводаОтработанногоВремени, ЛОЖЬ) КАК ОшибкаВводаОтработанногоВремени,
        ...

Таблицы «СводныеИндивидуальныеГрафики» и «ВремяВведенноеВЦеломЗаПериод» будут добавлены в текст запроса ниже с помощью левых соединений.

Если установлен флаг «КомментироватьРасчет», то в список полей итогов добавляются дополнительные поля:

Если КомментироватьРасчет Тогда
      
ПоляЗапросаМаксимум.Добавить("ГрафикРаботыНаименование");
       ...
КонецЕсли;

Во второй части в запрос добавляются тексты необходимых левых соединений. При этом анализируются флаги необходимых данных. Для каждого флага, если он установлен, заполняются соответствующие временные таблицы:

Если НеобходимГрафик Тогда
      
Запрос.УстановитьПараметр("ПоДням", Перечисления.ВидыУчетаВремени.ПоДням);
      
Запрос.УстановитьПараметр("ПоЧасам", Перечисления.ВидыУчетаВремени.ПоЧасам);
        ...
       Если
СводныеИндивидуальныеГрафикиТекст <> "ВТСводныеИндивидуальныеГрафики" Тогда
              
Запрос.Текст = СводныеИндивидуальныеГрафикиТекст;
              
Запрос.Выполнить();
              
СводныеИндивидуальныеГрафикиТекст = "ВТСводныеИндивидуальныеГрафики";
       КонецЕсли;
        ...

      
Запрос.Текст = ВремяВведенноеВЦеломЗаПериодТекст;
      
Запрос.Выполнить();
      
ВремяВведенноеВЦеломЗаПериодТекст = "ВТВремяВведенноеВЦеломЗаПериод";

До выполнения вложенного запроса необходимо установить параметры запроса. Если временная таблица могла быть заполнена ранее (при анализе флага выше по тексту функции), то выполнение запроса необходимо помещать в условие (например «СводныеИндивидуальныеГрафикиТекст»), чтобы не выполнить запрос второй раз.

Временные таблицы добавляются к основному запросу с помощью левого соединения:

ТекстЗапроса = ТекстЗапроса + "
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.ДанныеГрафика("
+ Условие ") Как ДанныеГрафика
|ПО Основной.Регистратор = ДанныеГрафика.Регистратор И Основной.НомерСтроки = ДанныеГрафика.НомерСтроки
|ЛЕВОЕ СОЕДИНЕНИЕ "
+ СводныеИндивидуальныеГрафикиТекст + " КАК СводныеИндивидуальныеГрафики
|ПО Основной.НомерСтроки = СводныеИндивидуальныеГрафики.НомерСтроки
|ЛЕВОЕ СОЕДИНЕНИЕ "
+ ВремяВведенноеВЦеломЗаПериодТекст + " КАК ВремяВведенноеВЦеломЗаПериод
|ПО Основной.НомерСтроки = ВремяВведенноеВЦеломЗаПериод.НомерСтроки

В конце составления текста запроса добавляются условия:

       ТекстЗапроса = ТекстЗапроса + "
       |ГДЕ "
+ ВнешнееУсловие;

Для начислений внешнее условие определяется так:

       ВнешнееУсловие = "Основной.ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления И Основной.Регистратор = &парамРегистратор";

То естьданные для расчета будут получены только для записей текущей категории.

Самыми сложными данными для расчетов, определяемыми в процедуре, являются:

1.      Данные о часовой тарифной ставке

2.      Данные об отработанном времени из нескольких вложенных запросов с использованием «СпособОпределения» и «ОшибкаОпределения»

3.      Данные о норме времени

4.      Данные о базе.

Сложность первых трех заключается в том что результаты определяются из нескольких вложенных запросов по определенному приоритету (если результат не получен из одного запроса, то он берется из другого). Для реализации приоритета используются конструкции «ВЫБОР КОГДА» и «ЕСТЬNULL» при составлении текста секции «ВЫБРАТЬ»:

|      ВЫБОР
|              КОГДА ЕСТЬNULL(ВремяВведенноеПоКаждомуДню.ОшибкаВводаОтработанногоВремени, ЛОЖЬ)
|                     ТОГДА 0
|              ИНАЧЕ ЕСТЬNULL(ВремяВведенноеПоКаждомуДню.ДнейПоТабелю,
|      ВЫБОР
|              КОГДА ЕСТЬNULL(ВремяВведенноеВЦеломЗаПериод.ОшибкаВводаОтработанногоВремени, ЛОЖЬ)
|                     ТОГДА 0
|              ИНАЧЕ ЕСТЬNULL(ВремяВведенноеВЦеломЗаПериод.ДнейПоТабелю, ВЫБОР
|                                                          КОГДА ЕСТЬNULL(СводныеИндивидуальныеГрафики.ОшибкаВводаИндивидуальногоГрафикаРаботы, ЛОЖЬ)
|                                                                 ТОГДА 0
|                                                          ИНАЧЕ ЕСТЬNULL(СводныеИндивидуальныеГрафики.ДнейПоГрафику, ЕСТЬNULL(ВЫБОР
|                                                                                        КОГДА Основной.ВидУчетаВремени = &ПоДням
|                                                                                               ТОГДА ДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия
|                                                                                        ИНАЧЕ ДанныеГрафика.ДополнительноеЗначениеФактическийПериодДействия
|                                                                                КОНЕЦ, 0))
|                                                   КОНЕЦ
|                                           КОНЕЦ
|      КОНЕЦ КАК ОтработаноДней,

В данном примере определяется количество отработанных дней по следующему приоритету:

1.      Если введен подробный табель, то данные берутся из него

2.      Иначе если введен сводный табель, то данные берутся из него

3.      Иначе если введен индивидуальный подробный график, то данные берутся из него

4.      Иначе если введен сводный индивидуальный график, то данные берутся из него

5.      Иначе данные берутся из общего графика

Для того что бы понять из какой временной таблицы определены данные дополнительно применяется поле способа ввода данных «СпособВвода…»:

|      ВЫБОР
|              КОГДА ЕСТЬNULL(ВремяВведенноеПоКаждомуДню.ОшибкаВводаОтработанногоВремени, ЛОЖЬ)
|                     ТОГДА NULL
|              ИНАЧЕ
|                     ВЫБОР
|                             КОГДА НЕ ВремяВведенноеПоКаждомуДню.ОсновноеЗначениеПоТабелю ЕСТЬ NULL
|                                    ТОГДА 4
|                             ИНАЧЕ
|      ВЫБОР
|              КОГДА ЕСТЬNULL(ВремяВведенноеВЦеломЗаПериод.ОшибкаВводаОтработанногоВремени, ЛОЖЬ)
|                     ТОГДА NULL
|              ИНАЧЕ
|                     ВЫБОР
|                             КОГДА НЕ ВремяВведенноеВЦеломЗаПериод.ОсновноеЗначениеПоТабелю ЕСТЬ NULL
|                                    ТОГДА 1
|                             ИНАЧЕ
|                                    ВЫБОР
|                                           КОГДА ЕСТЬNULL(СводныеИндивидуальныеГрафики.ОшибкаВводаИндивидуальногоГрафикаРаботы, ЛОЖЬ)
|                                                   ТОГДА NULL
|                                           ИНАЧЕ
|                                                   ВЫБОР
|                                                          КОГДА НЕ СводныеИндивидуальныеГрафики.НормаВремени ЕСТЬ NULL
|                                                                 ТОГДА 2
|                                                          ИНАЧЕ 3
|                                                   КОНЕЦ
|                                    КОНЕЦ
|                             КОНЕЦ
|                     КОНЕЦ
|              КОНЕЦ
|      КОНЕЦ КАК СпособВводаВремени

В зависимости от того из какого источника определены данные поле принимает значение 1, 2, 3 или 4. Впоследствии это применяется для комментирования расчета и очень удобно для пользователя. Кроме способа ввода еще определяются поля «ОшибкиВвода» для анализа ошибок данных вложенных запросов. Эти поля тоже используются для комментирования расчета.

При определении данных базы используется самая сложная виртуальная таблица регистра расчета «ДанныеБазы»:

|ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций.БазаОсновныеНачисленияРаботниковОрганизаций(&парамИзмеренияОсновного, &парамИзмеренияБазового, &парамРазрезы, " + Условие + ") Как База1

Для получения базы в нужных разрезах, а также для возможности расшифровки базы по базовым видам расчета при комментировании используются разрезы («&парамРазрезы»).

Замечания по доработке:

Если в структуру необходимых данных был добавлен новый флаг, то его обработку необходимо добавить в эту функцию. Надо помнить, что добавлять надо строки как в секцию «ВЫБРАТЬ» так и в секцию добавления левых соединений. Если флагу необходимы временные таблицы, то тексты их определения необходимо поместить в первую часть функции по аналогии с существующими. Временные таблицы вложенных запросов обязательно индексировать по тем полям, по которым они будут связанны в левом соединении с основным запросом (в основном, это номер строки).

В запросах к регистру расчета нужно применять условия на регистратор и признак авторасчета:

       |ГДЕ
       |      Основной.Авторасчет
       |      И Основной.Регистратор = &ПарамРегистратор

Не помешает условие и на категорию расчета, но в типовой конфигурации почему-то не применяется.

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

Для определения данных базы используется виртуальная таблица «ДанныеБазы», у которой имеются определенные проблемы с производительностью (вероятно из-за расчета с использованием пропорции по норме времени из графика). Для повышения производительности можно переписать получение данных базы без использования виртуальной таблицы:

|ЛЕВОЕ СОЕДИНЕНИЕ (
|      ВЫБРАТЬ
|              Основной.НомерСтроки КАК НомерСтроки,
|      Основной.Сотрудник                          КАК Сотрудник,
|      НАЧАЛОПЕРИОДА(Основной.БазовыйПериодНачало, МЕСЯЦ)  КАК ДатаНачала,
|      Основной.ВидРасчета                         КАК ВидРасчета,
|      СУММА(БазаИзНачислений.Результат)    КАК РезультатБаза
|      ИЗ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основной
|
|      ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК БазаИзНачислений
|      ПО             Основной.Сотрудник = БазаИзНачислений.Сотрудник
|              И      НАЧАЛОПЕРИОДА(БазаИзНачислений.ПериодДействия, МЕСЯЦ) = НАЧАЛОПЕРИОДА(Основной.БазовыйПериодНачало, МЕСЯЦ)
|      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.ОсновныеНачисленияОрганизаций.БазовыеВидыРасчета КАК БазовыеВидыРасчета
|      ПО             Основной.ВидРасчета = БазовыеВидыРасчета.Ссылка
|              И      БазаИзНачислений.ВидРасчета = БазовыеВидыРасчета.ВидРасчета
|
|      ГДЕ            Основной.ВидРасчета.КатегорияРасчета = &парамКатегорияНачисления И Основной.Регистратор = &парамРегистратор И Основной.Авторасчет
|      СГРУППИРОВАТЬ ПО
|      Основной.Сотрудник,
|       Основной.НомерСтроки,
|      Основной.БазовыйПериодНачало,
|      Основной.ВидРасчета) Как База
|ПО База.НомерСтроки = Основной.НомерСтроки

Еще лучше оформить это с применением временной таблицы. Если необходима расшифровка по базовым видам расчета, то в группировку необходимо добавить «БазаИзНачислений.ВидРасчета».

Процедура «РассчитатьЗаписиНабора»

Процедура «РассчитатьЗаписиНабора» рассчитывает записи набора регистра расчета.

Запись набора рассчитывается только если для нее найдены необходимые данные для расчета:

               СтруктураПоиска.НомерСтроки = СтрокаДвижений.НомерСтроки;
               Если
ИсходныеДанные.НайтиСледующий(СтруктураПоиска) Тогда

Если в процедуру через параметр передана табличная часть документа, то выполняется поиск нужных строк для заполнения в них результатов расчета из рассчитанной строки набора:

              СтрокаТабличнойЧасти = Неопределено;
              Если
ТабличнаяЧастьДокумента <> Неопределено Тогда
                     

                      СтрокаТабличнойЧасти = ТабличнаяЧастьДокумента.Получить(НаборЗаписейРегистра.Индекс(СтрокаДвижений));

Если передан массив конкретных строк документа, то строка табличной части определяется:

                   СтрокаТабличнойЧасти = ТабличнаяЧастьДокумента.Получить(МассивИндексыСтрокТабличнойЧасти.Получить(НаборЗаписейРегистра.Индекс(СтрокаДвижений)));

Далее вызывается процедура «РассчитатьЗаписьРегистраРасчета», в которой происходит непосредственный расчет записи:

РассчитатьЗаписьРегистраРасчета(СтрокаДвижений, ИсходныеДанные, НеобходимыеДанные, УправленческиеРасчеты, РегламентированныеНачисления, РегламентированныеУдержания, ОсновныеНачисленияОрганизаций, ВзносыВФонды, КомментироватьРасчет, ФормаКомментариев, ГрафикиБезРабочегоВремени);

Результаты расчета при этомсохраняются в рассчитываемой записи. Стоит отметить, что результатом расчета является не только рассчитанная денежная сумма, но и оплачиваемое время (в днях или часах).

Если определена строка табличной части документа (см. выше), то данные расчета (сумма и оплачиваемой время) записываются в строку табличной части.

Если СтрокаТабличнойЧасти <> Неопределено Тогда
      
СтрокаТабличнойЧасти.Результат = СтрокаДвижений.Результат;
       Если
ОсновныеНачисленияОрганизаций И СтрокаДвижений.Авторасчет Тогда
              
СтрокаТабличнойЧасти.ОплаченоДнейЧасов = СтрокаДвижений.ОплаченоДнейЧасов;
        ...
       КонецЕсли;
КонецЕсли;

В зависимости от установленных в виде расчета признаков (ЗачетОтработанногоВремени, ЗачетНормыВремени и ЗачетКалендарных) в рассчитанной записи и, если надо, в строке табличной части заполняются реквизиты об отработанном времени, норме времени и календарных днях.

Замечания по доработке:

Данная процедура почти никогда не требует доработок.

Процедура «РассчитатьЗаписьРегистраРасчета»

Процедура «РассчитатьЗаписьРегистраРасчета» производит непосредственный расчет записи. В этой процедуре выполняется связанный с указанным в записи способом расчета алгоритм. Данные для расчета содержатся в записи набора («СтрокаДвижений») и структуре «ИсходныеДанные», которые передаются в процедуру как параметры. Процедура организована в виде набора блоков «ИначеЕсли» с проверкой на способ расчет:

Если СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.Процентом Тогда
       ...
ИначеЕсли
СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ГосударственноеПособие Тогда
       ...
ИначеЕсли
СпособРасчета = Перечисления.СпособыРасчетаОплатыТруда.ФиксированнойСуммой  Тогда
       ...
Иначе
// Не найден способ расчета

   
ОшибкаРасчета(ИсходныеДанные.СотрудникНаименование + "; " + ИсходныеДанные.ВидРасчетаНаименование + ": вид расчета не предусмотрен");

КонецЕсли;

В каждом блоке реализован алгоритм расчета для одного способа расчета. Блоков «ИначеЕсли» столько, сколько способов расчета поддерживает конфигурация.

Результат расчета сохраняется в локальной переменной модуля «Результат»:

Результат = ИсходныеДанные.РезультатБаза * СтрокаДвижений[ПоказательРазмер]/100;

В конце процедуры результат сохраняется в строке движения в зависимости от признака «Сторно» с положительным или отрицательным знаком:

       Если СтрокаДвижений.Сторно Тогда
              
СтрокаДвижений.Результат = Результат * -1;
                ...
       Иначе
              
СтрокаДвижений.Результат = Результат;
       КонецЕсли;

Большинство реальных начислений оплачивают определенное время (отработанное или не отработанное). И выше было указано, что результатом расчета является не только сумма начисления, но и оплачиваемое время в днях или часах (реквизит «ОплаченоДнейЧасов» строки движений). Когда оплачивается отработанное время, то оно определяется с помощью функции «ОплачиваемоеВремя»:

ОтработаноВремениОсновное     = ОплачиваемоеВремя(ИсходныеДанные, СтрокаДвижений, КомментироватьРасчет, КомментарийВидаРасчета, , ГрафикиБезРабочегоВремени);
...

СтрокаДвижений.ОплаченоДнейЧасов = ОтработаноВремениОсновное * ?(СтрокаДвижений.Сторно,-1,1);

Функция «ОплачиваемоеВремя» будет рассмотрена ниже.

В конфигурации предусмотрен режим проведения расчетов с комментированием (в процессе расчета выдаются сообщения со значениями параметров и промежуточных результатов). Для способов расчетов, использующих базу (сумму результатов других начислений) при комментировании расшифровывается база до базовых видов расчета. Для этого используются детальные записи из результата запроса «ИсходныеДанные»:

РасшифровкаБазы = ИсходныеДанные.Выбрать();
Пока
РасшифровкаБазы.Следующий() Цикл
       Если
РасшифровкаБазы.РезультатБаза <> 0 Тогда
              
КомментарийРасчета(РасшифровкаБазы.ВидРасчетаРазрезНаименование + ": " + РасшифровкаБазы.РезультатБаза, КомментарийБазы);
       КонецЕсли;
КонецЦикла;

Замечания по доработке:

При добавлении нового способа расчета в эту процедуру необходимо добавить блок «ИначеЕсли» с реализацией алгоритма расчета для нового способа.

В этой процедуре допускается применение только простейших действий (арифметические, максимум, минимум) с исходными данными и рассчитываемой строкой движений набора,не должно быть никаких запросов. Все, что необходимо для расчета УЖЕ должно быть в структуре «ИсходныеДанные».

Функция «ОплачиваемоеВремя»

Функция «ОплачиваемоеВремя» вызывается при расчете определенного вида начисления: при обработке конкретного способа расчета в процедуре  «РассчитатьЗаписьРегистраРасчета» и необходима для:

1.      Определения оплачиваемого времени;

2.      Анализа ошибок определения отработанного времени;

3.      Формирования текстов комментариев (если включен режим комментирования)

В конфигурациях эта функция применяется только для начислений за отработанное время. Оплачиваемое время определяется исходя из вида времени (Отработанное/Неотработанное) и вида учета времени (ПоДням/ПоЧасам).

Анализ ошибок определения отработанного времени происходит с помощью проверки значения поля «ОшибкиВвода» исходных данных. При этом формируются соответствующие сообщения об ошибках.

Если включен режим комментирования, то функция формирует интерактивные тексты комментариев определения оплачиваемого времени в зависимости от значения поля «СпособВвода» исходных данных. Интерактивность заключается в возможности открытия объектов (справочников, документов) по клику мышки на тексте описания этого объекта в комментарии.

Замечания по доработке:

Если изменялись алгоритмы формирования полей «СпособВвода» или «ОшибкиВвода» при определении отработанного времени в функции «ПолучитьДанныеДляРасчета», то необходимо изменить обработку этих полей в этой функции.

Почему все так сложно…

В начале статьи были описаны две важные цели разработки конфигурации ЗУП. Работа общего модуля «Проведения расчетов» организована с учетом первой цели: «Скорость (производительность) выполнения расчетов». Самая трудоемкая операция – это получение исходных данных для расчетов организована таким образом, что данные для расчета всех записей набора определенной категории выбираются за один раз. При этом вся нагрузка ложится на SQL сервер.

Добавление нового способа расчета

Для добавления нового вида расчета необходимо добавить блоки «ИначеЕсли» в следующие процедуры и функции:

1.      ПроведениеРасчетов.ВизуализироватьФормулуРасчета

2.      ПроведениеРасчетов.ПолучитьСтруктуруНеобходимыхДанных

3.      ПроведениеРасчетов.РасчитатьЗаписьРегистраРасчета

4.      РаботаСДиалогами.ПолучитьСведенияОВидеРасчетаСхемыМотивации

В следующие процедуры надо просто добавить (если необходимо) способ расчета в список

1.      ПроведениеРасчетов.РассчитатьЗаписиНабора

2.      ПроведениеРасчетов.ПолучитьСписокОсновныхВариантовНачисленийОрганизации

3.      ПроведениеРасчетов.ПолучитьСписокСпособовРасчетаНеТребующихУказанияВалюты

4.      ПроведениеРасчетов.СпособРасчетаНеТребуетВалюты

 

Если в структуру необходимых данных были добавлены новые флаги, то их обработка должна производиться в функции "ПолучитьДанныеДляРасчета".

Сравнение с конфигурацией ЗиК платформы версии 7.7

Данный материал полезен программистам, имеющим опыт работы с конфигурацией ЗиК 7.7.

Сравнение компоненты «Расчет»7.7 и платформы 8 в части расчетов:

Понятие платформы 7.7

Аналог в платформе 8.х

Примечание к 8.х

Журнал расчетов

Регистр расчета

Автоматически вытеснение не срабатывает и перерасчеты тоже. Записи можно вносить только документами.

Запись журнала расчетов

Запись регистра расчетов

 

Признак «Сторно»

Встроенный реквизит регистра расчетов

 

Признак «Перерасчет»

Встроенного реквизита регистра нет

 

Признак «Исправлена»

Встроенного реквизита регистра нет

 

Текущий период регистра расчетов

Нет такого понятия

Записи могут вносится в регистр расчета с любым периодом регистрации

Виды расчетов

Планы видов расчета

Виды расчетов можно добавлять в режиме предприятия

Приоритет вида расчет

Нет такого понятия

Прикладная конфигурация должна самостоятельно следить за последовательностью расчета.

Группы расчетов

Нет такого понятия

В плане видов расчета есть предопределенная табличная часть «Базовые», которая используется для автоматического получения базы

Вытеснение

В плане видов расчета есть предопределенная табличная часть «Вытесняющие»

Список вытесняющих видов расчета можно изменять в режиме пользователя.

Перерасчеты

В плане видов расчета есть предопределенная табличная часть «Ведущие»

Автоматически перерасчеты не производятся, а только регистрируется их необходимость в отдельных таблицах

Календари

Нет такого понятия

В прикладной конфигурации графики работы и календари реализованы с применением регистров сведений

 

По сравнению с 8 в 7.7 программист делал меньше, а платформа больше. Из-за этого иногда не хватало универсальности. В 8 универсальности больше, но и программисту работы добавилось.

 

Сравнение конфигураций ЗиК7.7 и ЗУП8:

Понятие в ЗиК7.7

Аналог в ЗУП8

Период регистрации определяется по текущему периоду регистра расчета

Период регистрации указывается в отдельном реквизите шапки каждого документа

Справочник «Шкала ставок»

Больше десятка регистров сведений для хранения всех законодательно установленных значений

Справочник «Подразделения»

Справочник «ПодразделенияОрганизации»

 

Справочник «Должности»

Справочник «ДолжностиОрганизации»

Справочник «Штатное расписание». Место работы (ячейка штатного расписания) это справочник штатное расписание с реквизитом «Должность», подчиненный справочнику «Подразделения», то есть Подразделение+Должность.

Регистр сведений «Штатное расписание». Измерениями регистра являются «ПодразделенияОрганизации» и «ДолжностиОрганизации», то есть тоже Подразделение+Должность

Справочник «ФизическиеЛица»

Справочник «ФизическиеЛица»

Справочники «Сотрудники»

Справочники «Сотрудники» и

Справочник «Назначения»

Регистр сведений «РаботникиОрганизаций»

Справочник «ДопРасчеты»

Регистры сведений «ПлановыеНачисления/Удержания»

Взносы в фонды на ФОТ тоже учитываются в регистре расчета (в том же где и взносы с работника «Взносы в фонды»)

НДФЛ учитывается только в регистре накопления остатков «Взаиморасчеты по НДФЛ»

Используются регистры накопления остатков (переходящие остатки считаются автоматически):

  1. Взаиморасчеты с сотрудниками
  2. Взаиморасчеты по НДФЛ
  3. Взаиморасчеты по взносам в фонды
  4. Ссуды

В ЗУП в отличие от ЗиК есть удобная возможность ручного исправления результатов всех автоматических расчетов.

В ЗиК расчет каждой записи журнала расчетов происходит независимо от остальных. При этом все данные для расчета надо выбирать из базы заново (даже если мы их уже выбирали для расчета предыдущей записи). То есть при расчете каждой записи данные выбираются из базы, рассчитываются и в базу записывается результат.

В ЗУП сначала выбираются данные из базы для расчета всех (почти всех с учетом зависимости) записей регистра расчета, выполняется расчет и результаты расчета записываются в базу опять для всех записей.

 

 

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Сергей Осипенко 29.09.10 00:04 Сейчас в теме
Хорошо. А откуда текст, если не секрет?
2. alexk-is 6441 29.09.10 09:25 Сейчас в теме
Тексты модулей в публикации можно раскрасить получше
46. Bukaska 131 08.10.18 14:58 Сейчас в теме
(2)Сайт прекрасно сам всё раскрашивает. Только теги кода не каждый под носом видит)))
3. Sergant 45 30.09.10 22:56 Сейчас в теме
Слишком сложно для начинающего программиста. :)
4. RailMen 01.10.10 08:59 Сейчас в теме
5. oaf_is 06.10.10 09:12 Сейчас в теме
А по кадровой подсистеме нет подобного?
6. erem 412 06.10.10 10:57 Сейчас в теме
(5) Нету... Писал для самого сложного...
39. Bukaska 131 06.02.14 14:22 Сейчас в теме
(5) oaf_is, (7) oaf_is, вот по кадровой системе: http://infostart.ru/public/248004/
7. oaf_is 06.10.10 13:45 Сейчас в теме
Спасибо. Почитаю. Нужно. Подсистема кадровая не освещалась подобным образом? ;)
8. Prepod2003 14.10.10 22:58 Сейчас в теме
С ЗУП только начал знакомиться. И не понимаю, почему при расчете больничного, например не перерассчитываются вытесняемые больничным записи, например оклад, если он уже ранее был рассчитан? То есть не понятно, как на практике в организациях обходят эту проблему? Нельзя же просто сказать расчетчику, что документ «Начисление зарплаты» нужно рассчитывать в последнюю очередь, да и мало ли что бывает… В общем, если кто поделится опытом по данному моему затруднению, буду благодарен.))
А автору спасибо за отличный материал!
9. nmvrd 27.10.10 20:22 Сейчас в теме
Сергун, всё имнно так, как ты и написал - начисление зарплаты делается в последнюю очередь, после всех док-ов типа отпуска или б.листа. такой вот ужас. а если что не так, что-то вспомнили после "закрытия" месяца, то вводятся документы-исправления.

спасибо за статью
10. Hort1 08.09.11 17:43 Сейчас в теме
11. vl88 01.10.11 16:41 Сейчас в теме
прекрасная статья!только можно было разбить на пункты и блоги!а то слишком большая для восприятия!
12. Ganja_666 07.11.11 20:12 Сейчас в теме
13. KliMich 14.12.11 19:22 Сейчас в теме
Спасибо за статью.
Для начального изучения - однозначно плюс
14. volit 30.12.11 08:53 Сейчас в теме
Благодарю автора очень помогла статья, все четко и без воды.
15. irishka77 02.01.12 22:48 Сейчас в теме
16. nataliaK 21.02.12 10:13 Сейчас в теме
Давно искала информацию по добавлению нового вида расчета. Автор очень помог. Спасибо.
17. kvp 19.03.12 16:13 Сейчас в теме
Очень интересная и нужная статья. Автору спасибо!
18. sashapere 146 09.07.12 13:35 Сейчас в теме
А можете немного рассказать про универсальные способы расчета, как их использовать.
19. Zord 31.07.12 08:18 Сейчас в теме
Актуально! Как раз с ЗУП'ом надо разбираться =) Автору спасибо!
20. medv 20.09.12 10:42 Сейчас в теме
Хорошая статья. Внедрение зарплаты занимаюсь более 10 лет. Часто приходят новые сотрудники, которым приходится пытаться на пальцах обяснить сложные расчеты. Теперь есть куда отправить, если нет времени :)
21. borrman 07.02.13 22:00 Сейчас в теме
Класс. Однозначно +
Когда начинал работать с ЗУП - эта статья была бы ну очень кстати и не пришлось бы все ковырять самому :)
22. agnev 64 12.02.13 16:50 Сейчас в теме
Прекрасная статья, огромное спасибо! И нашел вовремя - как раз готовлюсь к специалисту. Сэкономил себе кучу времени на начальное изучение "внутренностей", ведь ранее с конфой работать не приходилось.
23. alekseies 15.02.13 11:48 Сейчас в теме
24. Borometr 35 13.03.13 06:23 Сейчас в теме
Действительно одна из сложных конфигураций, с доработкой бухгалтерии и других конфигураций особых проблем не возникало, а здесь для меня вообще пока ничего непонятно. Бухгалтера просят сделать так, чтобы вычет НДФЛ делался только на доходы определенных видов начислений, а не на все, полазил в конфигураторе по модулям, голова заболела, пошел спать (((
25. Dmitrii_1C 13.03.13 07:32 Сейчас в теме
Хорошая статья, автору +. (24) Borometr, ха, правильно сделал, а то бы начал там модуля переписывать.
32. CheBurator 3408 15.01.14 04:04 Сейчас в теме
(24) мало того, скорее всего буЛГахтеры неправы...
В подавляющем количестве случаев хотелки бухов по ЗП идут вразрез с положениями законодательных актов.
spogo; ula1c; ivnik; +3 Ответить
26. Synoecium 673 15.07.13 11:46 Сейчас в теме
Отличная статья, все разложено по полочкам и даже объяснено почему реализовано именно так. Автор молодец!:)
27. Lordemar 5 16.07.13 18:16 Сейчас в теме
Статья отличная, автору +. Кое-что для себя подчерпнул
28. ogoneksergei 3 26.07.13 11:40 Сейчас в теме
Отличная статья. Спасибо автору. Все доступно и понятно.
29. LexSeIch 205 01.08.13 11:39 Сейчас в теме
Мир этому дому!
Отличная полезная статья. Попалась бы она год назад, как раз, при изучении программирования на курсах... Плюс однозначно...
30. i_pich 45 10.09.13 09:29 Сейчас в теме
Спасибо автору, полезная статья!
31. Leanna 15.01.14 02:19 Сейчас в теме
33. Makushimo 155 16.01.14 07:06 Сейчас в теме
Побольше бы таких статей
Однозначно полезная статья.
34. DoctorRoza 16.01.14 08:12 Сейчас в теме
Хорошая статья! Надо взять её на вооружение! :)
35. tim11.06 18 16.01.14 12:08 Сейчас в теме
Очень не плохо, познавательно, по отдельным моментам заполняются пробелы
36. dock 35 23.01.14 17:36 Сейчас в теме
Хорошая статья, ждем продолжения :)
На дворе уже 3.0
37. 534 06.02.14 13:42 Сейчас в теме
Забираю в избранное. Надо изучить.
38. Bukaska 131 06.02.14 14:07 Сейчас в теме
Тоже буду изучать, как раз занимаюсь на курсах по ЗУПу, автору однозначно +++++
40. 4erv 24.12.14 13:22 Сейчас в теме
Отличная статья. Как раз стоит задача быстро въехать в типовые расчетные механизмы.
41. Seregio22 30.09.16 15:16 Сейчас в теме
Если установлен флаг «КомментироватьРасчет», то ...
Как включить это флаг, если на форме ни флага, ни кнопки таковой нет.. ??! беда.
Например, Начисление отпуска сотруднику, рассчитать НДФЛ.
В коде написано четко: КомментироватьРасчет=Ложь и всё.
А ниже в процедуре куча кода для комментариев расчета.
42. freemaestro 1 14.07.17 09:58 Сейчас в теме
Добрый день! Автору большой плюс! Вот бы такую статью по ЗУП 3 ! Скоро переходим, почитать бы про него. Может, у кого есть ссылочки, ребята, поделитесь ?
43. UserPro 4 28.09.17 05:20 Сейчас в теме
ПЛЮС. Пригодилось для изменения формул расчета в упр. учете.
44. hanio 51 21.06.18 10:59 Сейчас в теме
Вот бы кто такое же по части ЗУП 3.1 написал?
ivangrant; doda666; purik; novyy; Bukaska; user611798_lexd; +6 Ответить
Оставьте свое сообщение

См. также

Электронные трудовые книжки, СЗВ-ТД в ЗУП 3.1 - сборник ответов на вопросы и полезные ссылки

Статья Бухгалтер Нет файла v8 v8::СПР ЗУП3.x Россия БУ Бесплатно (free) Документооборот и делопроизводство Зарплата

С 1 января 2020 г. начался переход на электронные трудовые книжки. До середины февраля 2020 г. все работодатели должны сдать первый отчет по форме СЗВ-ТД. Не смотря на то, что срок сдачи уже достаточно близок, информация по данному направлению постоянно изменяется и уточняется. Я постаралась собрать ключевые моменты, касающиеся перехода на электронный формат ведения трудовых книжек сотрудников в программе ЗУП 3.1, которые возникли при изучении этого нововведения. Данный сборник будет полезен как бухгалтеру/кадровику, так и 1С программисту или консультанту, сопровождающему переход. Весь предложенный материал можно найти самостоятельно, моей целью было собрать разные источники воедино дабы облегчить работу моим коллегам. В связи с тем, что информация может корректироваться и уточняться, необходимо проверять ее актуальность, поэтому в каждом найденном ответе указан источник для проверки. Внимание - данный сборник является справочным, работодатель должен руководствоваться исключительно Законодательством об электронных трудовых книжках. В сборник первоначально вошли только те вопросы, с которыми я столкнулась в своей работе лично, поэтому критика и предложения по дополнению приветствуются!

28.01.2020    27096    Bene_Valete    192       

Базовый курс по обмену данными в системе 1С:Предприятие. Онлайн-интенсив с 12 по 28 мая 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, обеспечивающих обмен данными между различными прикладными 1С-решениями и взаимодействие с другими информационными системами. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”.

5500 рублей

Секреты 1С:ЗУП 3

Статья Бухгалтер Пользователь Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Зарплата Пользователю системы

В этой статье описаны несколько небольших секретов, позволяющих упростить работу с программой: 1. Как не забыть о Дне рождения сотрудника 2. Как в списке сотрудников отличить сотрудника по основному месту работы от совместителя 3. Как автоматически устанавливать организацию в документах

22.01.2020    2037    Neti    7       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

WiseAdvise: Настройка расчета управленческой зарплаты в 1С:ЗУП КОРП 3.1

Статья Бизнес-аналитик Бухгалтер Пользователь Руководитель проекта Нет файла v8 ЗУП3.x Россия УУ Бесплатно (free) Зарплата Управление персоналом (HRM)

В статье описан механизм настройки расчета управленческой заработной платы в 1С ЗУП 3.1 КОРП в сравнении с аналогичным механизмом в ЗУП 2.5.

23.10.2019    3663    tamriko666@gmail.com    4       

Работа с отчетами 1С для "чайников"

Статья Бухгалтер Пользователь Стажер Нет файла v8 БП3.0 Россия Windows Бесплатно (free) Пользователю системы Бухгалтерские

Статья предназначена для начинающих пользователей 1С. Отчеты в 1С представляют собой довольно мощный инструмент, который можно легко настроить под свои потребности. Типовые настройки, это просто шаблон, который можно существенно улучшить.

09.10.2019    5297    LipinA4    8       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Объединение организаций в ЗУП при реорганизации с переносом данных из ЗУП 2.5 в ЗУП 3.1

Статья Программист Нет файла v8 v8::СПР ЗУП2.5 ЗУП3.x БУ Бесплатно (free) Зарплата Управление персоналом (HRM) Перенос данных из 1C8 в 1C8

В этой статье описан опыт объединения 2-х организаций при реорганизации в ЗУП 3.1 с переносом данных одной организации из ЗУП 2.5 (релизы баз более или менее свежие, но не самые последние на момент перехода, примерно двух- и трехмесячной давности). За основу было взято решение из этой статьи https://infostart.ru/public/833658/, в которой описан алгоритм решения задачи, за что автору статьи огромная благодарность! Здесь же даны некоторые комментарии и пояснения к алгоритму переноса и объединения, описаны выявленные мною ошибки. Также приведена небольшая инструкция по использованию обработки ирПодборИОбработкаОбъектовБД — она будет полезна для пользователей — «не программистов», впервые работающих в не управляемых формах.

09.10.2019    3646    Neti    1       

Отчеты ЗУП. Решения всех отчетов из сборника задач для подготовки к Специалист-консультант ЗУП с картинками

Статья Бухгалтер Стажер Нет файла v8 v8::СПР ЗУП3.x Россия БУ Зарплата Управление персоналом (HRM) Бесплатно (free) Решение задач на 1С:Специалист

Когда готовился к сдаче экзамена на Специалист консультант по ЗУП, в процессе решения задач из сборника обнаружил, что те решения отчетов, которые есть в сети и на Инфостарте, недостаточно проиллюстрированы, и для новичка это может быть довольно тяжело и затратно по времени - разобраться, что к чему, с "нуля". Делал как шпаргалку для себя. Экзамен сдал на отлично. Рекомендую тем, кто готовится - прорешать все отчеты.

26.08.2019    7372    user1024932    19       

1C:Предприятие для программистов: Расчетные задачи (зарплата). Онлайн-интенсив с 01 по 17 июня 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, которые предназначены для автоматизации периодических расчетов, а именно - для расчета зарплаты. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей прикладного решения “1С:Зарплата и управление персоналом” и прочих прикладных решений, в которых реализован функционал расчета зарплаты.

4900 рублей

Куда уходит детство: как подготовиться к переходу с «1С:УПП»

Статья no Нет файла v8 УПП1 Бесплатно (free) Пользователю системы

Если решение о переходе с «1С:УПП» принято окончательно и бесповоротно – поздравляем, вы почти на «светлой стороне»! Срок жизни этого продукта подходит к концу: он снят с продаж и снимается с поддержки. Следующий шаг – выбрать новый продукт и разработать план перехода. Разберемся, как это сделать.

28.03.2019    9005    bolefirenko    45       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Принципы проектирования справочников номенклатуры в 1С: Управление Предприятием 2 (ERP 2.4.6)

Статья Программист Пользователь Нет файла v8 ERP2 Россия Бесплатно (free) Управление бизнес-процессами (BPM) Бухгалтерский учет Пользователю системы

Принципы системного подхода к проектированию справочников номенклатуры в 1С: Управление Предприятием 2 (ERP 2.4.6) или как избежать замусоривания.

13.02.2019    15766    roman72    28       

Переход на "Зарплату и управление персоналом 3.1"

Статья Программист Бухгалтер Пользователь Нет файла v8 v8::СПР ЗУП2.5 ЗУП3.x Россия БУ Управление персоналом (HRM) Бесплатно (free) Интеграция Пользователю системы Бухгалтерский учет

Сменила я тут работу и уже после того, как я приступила к исполнению обязанностей, мой новый начальник мне призналась, что выбор пал на меня только из-за того, что я знаю программу. Справедливости ради, эта уверенность была основана только на том, что я прошла тестирование, включающее только основные операции кадрового делопроизводства. Так или иначе, а работодатель попал в точку, нанимая меня в надежде, что я решу проблему: нужно перейти «с 8.2 на 8.3». Ничего сложного, скажет большинство, я тоже так говорю, но ситуация осложнялась некоторым количеством предшественников, которые уже «нафеячили» в программах до меня. Взять и сделать все заново мне не разрешили, так что пришлось исходить из того, что есть, и именно это дало пищу для размышлений и, в конце концов, привело к написанию этих рекомендаций. Если перед Вами стоит задача перехода с ЗУП 2.5 на ЗУП 3.1, я попробую облегчить Вам жизнь этой статьей.

01.02.2019    9414    VKuser24804875    33       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Практика применения подсистемы Автозадачи

Статья Программист Нет файла v8 1cv8.cf Россия УУ Бесплатно (free) Управление бизнес-процессами (BPM) Пользователю системы

На Инфостарте есть публикация о подсистеме Автозадачи (https://infostart.ru/public/656758/). Я решил поделить своим опытом применения этой подсистемы Альфа-авто 5.

29.01.2019    6168    AntonSm    4       

Сдача 2-НДФЛ за 2018 год из конфигурации Зарплата и Управление Персоналом, редакция 2.5 (2.5.130.2)

Статья Бухгалтер Нет файла v8 v8::СПР ЗУП2.5 Россия БУ Windows Зарплата НДФЛ Бесплатно (free) Регламентированная отчетность

В статье я пошагово описал процесс сдачи отчётности из 1С ЗУП редакции 2.5 через программу "Налогоплательщик ЮЛ". Весь процесс я разбил на 5 шагов, подробно и с картинками описал каждый шаг.

05.01.2019    20058    busa_nn    23       

1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.

6500 рублей

Первоначальная настройка 1С:Управление торговлей 11

Статья Пользователь Нет файла v8 v8::ОУ УТ11 УУ Бесплатно (free) Пользователю системы

Эта статья расскажет, как настроить 1С:Управление торговлей 11 и на что обратить внимание

19.12.2018    24448    ogre2007    5       

Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке

Статья Программист Нет файла v8 v8::СПР ЗКГУ3.0 ЗУП3.x БУ Зарплата Управление персоналом (HRM) Бесплатно (free) Универсальные функции

В статье размещен список стандартных процедур и функций с примерами, которые могут помочь при разработке (доработке) конфигураций Зарплата и управление персоналом ред. 3.1 и Зарплата и кадры государственного учреждения 3.1. Иногда бывает довольно сложно правильно получить данные или долго, поэтому лучшим вариантом будет использование стандартных процедур. Буду очень признателен, если Вы поделитесь своим опытом и предложите свои варианты стандартных процедур которые помогают в работе. Или предложите, как дополнить имеющиеся процедуры.

14.11.2018    52520    GeterX    96       

Сдача регламентированной отчетности из программ 1С Промо

Сдача регламентированной отчетности из программ "1С" во все контролирующие органы без выгрузок и загрузок в другие программы. Для групп компаний действуют специальные предложения.

от 1500 руб.

Дивный новый мир: краткий обзор основных отличий BAS ERP от УПП

Статья no Нет файла v8 УПП1 ERP2 Украина Бесплатно (free) Пользователю системы Бухгалтерский учет

Краткий обзор нововведений и основных отличий конфигурации 1С:BAS ERP от предшественника в лице 1С:УПП, а также некоторых общих отличий конфигураций на управляемых формах от обычных.

06.11.2018    6570    JohnGalt    14       

Управление ИТ-проектами. Модуль 2: продвинутый онлайн-курс по классическим методам управления проектами. Вебинары проходят с 12 марта по 11 июня 2020 года. Промо

Продвинутый онлайн-курс по классическому управлению ИТ-проектами позволит слушателям освоить инструменты из PMBoK® и 1С:Технологии корпоративного внедрения и научиться их применять для проектов любого масштаба. Курс включает в себя 12 вебинаров и 12 видеолекции, разбор кейсов и рекомендации экспертов по проектам слушателей. Ведущая курса - Мария Темчина.

от 13000 рублей

Плюсы и минусы перехода на 1С: ERP Управление предприятием 2 для Казахстана

Статья Программист Нет файла v8 ERP2 Казахстан Бесплатно (free) Пользователю системы

В этой статье расскажу о работе с конфигурацией 1С:ERP Управление предприятием 2 для Казахстана, о плюсах и минусах перехода.

19.10.2018    6862    Bajo    7       

Перевыставление услуг (приобретение агентом услуг для принципала). Агентский договор

Статья Бухгалтер Нет файла v8 УПП1 БП3.0 Россия БУ Производство готовой продукции (работ, услуг) НДС Бесплатно (free) Пользователю системы Управленческий учет (прочее) Бухгалтерский учет

Множество компаний сталкивается с вопросом учета арендных отношений, а также коммунальных платежей, таких как электроэнергия, вода, теплоэнергия и прочих, связанных с арендуемыми помещениями. Данный вопрос особенно сложен в части налогообложения по НДС. Цель данной статьи - рассмотреть схему учета перевыставляемых услуг в УПП 1.3 в сравнении с БП 3.0, в которой данный функционал уже реализован.

05.10.2018    20960    el-le    4       

Голосование за доклады на INFOSTART MEETUP Kazan - до 25 февраля. Промо

Выбирайте и голосуйте за самые интересные доклады! Лучшие из лучших попадут в окончательную программу казанского митапа. Оставить свой голос можно до 25 февраля 2020 года.

Обход ошибки: Обнаружен лишний резерв по измерениям в регистре Товары организации и Резервы товаров организации в этапе производства

Статья Бухгалтер Нет файла v8 ERP2 Россия БУ Учет ТМЦ Бесплатно (free) Пользователю системы

В данном примере объясняется, как обойти ошибку проведения и отмены проведения лишних резервов организации по этапу производства 1С: ERP.

08.09.2018    11680    Katerpal    8       

Склонение представлений объектов в ЗУП 3.1 - как это работает?

Статья Программист Бухгалтер Нет файла v8 v8::СПР КА2 ЗУП3.x Россия Windows Бесплатно (free) Пользователю системы

Эта статья о том, как устроен механизм автоматического склонения имен существительных (ФИО сотрудников, наименований подразделений и должностей) в ЗУП 3.1.

18.08.2018    22988    accounting_cons    19       

Онлайн-курс "Подготовка к экзамену 1С:Эксперт и 1С:Профессионал по технологическим вопросам" с 7 по 24 апреля 2020 г. Промо

На курсе вы получите практические навыки решения задач производительности 1С, в том числе характерных для высоконагруженных информационных систем (более 1000 пользователей). Подготовка к экзамену – только одна из составляющих курса. 70% слушателей приходят за знаниями, которые позволят расти и зарабатывать, делать сложные задачи на крупных проектах.

16450 рублей

Настройка схемы "Интеркампани" в связке УТ 11.4 - БП 3.0

Статья Бухгалтер Пользователь Руководитель проекта Нет файла v8 v8::ОУ УТ11 БУ УУ Бесплатно (free) Пользователю системы Бухгалтерский учет

Настройка и использование схемы "Интеркампани" в связке "Управление торговлей 11.4" и "Бухгалтерия предприятия 3.0".

26.07.2018    26178    WhiteOwl    3       

Ошибка №1 внедрения "Бюджетирования" в 1С:ERP2 и 1С:КА2: настройка статей бюджетов и статей ДДС 1-в-1

Статья Бизнес-аналитик Бухгалтер Нет файла v8 ERP2 КА2 Россия УУ Windows Финансовый учет и бюджетирование (FRP) Бесплатно (free) Пользователю системы Бухгалтерский учет

В цикле статей я хочу поделиться ошибками во внедрении подсистемы «Бюджетирование», которые мне приходится исправлять после коллег на реальных проектах, и лучшими приемами по автоматизации бюджетирования на 1С:ERP 2 и 1C:КА 2. Сегодня поговорим и о самой распространенной ошибке – настройке статей бюджетов 1-в-1 к справочнику «Статьи ДДС».

13.06.2018    23460    SergeyN    77       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

Объединение организаций в ЗГУ (ЗУП) 3.1 при реорганизации (слияние, присоединение)

Статья Бухгалтер Нет файла v8 ЗКГУ3.0 ЗУП3.x Россия БУ Зарплата Бесплатно (free) Бухгалтерский учет

Несколько организаций(А, Б, В …) в одной базе, которые объединяются в новую организацию(Н) слиянием. Перевод в новую организацию должен быть без увольнения/приема, с сохранением данных для среднего заработка. 1С в почему-то не предоставила такой возможности. Есть обработка «Перевод к другому работодателю», но этим «документом не предполагается полноценное оформление переводов сотрудников в связи с реорганизацией (слиянием, присоединением, выделением, разделением, преобразованием) предприятия». На просторах интернета натолкнулся на идею что можно осуществлять перевод между организациями, являющимися филиалами и головной организацией. Четкого алгоритма действий тоже не нашел, поэтому пришлось экспериментировать. Чтобы облегчить другим работу, решил опубликовать алгоритм действий к которому я пришел.

21.05.2018    15525    as7bs    14       

История развития 1С:Торговли, что изменилось в архитектуре учета торговых и складских операций за 15 лет

Статья no Нет файла v8 Оптовая торговля, дистрибуция, логистика Россия УУ Оптовая торговля Розничная торговля Учет ТМЦ Ценообразование, анализ цен Бесплатно (free) Пользователю системы

В данном обзоре я хочу рассмотреть историю развития учета торговых и складских операций в 1С с точки зрения архитектуры конфигурации. Еще раз повторюсь, именно конфигурации, структуры данных, а не технологических возможностей платформы. Т.е. речь не про управляемые формы и обычные формы, не про преимущество СУБД перед dbf в расшаренной папке, а про справочники, их реквизиты и код, который этим управляет. Конечно, совсем абстрагироваться от изменений платформы не удастся, но я постараюсь.

23.04.2018    18630    monkbest    57