Всем привет. Ну вот и пришел мой черед написать здесь свое сообщение. Готовился месяцев 5. Сначала теорию по методичкам, потом разбирал решения, выложенные здесь, потом сам прорешивал актуальные билеты (сначала отдельно ОУ из всех билетов, далее по-порядку БУ, ПР, УФ и БП, потом билеты целиком). Все тянулось мучительно долго, а уверенности в готовности к сдаче все не было. До изменений/дополнений актуальных билетов вообще не добрался (только немного посмотрел расчет зарплаты в форме).
И вот настал день экзамена. Сдавал очно в учебном центре №1. Зашли в аудиторию в 10:25, преподаватель представился как Валерий, сразу сказал, что экзамен начнется в 11:00, а закончится в 16:00, то есть он нам фактически накинул 30 мин, за что ему огромное спасибо. Попался билет №1: ОУ из Б1, БУ из Б4, ПР из Б2, БП из Б12. Все в точности, как в актуальных, без каких-либо изменений и дополнений. Когда пробежал билет - прям камень с души упал
- все знал как решать.
ОУ: два регистра накопления - остатки (изм.: номенклатура, склад, рес.: количество), себестоимость (изм.: номенклатура, партия, рес.: количество, сумма). При списании контролируем остатки в разрезе складов, а себестоимость списываем по партиям.
БУ: счет товары (количественный, субконто: номенклатура, склад, партия), счет покупатели (субконто: контрагент (только обороты, спр. организации). В РБ измерение - организация. Купля-продажа - для организации-продавца - списание по партиям, для организации-покупателя - приход (партия - док. КП).
ПР: здесь интересное условие:
Оклад может меняться в течение расчетного периода: Сделал примерно так: (док. НачислениеЗарплаты):
Процедура ОбработкаПроведения(Отказ, Режим)
Если НЕ ЭтоНовый() Тогда
Движения.ОсновныеНачисления.Очистить();
Движения.ДополнительныеНачисления.Записать();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НачислениеЗарплатыОсновныеНачисления.НомерСтроки КАК НомерСтроки,
| НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ПериодРегистрации, МЕСЯЦ) КАК ПериодРегистрации,
| НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
| НачислениеЗарплатыОсновныеНачисления.Подразделение,
| НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
| НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаНачала, ДЕНЬ) КАК ДатаНачала,
| КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ) КАК ДатаОкончания,
| МАКСИМУМ(СведенияОСотрудниках.Период) КАК Период
|ПОМЕСТИТЬ ВТ_Документ
|ИЗ
| Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
| ПО НачислениеЗарплатыОсновныеНачисления.Сотрудник = СведенияОСотрудниках.Сотрудник
| И НачислениеЗарплатыОсновныеНачисления.ДатаНачала >= СведенияОСотрудниках.Период
|ГДЕ
| НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| КОНЕЦПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаОкончания, ДЕНЬ),
| НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
| НачислениеЗарплатыОсновныеНачисления.Подразделение,
| НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ПериодРегистрации, МЕСЯЦ),
| НачислениеЗарплатыОсновныеНачисления.Сотрудник,
| НачислениеЗарплатыОсновныеНачисления.НомерСтроки,
| НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.ДатаНачала, ДЕНЬ)
|
|ИНДЕКСИРОВАТЬ ПО
| НомерСтроки,
| Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Документ.НомерСтроки КАК НомерСтроки,
| ВТ_Документ.ПериодРегистрации,
| ВТ_Документ.Сотрудник КАК Сотрудник,
| ВТ_Документ.Подразделение,
| ВТ_Документ.ВидРасчета,
| ВТ_Документ.ДатаОкончания,
| СведенияОСотрудниках.Оклад КАК НачальныйОклад,
| ВТ_Документ.ДатаНачала
|ПОМЕСТИТЬ ВТ_НачальныйОклад
|ИЗ
| ВТ_Документ КАК ВТ_Документ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
| ПО ВТ_Документ.Сотрудник = СведенияОСотрудниках.Сотрудник
| И ВТ_Документ.Период = СведенияОСотрудниках.Период
|
|ИНДЕКСИРОВАТЬ ПО
| НомерСтроки,
| Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_НачальныйОклад.НомерСтроки КАК НомерСтроки,
| ВТ_НачальныйОклад.ПериодРегистрации КАК ПериодРегистрации,
| ВТ_НачальныйОклад.Сотрудник КАК Сотрудник,
| ВТ_НачальныйОклад.Подразделение КАК Подразделение,
| ВТ_НачальныйОклад.ВидРасчета КАК ВидРасчета,
| ВТ_НачальныйОклад.ДатаОкончания КАК ДатаОкончания,
| ЕСТЬNULL(ВТ_НачальныйОклад.НачальныйОклад, 0) КАК НачальныйОклад,
| НАЧАЛОПЕРИОДА(СведенияОСотрудниках.Период, ДЕНЬ) КАК ДатаОклада,
| ЕСТЬNULL(СведенияОСотрудниках.Оклад, 0) КАК ОкладНаДату,
| ВТ_НачальныйОклад.ДатаНачала КАК ДатаНачала
|ИЗ
| ВТ_НачальныйОклад КАК ВТ_НачальныйОклад
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
| ПО ВТ_НачальныйОклад.Сотрудник = СведенияОСотрудниках.Сотрудник
| И ВТ_НачальныйОклад.ДатаОкончания >= СведенияОСотрудниках.Период
| И ВТ_НачальныйОклад.ДатаНачала < СведенияОСотрудниках.Период
|ИТОГИ
| МАКСИМУМ(ПериодРегистрации),
| МАКСИМУМ(Сотрудник),
| МАКСИМУМ(Подразделение),
| МАКСИМУМ(ВидРасчета),
| МАКСИМУМ(ДатаОкончания),
| МАКСИМУМ(НачальныйОклад),
| МАКСИМУМ(ДатаНачала)
|ПО
| НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаНомерСтроки = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНомерСтроки.Следующий() Цикл
Если ВыборкаНомерСтроки.НачальныйОклад = 0 Тогда
Сообщить("Для сотрудника " + ВыборкаНомерСтроки.Сотрудник + " не задан оклад");
Отказ = Истина;
Продолжить;
КонецЕсли;
Размер = ВыборкаНомерСтроки.НачальныйОклад;
ДатаНачала = ВыборкаНомерСтроки.ДатаНачала;
ВыборкаДетальныеЗаписи = ВыборкаНомерСтроки.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// В данном случае нулевой оклад говорит о том, что у нас не было изменений оклада в течение
// расчетного периода, следовательно всего одна запись с начальным окладом
Если ВыборкаДетальныеЗаписи.ОкладНаДату = 0 Тогда
Прервать;
КонецЕсли;
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ВыборкаДетальныеЗаписи.ВидРасчета;
Движение.ПериодДействияНачало = ДатаНачала;
Движение.ПериодДействияКонец = ВыборкаДетальныеЗаписи.ДатаОклада-1;
Движение.ПериодРегистрации = ВыборкаДетальныеЗаписи.ПериодРегистрации;
Движение.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
Движение.Размер = Размер;
Движение.Подразделение = ВыборкаДетальныеЗаписи.Подразделение;
ДатаНачала = ВыборкаДетальныеЗаписи.ДатаОклада;
Размер = ВыборкаДетальныеЗаписи.ОкладНаДату;
КонецЦикла;
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ВыборкаНомерСтроки.ВидРасчета;
Движение.ПериодДействияНачало = ДатаНачала;
Движение.ПериодДействияКонец = ВыборкаНомерСтроки.ДатаОкончания;
Движение.ПериодРегистрации = ВыборкаНомерСтроки.ПериодРегистрации;
Движение.Сотрудник = ВыборкаНомерСтроки.Сотрудник;
Движение.Размер = Размер;
Движение.Подразделение = ВыборкаНомерСтроки.Подразделение;
КонецЦикла;
Для Каждого ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.Сторно = Ложь;
Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;
Движение.ПериодРегистрации = НачалоМесяца(ТекСтрокаДополнительныеНачисления.ПериодРегистрации);
Движение.БазовыйПериодНачало = НачалоМесяца(ТекСтрокаДополнительныеНачисления.ПериодРегистрации);
Движение.БазовыйПериодКонец = КонецМесяца(ТекСтрокаДополнительныеНачисления.ПериодРегистрации);
Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;
Движение.Размер = ТекСтрокаДополнительныеНачисления.Размер;
КонецЦикла;
Движения.ОсновныеНачисления.Записать();
Движения.ДополнительныеНачисления.Записать();
Расчеты.Расчитать(Ссылка, Отказ);
КонецПроцедуры
БП: ничего необычного. Единственное - не забыть, что задача "Отчет о проделанной работе" - групповая.
Преподаватель сказал, что его все вполне устраивает за исключением реализации одного условия
"В одном документе могут быть данные за разные расчетные периоды". Я запихал ПериодРегистрации в ТЧ начислений, и это его вроде как устроило, но я что-то "не обработал". Преподаватель говорил про вызов процедур расчета из общего модуля в цикле
. Я, к сожалению, так и не понял, в чем у меня косяк и как это условие правильно реализуется. Если кто знает, подскажите пожалуйста.
Результат - экзамен сдан.
Прикладываю свою подготовку - мои разборы решений участников данного форума (за что им большое спасибо), думаю, кому-нибудь пригодится (там правда возможно есть ошибки/опечатки в следствие копипаста). Но помните, что "ценность шпаргалок - в их написании" - цитата alex1248 (очень ценное замечание).
Для подготовки советую делать каркасы решений и запоминать их - по-моему, это очень продуктивно.
Всем успехов!
[вложение удалено администратором]