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

0

Содержит,  кроме   названных   в  табл.   7.14,  процедуры  ПриОткрытии,  ПриЗаписи и ПремияДа.

перем  кЗПоУмолчанию;       //            Значение задается  в процедуре ПриОткрытии

процедура Проследить() далее процедура Столбцы() далее процедура ПремияК10() далее процедура ПремияДа(пЗнач) далее процедура Заполнить() далее

процедура ОбработкаПодбора(значен, конт)  далее процедура  УдалитьЗап(флаг) далее

процедура КнопкиВидимость(флаг) далее

// Формирует список подразделений сПодр и устанавливает начальные значения

// переменных диалога. Причем, если документ проведен, то начальные

// значения берутся из ЖЗ процедура ПриОткрытии()

перем жз, сСотр_2, дост;

// Значение коэффициента к3 по умолчанию; можно оформить как константу 1С кЗПоУмолчанию = 10;

сСотр_2  = СоздатьОбъект("Справочник.Сотрудники_2");

// Формируем, анализируя справочник Сотрудники_2, список подразделений сСотр_2.ПорядокКодов();

сСотр_2.ВыбратьЭлементы();

пока сСотр_2.ПолучитьЭлемент() = 1 цикл

если сСотр_2.ЭтоГруппа() = 1 тогда сПодр.ДобавитьЗначение(сСотр_2.ТекущийЭлемент(), сСотр_2.Наименование);

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

если Проведен() = 0 тогда

жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2");

// Начальные значения для периодов действия вводимых расчетов датаНачКоэф = жз.НачалоТекущегоПериода();

датаКонКоэф = датаНачКоэф +10; датаНачСум = датаКонКоэф + 1; датаКонСум = датаНачСум + 10; датаНач1234 = датаКонСум + 1;

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

кто = 2;                     //             Премия сотрудникам  выбранного подразделения коэф  = 1;                   //           Можно начислить премию коэффициентом

сум = 0; п1234 = 0;

текСтрока = 1;              //         Позиционируемся на цехе 01 в списке сПодр

иначе                            //                 Документ проведен

если кто = 2 тогда            //       Правильно позиционируем список значений сПодр

сПодр.ТекущаяСтрока(текСтрока); конецЕсли;

конецЕсли;

// Регулируем доступность и  видимость элементов диалога Проследить( );

Столбцы( );

// дост — 1, если в табличной  части есть записи дост = ?(КоличествоСтрок() = 0, 0,  1); форма.Удалить.Доступность(дост); форма.Очистить.Доступность(дост);

форма.ПанельИнструментов(0);  //            Отключаем панель инструментов

форма.Заголовок("Премии");

// Следующий  метод  обеспечивает доступ  к  атрибуту  Закладками Форма.ИспользоватьЗакладки(1); Форма.Закладки.ДобавитьЗначение(1, "Ввод премий"); Форма.Закладки.ДобавитьЗначение(2,  "Интервалы  расчетов");

// Теперь можно задать отображаемые на закладке слои Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки");

конецПроцедуры // ПриОткрытии

// Распределяет слои диалога формы по закладкам процедура  ПриВыбореЗакладки(номЗакл, значЗакл)

// номЗакл, значЗакл соответственно  номер  и значение закладки

// В нашем случае значения этих параметров совпадают если номЗакл =  1 тогда

Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки "); КнопкиВидимость(1);                 //            Показываем все кнопки

иначе

Форма.ИспользоватьСлой("ИнтервалыРасчетов,  Кнопки "); КнопкиВидимость(0);                 //            Скрываем три верхние  кнопки

конецЕсли

конецПроцедуры // ПриВыбореЗакладки

// Управляет видимостью кнопок  Заполнить, Удалить и Очистить  (см. рис. 7.61) процедура  КнопкиВидимость(флаг)

// заполнить, удалить и  очистить  идентификаторы  одноименных  кнопок Форма.Заполнить.Видимость(флаг);

Форма.Удалить.Видимость(флаг); Форма.Очистить.Видимость(флаг);

конецПроцедуры // КнопкиВидимость

// Управляет доступностью  элемента диалога сПодр

процедура  Проследить()

если кто =  1 тогда                                 //                      Премия отобранным сотрудникам форма.СПодр.Доступность(0);

иначе                                            //                                             кто = 2 форма.СПодр.Доступность(1);

конецЕсли; КонецПроцедуры // Проследить

//Управляет видимостью столбцов  Коэф., Сумма  и  Премия 1234 табличной  части  документа

// и доступностью элементов задания дат на слое ИнтервалыРасчетов

процедура  Столбцы()

форма.к3.Видимость(коэф);                       //               Премия коэффициентом форма.ДатаНачКоэф.Доступность(коэф); форма.ДатаКонКоэф.Доступность(коэф);

форма.Сумма.Видимость(сум);                     //              Премия суммой форма. ДатаНачСум.Доступность(сум); форма.ДатаКонСум.Доступность(сум); форма.Премия1234.Видимость(п1234);              //         Премия  1234 фор’ма.ДатаНач1234.Доступность(п1234); форма.ДатаКон1234.Доступность(п1234);

если коэф = 1 тогда                                 //                    Премия  коэффициентом

// Заносим  в пустые  столбцы ПремияКоэф равный кЗПоУмолчанию коэффициент  ПремияК10();

конецЕсли;

если п1234 =  1 тогда                               //                    Премия 1234

// Заносим в пустые столбцы Премия 1234 значения Да перечисления ДаНет ПремияДа(Перечисление. ДаНет.ЗначениеПоНомеру(1));

конецЕсли; конецПроцедуры // Столбцы

процедура ОтобразитьСПодр()                         //                 Формула элемента диалога сПодр

текСтрока = сПодр.ТекущаяСтрока(); сПодр.ПолучитьЗначение(текСтрока);

конецПроцедуры // ОтобразитьСПодр

// Заносит в пустые  ячейки столбца задания коэффициента к3

// равный  кЗПоУмолчанию  коэффициент  процедура  ПремияК10()

если ВыбратьСтроки() =  1 тогда

пока ПолучитьСтроку() = 1 цикл

к3 = ?(к3 = 0, кЗПоУмолчанию, к3); конецЦикла; // пока

конецЕсли; конецПроцедуры // ПремияК10

// Заносит в пустые  столбцы Премия 1234 значения  Да перечисления ДаНет процедура ПремияДа(пЗнач)

если ВыбратьСтроки() = 1 тогда

пока ПолучитьСтроку() = 1 цикл

если ПустоеЗначение(Премия1234) =  1 тогда Премия 1234 =пЗнач;

конецЕсли;

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

конецПроцедуры // ПремияДа

// Заполняет  табличную часть документа Премия для одного (кто =  1)

// или группы сотрудников процедура  Заполнить()

перем  подр;

// Удаляем, если табличная  часть  заполняется для подразделения

// или всего предприятия, ее строки, но только с согласия пользователя если (кто > 1) и (КоличествоСтрок( ) > 0) тогда

если Вопрос("Удалить имеющиеся строки?", "Да+Нет")  = "Да" тогда УдалитьСтроки();                   //            Очищаем  табличную  часть документа

иначе

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

конецЕсли;

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

// Указываем явно имя основной формы списка для метода ОткрытьПодбор

// Задаем режим множественного выбора

// Добавляем  в табличную  часть  в результате каждого выбора в открытой форме

// данные одного сотрудника. Собственно добавление осуществляет

// предопределенная процедура модуля формы ОбработкаПодбора ОткрытьПодбор("Справочник.Сотрудники_2", "ФормаСписка",, 1);

иначеЕсли кто  = 2 тогда                       //              Работаем с подразделением сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");

// Заносим в табличную часть данные о сотрудниках выбранного подразделения подр

подр = сПодр.ПолучитьЗначение(сПодр.ТекущаяСтрока()); сСотр_2.ИспользоватьРодителя(подр); сСотр_2.ВыбратьЭлементы();

пока  сСотр_2.ПолучитьЭлемент() = 1 цикл

если сСотр_2.ЭтоГруппа() = 0 тогда // Только  сотрудники

// Используем  уже имеющуюся процедуру ОбработкаПодбора,

// выполняющую обработку одного сотрудника ОбработкаПодбора(сСотр_2,"");

конецЕсли;

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

если КоличествоСтрок() > 0 тогда форма.Удалить.Доступность(1); форма.Очистить.Доступность(1);

конецЕсли; конецПроцедуры // Заполнить

процедура ОбработкаПодбора(значен,  конт)

// Запрещаем, если добавляем  по одному  сотруднику, выбор того же лица дважды если (кто = 1) и (ВыбратьСтроки() = 1) тогда

пока  ПолучитьСтроку() = 1 цикл

если Сотрудник = значен.ТекущийЭлемент() тогда Предупреждение("Сотрудник уже  выбран."); возврат;

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

конецЕсли;

НоваяСтрока();                             //                   Новая строка в табличной части документа Сотрудник = значен.ТекущийЭлемент();

// Премия коэффициентом или 1234 если (коэф = 1) или (п1234 = 1) тогда

к3  = кЗПоУмолчанию;            //           Коэффициент  по умолчанию конецЕсли;

если  п1234 = 1 тогда                          //               Премия 1234 или все премии

// Заносим в столбец Премия 1234 значение Да перечисления ДаНет Премия 1234 = Перечисление.ДаНет.ЗначениеПоНомеру(1);

конецЕсли;

// Если есть хотя  бы одна  запись, то есть что удалять  если (кто  = 1) и (КоличествоСтрок() =  1) тогда

форма.Удалить.Доступность(1); форма.Очистить.Доступность(1);

конецЕсли;

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

// Удаляет  с согласия  пользователя, если флаг =  1, текущую запись табличной

// части документа, и, если флаг = 2, все записи процедура  УдалитьЗап(флаг)

перем вопр;

вопр = "Удалить " + ?(флаг =  1, "одну запись", "все записи") + "?"; если Вопрос(вопр, "Да+Нет") = "Да" тогда

если флаг =  1 тогда УдалитьСтроку();

иначе                                 //                      флаг = 2

УдалитьСтроки(); конецЕсли;

если КоличествоСтрок() = 0 тогда

форма.Удалить.Доступность(0); форма.Очистить.Доступность(0);

конецЕсли; конецЕсли;

конецПроцедуры // УдалитьЗап

// Выполняет проверку дат процедура ПриЗаписи()

перем  ош; ош = 0;

если (коэф = 1) и (датаНачКоэф > датаКонКоэф) тогда ош = 1;

конецЕсли;

если (сум = 1) и (датаНачСум > датаКонСум) тогда ош = 1;

конецЕсли;

если  (п1234  = 1) и (датаНач1234 > датаКон1234) тогда ош =  1;

конецЕсли;

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

Предупреждение("Неверный период действия расчета."); СтатусВозврата(0);                      //              Запрещаем запись документа

конецЕсли; конецПроцедуры // ПриЗаписи

7.9.2.   МОДУЛЬ ДОКУМЕНТА

Содержит  предопределенную  процедуру  ОбработкаПроведения. Она  для  каждого  сотрудника  табличной  части  заносит в  ЖЗ  либо выбранный расчет, либо  все расчеты. Причем расчеты  заносятся с вычисленными результатами.

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

функция ПроверитьНаНуль() далее функция НайтиЧасы(жз, нтп) далее функция НайтиХозОп(хозОп, ВР) далее

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

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

перем ВР[3], рассч[3], всегоЧасов[3], рез[3], датаНач[3], датаКон[3]; перем а, б, ин;

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

датаНач[1] = датаНачКоэф;            датаКон[1]  = датаКонКоэф; датаНач[2] = датаНачСум;                датаКон[2] = датаКонСум; датаНач[3] = датаНач1234;               датаКон[3] =датаКон1234; если ПроверитьНаНуль() = 1 тогда

Предупреждение("Есть расчеты  с нулевой премией.");  возврат;

