Главная » 1С Предприятие » МОДУЛЬ  ДОКУМЕНТА

0

Содержит  предопределенную  процедуру ОбработкаПроведения. Она  для  каждого сотрудника табличной  части  заносит в  ЖЗ  расчеты  Оклад_2,  НДФЛ 2  и  ВБанк_2,  а также  вычисляет результат каждого  введенного  расчета.  Поскольку  вводимые расчеты   должны  обновляться  при   перепроведении,   то   метод   их   ввода   ВвестиРасчет, а не ЗаписатьРасчет.  Даты  начала  и  окончания всех расчетов  совпадают  с датами  начала и конца текущего периода ЖЗ. Функция НайтиХозОп возвращает связанную с ВР хозяйственную  операцию.   Эти  связи  хранит  справочник  ХозОпДляВР  (разд.   7.3.7).  Число отработанных часов вводится только  для ВР Оклад_2.

функция НайтиХозОп(хозОп, ВР) далее

процедура ВводРасчВЖЗ(жз, нтп, ктп, хозОп, ВР) далее

процедура ОбработкаПроведения() перем жз, нтп, ктп;

// Объект с разновидностью типа Справочник.ХозОпДляВР перем хозОп;

// Для поиска хозяйственных операций ВР

хозОп  =  СоздатьОбъект("Справочник.ХозОпДляВР"); жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); нтп = жз.НачалоТекущегоПериода();

ктп = жз.КонецТекущегоПериода();

ВыбратьСтроки();                       //              Открываем выборку строк документа пока ПолучитьСтроку( ) = 1 цикл

// Устанавливаем реквизиты для каждого вводимого ВР

// ВР Оклад_2 жз.УстановитьРеквизит("всегоЧасов", всегоЧасов); ВводРасчВЖЗ(жз, нтп, ктп, хозОп, ВидРасчета.Оклад_2);

// ВР НДФЛ_2

ВводРасчВЖЗ(жз, нтп, ктп, хозОп, ВидРасчета.НДФЛ_2);

// ВР ВБанк_2

ВводРасчВЖЗ(жз, нтп, ктп, хозОп, ВидРасчета.ВБанк_2); конецЦикла; // пока

// Вычисляем результаты введенных расчетов

// Выборка записей ЖЗ по документу не дает верного результата

// Поэтому используем выбор записей текущего периода по объекту ВыбратьСтроки();                       //              Открываем выборку строк документа пока ПолучитьСтроку() = 1 цикл

жз.ВыбратьПериодПоОбъекту(Сотрудник,  нтп);

пока жз.ПолучитьЗапись() = 1 цикл

если жз.Документ = ТекущийДокумент() тогда

// Метод Рассчитать вызывает процедуру ПровестиРасчет соответствующего ВР жз.Рассчитать( );              //         или жз.ВыполнитьРасчет

конецЕсли; конецЦикла; // пока

конецЦикла; // пока

если Проведен() = 0 тогда                   //            Если документ  проводится впервые

// Ограничиваем время показа окна с предупреждением тремя секундами Предупреждение("Документ  проведен.", 3);

иначе

Предупреждение("Документ  перепроведен.", 3); конецЕсли;

конецПроцедуры // ОбработкаПроведения

// Вводит новые или редактирует  имеющиеся в ЖЗ  расчеты с заданным ВР процедура ВводРасчВЖЗ(жз, нтп, ктп, хозОп, ВР)

жз.УстановитьРеквизит("строкаДок", НомерСтроки);

жз.УстановитьРеквизит("хозОп", НайтиХозОп(хозОп, ВР));  жз.ВвестиРасчет(Сотрудник, ВР, нтп, ктп);

конецПроцедуры // ВводРасчВЖЗ

// Возвращает хозяйственную операцию ВР функция НайтиХозОп(хозОп,  ВР)

// Ищем простым перебором в справочнике ХозОпДляВР  вид расчета ВР

хозОп.ВыбратьЭлементы(); флаг = 0;

пока хозОп.ПолучитьЭлемент() = 1 цикл если хозОп.ВР  = ВР тогда

флаг = 1;

прервать; конецЕсли;

конецЦикла; // пока

если флаг = 1 тогда

возврат  хозОп.хозОп; иначе

возврат  ПолучитьПустоеЗначение(хозОп); конецЕсли;

конецФункции // НайтиХозОп

Фрагмент ЖЗ  после  проведения табеля, например для сотрудников 2-го цеха, показан на рис. 7.47.

Рис.  7.47. Документ Табель  проведен для сотрудников  2-го цеха

Замечания:

1.              Расчеты одного объекта располагаются в ЖЗ в порядке очередности их исполнения.

2.              Чтобы  быстро  найти в ЖЗ сотрудника, следует переместиться  на поле Сотрудник и начать набирать на клавиатуре его фамилию (рис. 7.48).

Рис. 7.50. Диалог формы списка журнала документов Табель

Модуль   формы  списка  журнала  документов  Табель   содержит  предопределенную процедуру ПриОткрытии. Назначение процедуры такое  же, как и у одноименной процедуры  модуля  формы списка журнала  кадровых приказов (раз.  5.8.3.2).

// Список действий по документу. Передается процедуре глобального модуля

// глДействия(ТекущийДокумент, сДейст)

перем сДейст;

// Формирует список действий и устанавливает интервал журнала,

// отображающий все введенные документы вида Табель  процедура ПриОткрытии()

перем  дНач;                              //                 Дата начала  интервала журнала  Табель

перем флаг, док; ОчиститьОкноСообщений();

// Определяем список действий для кнопки "Действия" сДейст.ДобавитьЗначение("Структура подчиненности"); сДейст.ДобавитьЗначение("Ввести на основании"); сДейст.ДобавитьЗначение("Движения документа");

флаг = 1;                               //                   Равен единице, если удалось  создать док

попытка

док  =  СоздатьОбъект("Документ.Табель"); исключение

флаг = 0; конецПопытки;

если флаг = 1 тогда                       //             Если документ Табель  создан

// Находим документ с наименьшей датой. По умолчанию документы

// располагаются в выборке по возрастанию их дат док.ВыбратьДокументы();

если док.ПолучитьДокумент() = 1 тогда дНач = док.ДатаДок;

иначе

дНач = ТекущаяДата(); конецЕсли;

иначе                                    //                     Искомого документа нет дНач = ТекущаяДата();

конецЕсли;

УстановитьИнтервал(дНач, ТекущаяДата()); конецПроцедуры // ПриОткрытии

// В основной программе модуля всего один оператор сДейст  =  СоздатьОбъект("СписокЗначений");

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии