Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с написание модуля оплаты
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Fabri
Добрый день. Так как в работе с регистрами накопления опыта работы у меня минимум, прошу помочь и подсказать. Конфигурация пишется для учебного заведения. Идет оплата по курсам. В литературе которую читаю есть примеры и описание только такого принципа - запись в регистр накопления (минус) т.е. задолженность, и потом поступление (плюс), ну и разница если есть - остаток. Тут же нужно так. Есть к примеру 5 курсов, и за каждый курс при формировании договора идет начисление (минус), потом студент оплачивает, за каждый курс по отдельности или может сразу за три курса заплатить. И вот незнаю как правильно реализовать это в регистре, чтобы потом соответственно выводить задолженности за определенный курс в отчете. Буду очень благодарен за помощь.
DartRomanius
Цитата(Fabri @ 21.06.12, 12:04) необходимо зарегистрироваться для просмотра ссылки
Добрый день. Так как в работе с регистрами накопления опыта работы у меня минимум, прошу помочь и подсказать. Конфигурация пишется для учебного заведения. Идет оплата по курсам. В литературе которую читаю есть примеры и описание только такого принципа - запись в регистр накопления (минус) т.е. задолженность, и потом поступление (плюс), ну и разница если есть - остаток. Тут же нужно так. Есть к примеру 5 курсов, и за каждый курс при формировании договора идет начисление (минус), потом студент оплачивает, за каждый курс по отдельности или может сразу за три курса заплатить. И вот незнаю как правильно реализовать это в регистре, чтобы потом соответственно выводить задолженности за определенный курс в отчете. Буду очень благодарен за помощь.


В принципе можно добавить реквизит "Курс" и делать отбор по нему.
Fabri
Цитата(DartRomanius @ 21.06.12, 12:36) необходимо зарегистрироваться для просмотра ссылки
В принципе можно добавить реквизит "Курс" и делать отбор по нему.


А если потребуется отчет об общей задолженности за все курсы?
Тогла таким макаром - ОстатокКурс1+ОстатокКурс2+ОстатокКурс3+ОстатокКурс4 ?
DartRomanius
Цитата(Fabri @ 21.06.12, 13:23) необходимо зарегистрироваться для просмотра ссылки
А если потребуется отчет об общей задолженности за все курсы?
Тогла таким макаром - ОстатокКурс1+ОстатокКурс2+ОстатокКурс3+ОстатокКурс4 ?


Зачем? без указания отбора по реквизиту а не по измерению все будет отлично работать.

Поясню. Есть, допустим РегистрНакопления.
Измерение - Студент
Ресурс - Сумма
Реквизит - Курс.

Измерения служат для обеспечения уникальности (+ всегда присутствует регистратор и пр.стандартные вещи)
а реквизит - как информация к дополнению (сведению?).
Fabri
Можете подробней рассказать, ато путанина получается у меня.
Добавил регистр накопления - ОплатыСтудентов
Измерения:
1. Студент - Справочник.Студенты
2. Курс - Перечисления.НомерКурса
Ресурсы:
СуммаОплаты - Число 10, точность 2, неотрицательное

Теперь формирую документ ДоговорСтудента
Идет проведение по регистру

    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
//           Движение.Курс = 1
//    Движение.СуммаОплаты = Объект.ОплатаКурс1;  -  так соответственно для 2,3,4 курсов?


Ок, пусть так. Тогда как принимать оплату
Есть документ ПриемОплаты

Теперь при проведении, проверять остатки за каждый курс? И который не оплачен проплачивать, и ещё учитывать, если сумма больше суммы за задолженность к примеру за 1-й курс, то ещё и добавлять к второму, короч я запутался. 47046430.gif
Ardi
Пусть руками распределяют сумму по курсам smile.gif


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

А вообще танцевать нужно с конца.
Что как выглядит техпроцесс когда слушателя пускают/не пускают на курсы?
Fabri
Цитата(Ardi @ 21.06.12, 14:25) необходимо зарегистрироваться для просмотра ссылки
Пусть руками распределяют сумму по курсам smile.gif


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

А вообще танцевать нужно с конца.
Что как выглядит техпроцесс когда слушателя пускают/не пускают на курсы?


Не ну руками то уже очень нелогически как-то. Можно канеш елементарно, формировать общую сумму задолженности, и потом погашать её, а при выводе отчета, создать процедуру которая осуществляет:
Общая сумма задолженности - ОстатокЗадолженности.
и
Если ОтчетКурс1=Истина Тогда //Где ОтчетКурс1 параметр вывода отчета
а= Общая сумма задолженности - ОстатокЗадолженности;
б= а - ЦенаКурс1;
Возврат б;


Но все же, может как-то получьше можно это реализовать. У кого будут ещё идеи?
Vofka
Нужно измерение в регистре Курс. Вот и всё. И руками разносить оплату по курсам. Другого не дано.
Fabri
Цитата(Vofka @ 21.06.12, 15:24) необходимо зарегистрироваться для просмотра ссылки
Нужно измерение в регистре Курс. Вот и всё. И руками разносить оплату по курсам. Другого не дано.


А общую сумму как выводить? И ещё, есть такое что студент переводится с одного факультета на другой, и там сумма за обучение другая, тогда он получится в переплате, как в регистре перенести тогда? Отдельно ещё один документ для переноса создавать?
DartRomanius
Што-та мне кажется надо воскурить мантру "написание технического задания".
Vofka
Цитата(Fabri @ 21.06.12, 15:58) необходимо зарегистрироваться для просмотра ссылки
А общую сумму как выводить?

Варианты ответов будут?

Цитата
И ещё, есть такое что студент переводится с одного факультета на другой, и там сумма за обучение другая, тогда он получится в переплате, как в регистре перенести тогда? Отдельно ещё один документ для переноса создавать?

Да, аля "Перемещение товаров студентов". При проведении выводите регистр по студенту и курсу в 0 и записываете потом новую сумму. Ну это мне так кажется, а я ж хз как оно должно в итоге получиться и какие есть нюансы данного процесса.
logist
Зачем вводить руками? При оплате разносить сумму автоматом по курсам (типа как идет списание товаров по ФИФО, так же и разносить оплату).
Ardi
Цитата(logist @ 21.06.12, 17:12) необходимо зарегистрироваться для просмотра ссылки
При оплате разносить сумму автоматом по курсам

А кто сказал что курс после 100% предоплаты посещается?
Может человек 2 курсов будет ходить и платить постепенно.
Fabri
Все таки решил делать по такому принципу. Создается договор, регистр - ОплатыСтудентов - расход на общую сумму.
Документ - ПриемОплаты - Приход соответственно.
Но щас появилась новая проблема.
Имею Остаток задолженности. Имею общую сумму. Именю цены за каждый курс. Но никак не получается вывести ни в отчете, ни допустим в форме задолженность.
Суммы получаются непонятные.

Может кто-то более силён в математике и логике, прошу помочь:

пример:

A=22500 - общая сумма
B=8580 - остаток задолженности
x1 = 4000 - цена за 1-й курс
x2 = 4200 - цена за 2-й курс
x3 = 4500 - цена за 3-й курс
x4 = 4800 - цена за 4-й курс
x5 = 5000 - цена за 5-й курс

Как обчислить остаток задолженности за каждый из курсов?

Ardi
Не расстраивайтесь, за годик всё получится.
Fabri
Цитата(Ardi @ 02.07.12, 15:42) необходимо зарегистрироваться для просмотра ссылки
Не расстраивайтесь, за годик всё получится.


Та я не расстраиваюсь, конфа пишется на добровольных началах, без какой либо оплаты. Просто подкрепление теоретических знаний на практике. Но вот как в любом языке программирования, в книге описанны только сами функции, операторы и т.д., а вот сама логика и приемы программирования, это дело наживное, поэтому и приходится просить помощи, у старшых братьев, которые эту школу уже прошли smile.gif
logist
Храните данные в регистре (регистр Остатков) в разрезе курсов, и так же разносите по курсам оплату. В таком случае получение разных данных (отчеты, движения) будет простым.

Это что бы понять логику (к приемам программирования не имеет отношения):
A=22500;
B=8580;
x1 = 4000;
x2 = 4200;
x3 = 4500;
x4 = 4800;
x5 = 5000;
Оплачено = А-В;

Если Оплачено > (х1+х2+х3+х4+х5) Тогда
сообщить("Оплачено больше чем необходимо");
ИначеЕсли Оплачено = (х1+х2+х3+х4+х5) Тогда
сообщить("Оплачено 5 курсов");
ИначеЕсли Оплачено > (х1+х2+х3+х4) Тогда
сообщить("Оплачено 4 курса и часть 5го");
ИначеЕсли Оплачено = (х1+х2+х3+х4) Тогда
сообщить("Оплачено 4 курса");
ИначеЕсли Оплачено > (х1+х2+х3) Тогда
сообщить("Оплачено 3 курса и часть 4го");
ИначеЕсли Оплачено = (х1+х2+х3) Тогда
сообщить("Оплачено 3 курса");
ИначеЕсли Оплачено > (х1+х2) Тогда
сообщить("Оплачено 2 курса и часть 3го");
ИначеЕсли Оплачено = (х1+х2) Тогда
сообщить("Оплачено 2 курса");
ИначеЕсли Оплачено > х1 Тогда
сообщить("Оплачено 1 курс и часть 2го");
ИначеЕсли Оплачено = х1 Тогда
сообщить("Оплачено 1 курс");
ИначеЕсли Оплачено < х1 и А > 0 Тогда
сообщить("Оплачено меньше одного курса");
Иначе
сообщить("Оплат нет");
КонецЕсли;
Fabri
Цитата(logist @ 02.07.12, 16:23) необходимо зарегистрироваться для просмотра ссылки
Храните данные в регистре (регистр Остатков) в разрезе курсов, и так же разносите по курсам оплату. В таком случае получение разных данных (отчеты, движения) будет простым.