конецЕсли;

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

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

// ВР массив видов премий

ВР[1] = ВидРасчета.ПремияКоэф_2; ВР[2] = ВидРасчета.ПремияСум_2; ВР[3]  = ВидРасчета.Премия1234_2;

для ин = 1 по 3 цикл                     //             Инициализация вспомогательных массивов

// Массив рассч используется для задания значения атрибута ЖЗ Рассчитана рассч[ин] = 0;

всегоЧасов[ин] = 0; рез[ин] = 0;

конецЦикла; // для

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

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

а = 1; б = 2;                   //           Параметры цикла Для, вводящего расчеты в ЖЗ если коэф  = 1 тогда            //       Премия коэффициентом

// Найдем по ЖЗ число часов, отработанных сотрудником  всегоЧасов[1] = НайтиЧасы(жз, нтп);

рез[1] = всегоЧасов[ 1 ] * к3; // Начисленная премия рассч[1]  = 1;                //                Запись рассчитана

конецЕсли;

если сум =  1 тогда

//

Премия суммой

рез[2] = Сумма;

//

Начисленная премия

рассч[2] =  1;

//

Запись рассчитана

конецЕсли;

// Для  ввода премии  1234 (и 1234 = 1) все готово

если  п1234 = 1 тогда

//

Премия  1234

а =1 ; б = 3;

//

Параметры цикла Для, вводящего расчеты в ЖЗ

конецЕсли;

// Ввод расчетов

для ин = а по б цикл

если (ин < 3) и (рассч[ин] = 0) тогда продолжить;

конецЕсли;

жз.УстановитьРеквизит("Рассчитана",  рассч[ин]); жз.УстановитьРеквизит("всегоЧасов",  всегоЧасов[ин]); ВводРасчВЖЗ(жз, хозОп, ВР[ин], датаНач[ин], датаКон[ин], рез[ин]);

конецЦикла // для

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

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

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

// Поэтому используем  выбор записей  текущего периода по объекту

// В данном  документе  нижеследующий расчет результата нужен только

//для ВР Премия 1234. Остальные  премии уже подсчитаны если п1234 =  1 тогда

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

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

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

если  (жз.Документ = ТекущийДокумент()) и (жз.ВидРасч = ВР[3]) тогда жз.Рассчитать();             //        или жз.ВыполнитьРасчет

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

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

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

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

иначе

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

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

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

// Если таковые есть, то записи не проводятся функция ПроверитьНаНуль()

ВыбратьСтроки( );                           //                 Открываем выборку строк документа

пока ПолучитьСтроку() =  1 цикл

// Отрицательных значений к3 и Сумма быть не может так заданы свойства

// этих элементов диалога. Кроме того, для элемента Сумма задано

// свойство Разделять триады

// Премия коэффициентом

если (коэф = 1) и (к3 = 0) тогда возврат 1;

конецЕсли;

// Премия суммой

если (сум = 1) и (Сумма = 0) тогда возврат 1;

конецЕсли;

//Премия  1234

если (п1234 = 1) и (Премия 1234 = Перечисление.ДаНет.ЗначениеПоНомеру(2)) тогда возврат 1;

конецЕсли; конецЦикла; // пока возврат 0;

конецФункции // ПоверитьНаНуль

// Ищет для премии коэффициентом по ЖЗ число часов, отработанных сотрудником

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

жз.ВыбратьПериодПоОбъекту(Сотрудник,  нтп); пока жз.ПолучитьЗапись() = 1 цикл

если жз.ВидРасч = ВидРасчета.Оклад_2 тогда возврат жз.ВсегоЧасов;

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

возврат 0;  // Расчет  с ВР,Оклад_2 для сотрудника не введен конецФункции // НайтиЧасы

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

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

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

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

// Ищем простым перебором в справочнике ХозОпДляВР вид расчета ВР хозОп.ВыбратьЭлементы();

флаг = 0;

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

флаг = 1; прервать;

конецЕсли; конецЦикла; // пока если флаг = 1 тогда

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

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

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

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

По теме:

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