#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ПолучитьФункциональнуюОпцию("ВыполнятьРасчетЗарплатыПоПодразделениям") Тогда
ВРазрезеПодразделений =
ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
КлючОбъектаХранилища(),
"ВРазрезеПодразделений",
Истина);
Иначе
ВРазрезеПодразделений = Ложь;
КонецЕсли;
Если ВедомостьНаВыплатуЗарплатыРасширенный.СтатьяФинансированияИспользуется() Тогда
ВРазрезеИсточников =
ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
КлючОбъектаХранилища(),
"ВРазрезеИсточников",
Истина);
Если ВедомостьНаВыплатуЗарплатыРасширенный.СтатьяФинансированияОбязательна() Тогда
ВРазрезеИсточников = Истина;
Элементы.ВРазрезеИсточников.ТолькоПросмотр = Истина;
КонецЕсли;
Иначе
ВРазрезеИсточников = Ложь;
КонецЕсли;
Если ПолучитьФункциональнуюОпцию("РаботаВХозрасчетнойОрганизации") Тогда
ВРазрезеСпособовРасчетов =
ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
КлючОбъектаХранилища(),
"ВРазрезеСпособовРасчетов",
Истина);
Если ВедомостьНаВыплатуЗарплатыРасширенный.СтатьяРасходовОбязательна() Тогда
ВРазрезеСпособовРасчетов = Истина;
Элементы.ВРазрезеСпособовРасчетов.ТолькоПросмотр = Истина;
КонецЕсли;
Элементы.ВРазрезеСпособовРасчетов.Видимость = Истина;
Иначе
ВРазрезеСпособовРасчетов = Ложь;
Элементы.ВРазрезеСпособовРасчетов.Видимость = Ложь;
КонецЕсли;
Если Параметры.Свойство("РасчетныйДокумент", РасчетныйДокумент) Тогда
ДопустимыеТипы = Метаданные.ОпределяемыеТипы.ДокументОснованиеВедомостиНаВыплатуЗарплаты.Тип;
Если Не ДопустимыеТипы.СодержитТип(ТипЗнч(Параметры.РасчетныйДокумент)) Тогда
ТекстСообщения = СтрШаблон(НСтр("ru = 'Выплата документов ""%1"" не поддерживается'"), ТипЗнч(Параметры.РасчетныйДокумент));
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Отказ = Истина;
Возврат;
КонецЕсли;
Элементы.РасчетныйДокумент.ТолькоПросмотр = Истина;
Элементы.РасчетныйДокумент.КнопкаОткрытия = Ложь;
Элементы.РасчетныйДокумент.КнопкаВыбора = Ложь;
Если НастроитьПоРасчетномуДокументу() Тогда
СоздатьВедомостиНаСервере();
Иначе
Отказ = Истина;
Возврат;
КонецЕсли;
Иначе
Элементы.РасчетныйДокумент.ТолькоПросмотр = Ложь;
Элементы.РасчетныйДокумент.КнопкаОткрытия = Истина;
Элементы.РасчетныйДокумент.КнопкаВыбора = Истина;
ДатаВыплаты = ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
УстановитьВидимостьКолонокТаблицыВедомости()
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура РасчетныйДокументПриИзменении(Элемент)
Если ЗначениеЗаполнено(РасчетныйДокумент) Тогда
РасчетныйДокументПриИзмененииНаСервере()
КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура СпособВыплатыПриИзменении(Элемент)
СоздатьВедомости()
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
СоздатьВедомости();
КонецПроцедуры
&НаКлиенте
Процедура ВРазрезеПодразделенийПриИзменении(Элемент)
СоздатьВедомости()
КонецПроцедуры
&НаКлиенте
Процедура ВРазрезеИсточниковПриИзменении(Элемент)
СоздатьВедомости()
КонецПроцедуры
&НаКлиенте
Процедура ВРазрезеСпособовРасчетовПриИзменении(Элемент)
СоздатьВедомости()
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормы
&НаКлиенте
Процедура ВедомостиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ОткрытьТекущуюВедомость();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ОбновитьВедомости(Команда)
СоздатьВедомости(Истина)
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьВедомость(Команда)
ОткрытьТекущуюВедомость();
КонецПроцедуры
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОчиститьСообщения();
Если ПровестиИЗакрытьНаСервере() Тогда
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Отмена(Команда)
Закрыть();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция КлючОбъектаХранилища()
Возврат "СозданиеВедомостейНаВыплатуЗарплаты"
КонецФункции
&НаКлиенте
Процедура УстановитьВидимостьКолонокТаблицыВедомости()
Элементы.ВедомостиПодразделение.Видимость = ВРазрезеПодразделений;
Элементы.ВедомостиФинансирование.Видимость = ВРазрезеИсточников Или ВРазрезеСпособовРасчетов;
МестаВыплаты = Новый Соответствие;
Для Каждого Строка Из Ведомости Цикл
МестаВыплаты.Вставить(Строка.МестоВыплаты);
КонецЦикла;
Элементы.ВедомостиМестоВыплаты.Видимость = МестаВыплаты.Количество() > 1;
КонецПроцедуры
&НаСервере
Функция НастроитьПоРасчетномуДокументу()
Если НЕ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РасчетныйДокумент, "Проведен") Тогда
ТекстСообщения = НСтр("ru = 'Выплата возможна только по проведенному документу'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Возврат Ложь
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("РасчетныйДокумент", РасчетныйДокумент);
Запрос.Текст =
"ВЫБРАТЬ
| ЗарплатаКВыплатеОстатки.СуммаКВыплатеОстаток,
| ЗарплатаКВыплатеОстатки.Организация КАК Организация
|ИЗ
| РегистрНакопления.ЗарплатаКВыплате.Остатки(, ДокументОснование = &РасчетныйДокумент) КАК ЗарплатаКВыплатеОстатки
|ГДЕ
| ЗарплатаКВыплатеОстатки.СуммаКВыплатеОстаток > 0";
Если Запрос.Выполнить().Пустой()Тогда
ТекстСообщения = НСтр("ru = 'По документу не осталось сумм к выплате'");
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Возврат Ложь
КонецЕсли;
ВидДокументаОснования = Перечисления.ВидыДокументовОснованийВедомостейНаВыплатуЗарплаты.ПоДокументу(РасчетныйДокумент);
ПорядокВыплаты =
РегистрыСведений.ПорядокВыплатыДокументов.Получить(
Новый Структура("ДокументОснование", РасчетныйДокумент)).ПорядокВыплаты;
ОтборСпособовВыплаты = Новый Структура;
ОтборСпособовВыплаты.Вставить("ВидДокументаОснования", ВидДокументаОснования);
ОтборСпособовВыплаты.Вставить("ХарактерВыплаты", ПорядокВыплаты);
ПараметрыВыбора = Новый Структура("Отбор, СтрокаПоиска", ОтборСпособовВыплаты, Неопределено);
СпособыВыплатыЗарплаты = Справочники.СпособыВыплатыЗарплаты.ПолучитьДанныеВыбора(ПараметрыВыбора);
Если СпособыВыплатыЗарплаты.Количество() = 0 Тогда
ТекстСообщения = СтрШаблон(НСтр("ru = 'Выплата %1 не поддерживается'"), НРег(ПорядокВыплаты));
ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
Возврат Ложь
КонецЕсли;
Элементы.СпособВыплаты.СписокВыбора.Очистить();
Для Каждого СпособВыплатыЗарплаты Из СпособыВыплатыЗарплаты Цикл
Элементы.СпособВыплаты.СписокВыбора.Добавить(СпособВыплатыЗарплаты.Значение);
КонецЦикла;
СпособВыплаты = СпособыВыплатыЗарплаты[0].Значение;
Элементы.СпособВыплаты.ТолькоПросмотр = Элементы.СпособВыплаты.СписокВыбора.Количество() = 1;
ДатаВыплаты = '00010101';
Если РасчетныйДокумент.Метаданные().Реквизиты.Найти("ПланируемаяДатаВыплаты") <> Неопределено Тогда
ДатаВыплаты = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РасчетныйДокумент, "ПланируемаяДатаВыплаты");
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаВыплаты) Тогда
ДатаВыплаты = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(РасчетныйДокумент, "Дата");
КонецЕсли;
Возврат Истина
КонецФункции
&НаСервере
Процедура РасчетныйДокументПриИзмененииНаСервере()
Если НастроитьПоРасчетномуДокументу() Тогда
СоздатьВедомостиНаСервере();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьВедомости(СообщитьПользователю = Ложь)
ОчиститьСообщения();
СоздатьВедомостиНаСервере(СообщитьПользователю);
УстановитьВидимостьКолонокТаблицыВедомости()
КонецПроцедуры
&НаСервере
Процедура СоздатьВедомостиНаСервере(СообщитьПользователю = Ложь)
ПравилаПроверки = Новый СписокЗначений;
ПравилаПроверки.Добавить("РасчетныйДокумент", НСтр("ru='Не выбран документ'"));
ПравилаПроверки.Добавить("СпособВыплаты", НСтр("ru='Не указан способ выплаты'"));
ПравилаПроверки.Добавить("ДатаВыплаты", НСтр("ru='Не задана дата выплаты'"));
МожноСоздатьВедомости = ЗарплатаКадры.СвойстваФормыЗаполнены(ЭтотОбъект, ПравилаПроверки, СообщитьПользователю);
Если МожноСоздатьВедомости Тогда
ПараметрыСозданияВедомостей = Обработки.СозданиеВедомостейНаВыплатуЗарплаты.ПараметрыСозданияВедомостейПоРасчетномуДокументу();
ПараметрыСозданияВедомостей.СпособВыплаты = СпособВыплаты;
ПараметрыСозданияВедомостей.ДатаВыплаты = ДатаВыплаты;
ПараметрыСозданияВедомостей.ВРазрезеПодразделений = ВРазрезеПодразделений;
Если ПолучитьФункциональнуюОпцию("РаботаВХозрасчетнойОрганизации") Тогда
ПараметрыСозданияВедомостей.ВРазрезеСтатейФинансирования = ВРазрезеИсточников;
ПараметрыСозданияВедомостей.ВРазрезеСтатейРасходов = ВРазрезеСпособовРасчетов;
ИначеЕсли ПолучитьФункциональнуюОпцию("РаботаВБюджетномУчреждении") Тогда
ПараметрыСозданияВедомостей.ВРазрезеСтатейФинансирования = ВРазрезеИсточников;
ПараметрыСозданияВедомостей.ВРазрезеСтатейРасходов = ВРазрезеИсточников;
КонецЕсли;
ВедомостиПоРасчетномуДокументу =
Обработки.СозданиеВедомостейНаВыплатуЗарплаты.СоздатьВедомостиПоРасчетномуДокументу(
РасчетныйДокумент,
ПараметрыСозданияВедомостей);
ЗаполнитьСписокВедомостей(
ВедомостиПоРасчетномуДокументу,
ПараметрыСозданияВедомостей.ВРазрезеСтатейФинансирования,
ПараметрыСозданияВедомостей.ВРазрезеСтатейРасходов);
КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСписокВедомостей(
ВедомостиПоРасчетномуДокументу,
Знач ПоказыватьСтатьиФинансирования,
Знач ПоказыватьСтатьиРасходов)
Ведомости.Очистить();
ДокументыСУстаревшимиКодами = Новый Массив;
Для Каждого Ведомость Из ВедомостиПоРасчетномуДокументу Цикл
Строка = Ведомости.Добавить();
Строка.Адрес =
ПоместитьВоВременноеХранилище(
ОбщегоНазначения.ЗначениеВСтрокуXML(Ведомость),
УникальныйИдентификатор);
Строка.Ссылка = Ведомость.ПолучитьСсылкуНового();
Строка.Тип = Ведомость.Метаданные().Синоним;
Строка.МестоВыплаты = Ведомость.МестоВыплаты().Значение;
Строка.Подразделение = Ведомость.Подразделение;
Если ПоказыватьСтатьиФинансирования И ПоказыватьСтатьиРасходов Тогда
Строка.Финансирование =
СтрШаблон(
НСтр("ru = '%1(%2)'"),
ВедомостьНаВыплатуЗарплатыФормыПовтИсп.ПредставленияСтатейФинансирования()[Ведомость.СтатьяФинансирования],
ВедомостьНаВыплатуЗарплатыФормыПовтИсп.ПредставленияСтатейРасходов()[Ведомость.СтатьяРасходов]);
ИначеЕсли ПоказыватьСтатьиФинансирования Тогда
Строка.Финансирование =
ВедомостьНаВыплатуЗарплатыФормыПовтИсп.ПредставленияСтатейФинансирования()[Ведомость.СтатьяФинансирования];
ИначеЕсли ПоказыватьСтатьиРасходов Тогда
Строка.Финансирование =
ВедомостьНаВыплатуЗарплатыФормыПовтИсп.ПредставленияСтатейРасходов()[Ведомость.СтатьяРасходов];
Иначе
Строка.Финансирование = "";
КонецЕсли;
Строка.Сумма = Ведомость.Зарплата.Итог("КВыплате");
Сотрудники = Ведомость.Зарплата.Выгрузить(, "Сотрудник");
Сотрудники.Свернуть("Сотрудник");
Сотрудники = Сотрудники.ВыгрузитьКолонку("Сотрудник");
Если Сотрудники.Количество() <= 3 Тогда
Строка.Сотрудники = СтрСоединить(Сотрудники, Символы.ПС);
Иначе
Строка.Сотрудники = ЗарплатаКадры.КраткийСоставСотрудников(Сотрудники, Ведомость.Дата);
КонецЕсли;
ВидМестаВыплаты = ВедомостьНаВыплатуЗарплаты.ВидМестаВыплатыПоДокументу(Ведомость);
Если (ВидМестаВыплаты = Перечисления.ВидыМестВыплатыЗарплаты.БанковскийСчет
Или ВидМестаВыплаты = Перечисления.ВидыМестВыплатыЗарплаты.ЗарплатныйПроект)
И ВидыДоходовИсполнительногоПроизводстваСервер.ВидДоходаИсполнительногоПроизводстваУстарел(Ведомость) Тогда
ДокументыСУстаревшимиКодами.Добавить(Ведомости.Индекс(Строка)+1);
КонецЕсли;
КонецЦикла;
КоличествоВедомостейСУстаревшимиКодами = ДокументыСУстаревшимиКодами.Количество();
Если КоличествоВедомостейСУстаревшимиКодами > 0 Тогда
НомераСтрокВедомостей = СтрСоединить(ДокументыСУстаревшимиКодами, ", ");
ОбщегоНазначения.СообщитьПользователю(
СтрШаблон(ВидыДоходовИсполнительногоПроизводстваКлиентСервер.ТекстПредупрежденияОбУстаревшемКодеДоходаИсполнительногоПроизводства(),
?(КоличествоВедомостейСУстаревшимиКодами = 1, НСтр("ru= 'ведомости №'"), НСтр("ru= 'ведомостях №№'")),
НомераСтрокВедомостей));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьТекущуюВедомость()
ТекущиеДанные = Элементы.Ведомости.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ПараметрыФормы = Новый Структура("АдресВоВременномХранилище", ТекущиеДанные.Адрес);
ОткрытьФорму("Обработка.СозданиеВедомостейНаВыплатуЗарплаты.Форма.Ведомость", ПараметрыФормы, ЭтаФорма);
КонецЕсли
КонецПроцедуры
&НаСервере
Функция ПровестиИЗакрытьНаСервере()
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
КлючОбъектаХранилища(),
"ВРазрезеПодразделений",
ВРазрезеПодразделений);
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
КлючОбъектаХранилища(),
"ВРазрезеИсточников",
ВРазрезеИсточников);
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
КлючОбъектаХранилища(),
"ВРазрезеСпособовРасчетов",
ВРазрезеСпособовРасчетов);
Если СохранитьВедомости(РежимЗаписиДокумента.Проведение) Тогда
Возврат Истина;
Иначе
ОбработатьСообщенияПользователю();
Возврат Ложь;
КонецЕсли;
КонецФункции
&НаСервере
Функция СохранитьВедомости(РежимЗаписи)
ВедомостиПоРасчетномуДокументу = Новый Массив;
Для Каждого Строка Из Ведомости Цикл
СтрокаXML = ПолучитьИзВременногоХранилища(Строка.Адрес);
Ведомость = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
ВедомостиПоРасчетномуДокументу.Добавить(Ведомость);
КонецЦикла;
Если Обработки.СозданиеВедомостейНаВыплатуЗарплаты.ПроверитьВедомости(ВедомостиПоРасчетномуДокументу) Тогда
Попытка
Обработки.СозданиеВедомостейНаВыплатуЗарплаты.СохранитьВедомости(ВедомостиПоРасчетномуДокументу, РежимЗаписи);
Возврат Истина
Исключение
ОбщегоНазначения.СообщитьПользователю(
СтрШаблон(
НСтр("ru = 'Не удалось сохранить ведомости по причине:
| %1'"),
КраткоеПредставлениеОшибки(ИнформацияОбОшибке())));
Возврат Ложь
КонецПопытки;
Иначе
Возврат Ложь
КонецЕсли
КонецФункции
&НаСервере
Процедура ОбработатьСообщенияПользователю()
Сообщения = ПолучитьСообщенияПользователю(Ложь);
Для Каждого Сообщение Из Сообщения Цикл
СтрокиВедомости = Ведомости.НайтиСтроки(Новый Структура("Ссылка", Сообщение.КлючДанных));
Если СтрокиВедомости.Количество() > 0 Тогда
Строка = СтрокиВедомости[0];
Сообщение.КлючДанных = Неопределено;
Сообщение.Поле = СтрШаблон("Ведомости[%1].Тип", Ведомости.Индекс(Строка));
КонецЕсли
КонецЦикла;
КонецПроцедуры
#КонецОбласти