Так лекче всего, и мне проще, но, тогда методисту прийдется учитывать задолженность, т.е. если студент должен за 1-й курс ещё 1300 грн, а проплатил 2500, тогда 1300 она вносит по реквизиту 1-й курс, а 1200 грн по реквизиту 2-й курс, но тут присутствует человеческий фактор, и возможны ошибки и т.д.
logist
Цитата(Fabri @ 02.07.12, 16:30) необходимо зарегистрироваться для просмотра ссылки
но, тогда методисту прийдется учитывать задолженность, т.е. если студент должен за 1-й курс ещё 1300 грн, а проплатил 2500, тогда 1300 она вносит по реквизиту 1-й курс, а 1200 грн по реквизиту 2-й курс, но тут присутствует человеческий фактор, и возможны ошибки и т.д.

Реализуйте заполнение документа Оплаты по курсам (по принципу ФИФО), ну или без ручного заполнения, при проведении автоматом раскидывайте по курсам, это самое логичное решение.
Fabri

 ! 

Правила, п .13
 

Хотя при проплате, можно учитывать остаток задолженности, и если сумма проплаты больше - выдавать ошибку.

Цитата(logist @ 02.07.12, 16:32) необходимо зарегистрироваться для просмотра ссылки
Реализуйте заполнение документа Оплаты по курсам (по принципу ФИФО), ну или без ручного заполнения, при проведении автоматом раскидывайте по курсам, это самое логичное решение.


Спасибо большое icon_beer17.gif , Вы и вправду logist 12201689.gif smile.gif
logist
Цитата(Fabri @ 02.07.12, 16:36) необходимо зарегистрироваться для просмотра ссылки
Спасибо большое

На здоровье, только не понятно почему проигнорировали сообщение необходимо зарегистрироваться для просмотра ссылки
Fabri
Цитата(logist @ 02.07.12, 16:42) необходимо зарегистрироваться для просмотра ссылки
На здоровье, только не понятно почему проигнорировали сообщение необходимо зарегистрироваться для просмотра ссылки


Не проигнорировал, не совсем понял, молодой ещё, неопытный smile.gif
Fabri
И опять же, хочется автоматом расскидывать по курсам, а получается ступор.

Вот тут все гут: Документ - Создание договора студента
    //Цена за первый курс
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.ВидУслуги = Перечисления.ВидыУслуг.Образование;
    Движение.Курс=Перечисления.НомерКурса.Первый;
    Движение.СуммаОплаты = Студент.Цена1курс;
    
    //Цена за второй курс
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.ВидУслуги = Перечисления.ВидыУслуг.Образование;
    Движение.Курс=Перечисления.НомерКурса.Второй;
    Движение.СуммаОплаты = Студент.Цена2курс;
    
    //Цена за третий курс
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.ВидУслуги = Перечисления.ВидыУслуг.Образование;
    Движение.Курс=Перечисления.НомерКурса.Третий;
    Движение.СуммаОплаты = Студент.Цена3курс;
    
    //Цена за четвертый курс
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.ВидУслуги = Перечисления.ВидыУслуг.Образование;
    Движение.Курс=Перечисления.НомерКурса.Червертый;
    Движение.СуммаОплаты = Студент.Цена4курс;
    
    //Цена за пятый курс
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.ВидУслуги = Перечисления.ВидыУслуг.Образование;
    Движение.Курс=Перечисления.НомерКурса.Пятый;
    Движение.СуммаОплаты = Студент.Цена5курс;


Теперь Документ - Прием Оплаты

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

    Запрос.УстановитьПараметр("ВидУслуги", ВидУслуги);
    Запрос.УстановитьПараметр("Студент", Студент);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Если ВыборкаДетальныеЗаписи.Курс=Перечисления.НомерКурса.Первый Тогда
            х1=ВыборкаДетальныеЗаписи.СуммаОплатыОстаток;
        ИначеЕсли ВыборкаДетальныеЗаписи.Курс=Перечисления.НомерКурса.Второй Тогда
            х2=ВыборкаДетальныеЗаписи.СуммаОплатыОстаток;
        ИначеЕсли ВыборкаДетальныеЗаписи.Курс=Перечисления.НомерКурса.Третий Тогда
            х3=ВыборкаДетальныеЗаписи.СуммаОплатыОстаток;
        ИначеЕсли ВыборкаДетальныеЗаписи.Курс=Перечисления.НомерКурса.Червертый Тогда
            х4=ВыборкаДетальныеЗаписи.СуммаОплатыОстаток;
        ИначеЕсли ВыборкаДетальныеЗаписи.Курс=Перечисления.НомерКурса.Пятый Тогда
            х5=ВыборкаДетальныеЗаписи.СуммаОплатыОстаток;
        КонецЕсли;

    КонецЦикла;

    // регистр ОплатыСтудентов Приход
    Движения.ОплатыСтудентов.Записывать = Истина;
    Движение = Движения.ОплатыСтудентов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Студент = Студент;
    Движение.СуммаОплаты = Сумма;
    Движение.ВидУслуги=ВидУслуги;

КонецПроцедуры


Вот тут не знаю как правильно прописать условие, так как сумма оплаты может быть больше х1 и х2, а может быть больще х1 но меньше х2 и т.д.

Или все таки лучьше добавить в документе реквизит курс, и пусть руками разносят по курсам? Единственное прописать проверку:
Если Сумма>х1 Тогда 
Сообщить("Сумма проплаты превышает задолженность, введите сумма не больше " + x1$
КонецЕсли;


logist
Цитата(Fabri @ 03.07.12, 12:29) необходимо зарегистрироваться для просмотра ссылки
а получается ступор.

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

p.s. "как это сделать" у меня сегодня нет времени расписывать
Fabri
Цитата(logist @ 03.07.12, 13:07) необходимо зарегистрироваться для просмотра ссылки
Ступор получился потому что слишком много кода, некоторые вещи можно сделать на уровне запроса, некоторые оптимизировать.

p.s. "как это сделать" у меня сегодня нет времени расписывать


Ну может как будет время, то помогите, буду очень благодарен.

Я чуток изменил запрос, так как суммы которы = 0 или больше 0 нас не интересуют, но все равно как дальше, непойму
Ноль=0;    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОплатыСтудентовОстатки.Студент,
        |    ОплатыСтудентовОстатки.ВидУслуги,
        |    ОплатыСтудентовОстатки.Курс,
        |    ОплатыСтудентовОстатки.СуммаОплатыОстаток
        |ИЗ
        |    РегистрНакопления.ОплатыСтудентов.Остатки КАК ОплатыСтудентовОстатки
        |ГДЕ
        |    ОплатыСтудентовОстатки.Студент = &Студент
        |    И ОплатыСтудентовОстатки.ВидУслуги = &ВидУслуги
        |    И ОплатыСтудентовОстатки.СуммаОплатыОстаток < &Ноль";

    Запрос.УстановитьПараметр("ВидУслуги", ВидУслуги);
    Запрос.УстановитьПараметр("Студент", Студент);
logist
Что мешает сделать так, без использования параметра:
<...>
        |    И ОплатыСтудентовОстатки.СуммаОплатыОстаток < 0";

Если "конструктор ругается", то прочтите основы работы с ним, это поможет в будущем избегать написания всякой фигни.

Цитата
буду очень благодарен.

какие размеры и форма благодарности? smile.gif
Fabri
какие размеры и форма благодарности?

Бутылка вкусного домашнего закарпатского вина, новой почтой на ваш адрес smile.gif
Fabri
Решил я не автоматом разносить по курсам, а ручками пусть разносят.
Но для удобства в документ ПриемОплаты, добавил ДинамическийСписок, в который выводится задолженность по курсам.
Произвольный запрос, текст запроса:
ВЫБРАТЬ
    ОплатыСтудентовОстатки.Студент,
    ОплатыСтудентовОстатки.ВидУслуги,
    ОплатыСтудентовОстатки.Курс,
    ОплатыСтудентовОстатки.СуммаОплатыОстаток
ИЗ
    РегистрНакопления.ОплатыСтудентов.Остатки КАК ОплатыСтудентовОстатки


Помогите написать условие отбора:

ГДЕ ОплатыСтудентовОстатки.Студент = Обьект.Студент 
И ОплатыСтудентовОстатки.ВидУслуги = Обьект.ВидУслуги


Заранее спасибо.
logist
При открытии документа сделать:
    ЭлементФормыДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Студент",    Объект.Студент);
    ЭлементФормыДинамическийСписок.Параметры.УстановитьЗначениеПараметра("ВидУслуги",    Объект.ВидУслуги);


Хотя идея динамического списка не очень как по мне.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.