1С: Специалист по платформе. Задача 2.23

1С: специалист по платформе. Решение задачи 2.23

Решение:

Для решения задачи задействуем следующие объекты:
1) ПВХ «Виды субконто». 

  • Заполняем типы значений характеристик и дополнительные значения характеристик. 
  • Согласно условиям задачи заводим  предопределенные  элементы  «Сотрудника», «ДатаВозврата».

2) Дорабатываем план счетов. 

  •  на закладке «субконто» заполняем тип субконто и устанавливаем значение субконто=2.
  • Редактируем предопределенный счет «КредитыЗаймыВыданные».(добавляем 2 субконто).
3) Добавляем регистр бухгалтерии «Управленческий».
  • Связываем его с планом счетов
  • Добавляем ресурсы ( сумма)
  • Выбираем регистраторы.
4) Не забываем о том, что в задачах бухгалтерского учета необходимо добавить документ,  с помощью которого можно добавлять записи в регистр вручную. Назовем его «Ручная операция».  Укажем, что он является регистратором нашего регистра. 
Добавим форму. На форму вытащим реквизит Объект-движения-управленческий.

5) Документ «Выдача Займа.»

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// БлокировкаДанных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Субконто1", Сотрудник);
ЭлементБлокировки.УстановитьЗначение("Счет",  ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
БудемШтрафовать = Ложь;
Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| УправленческийОстатки.СуммаОстатокДт КАК Долг,
| УправленческийОстатки.Субконто2 КАК ПланируемаяДатаВозврата
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&ТочкаИтогов, Счет = &Счет, &мсубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки";

Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
ТочкаИтогов =?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов",ТочкаИтогов);
мсубконто = Новый("Массив");
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.Сотрудник);
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата);
Запрос.УстановитьПараметр("мсубконто",мсубконто);

Результат = Запрос.Выполнить();
Если Не  Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Если Выборка.Долг<> Сумма Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сумма долга = "+ Выборка.Долг;
Сообщение.Сообщить();
КонецЕсли;
Если Выборка.ПланируемаяДатаВозврата< НачалоДня(Дата) И Выборка.Долг>1 Тогда
БудемШтрафовать = Истина;
КонецЕсли;
Иначе
Отказ=Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сотрудник ничего не должен";
Сообщение.Сообщить();
КонецЕсли;
Если Не Отказ Тогда
Движение = Движения.Управленческий.Добавить();
Движение.СчетКт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетДт = ПланыСчетов.Управленческий.Касса;
Движение.Период = Дата;
Движение.Сумма = Сумма;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Дата;
КонецЕсли;
// штраф
Если БудемШтрафовать и ДатаВозвратаШтрафа = Дата(1,1,1) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, необходимо заполнить дату возврата штрафа";
Сообщение.Сообщить();
КонецЕсли;
Если БудемШтрафовать Тогда
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Сумма = Сумма/100;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = ДатаВозвратаШтрафа;
КонецЕсли;
КонецПроцедуры


6) Документ «Возврат Займа»

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// БлокировкаДанных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Субконто1", Сотрудник);
ЭлементБлокировки.УстановитьЗначение("Счет",  ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
БудемШтрафовать = Ложь;
Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| УправленческийОстатки.СуммаОстатокДт КАК Долг,
| УправленческийОстатки.Субконто2 КАК ПланируемаяДатаВозврата
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&ТочкаИтогов, Счет = &Счет, &мсубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки";

Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.КредитыИЗаймыВыданные);
Запрос.УстановитьПараметр("Сотрудник",Сотрудник);
ТочкаИтогов =?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов",ТочкаИтогов);
мсубконто = Новый("Массив");
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.Сотрудник);
мсубконто.Добавить( ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата);
Запрос.УстановитьПараметр("мсубконто",мсубконто);

Результат = Запрос.Выполнить();
Если Не  Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Если Выборка.Долг<> Сумма Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сумма долга = "+ Выборка.Долг;
Сообщение.Сообщить();
КонецЕсли;
Если Выборка.ПланируемаяДатаВозврата< НачалоДня(Дата) И Выборка.Долг>1 Тогда
БудемШтрафовать = Истина;
КонецЕсли;
Иначе
Отказ=Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сотрудник ничего не должен";
Сообщение.Сообщить();
КонецЕсли;
Если Не Отказ Тогда
Движение = Движения.Управленческий.Добавить();
Движение.СчетКт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетДт = ПланыСчетов.Управленческий.Касса;
Движение.Период = Дата;
Движение.Сумма = Сумма;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = ПланируемаяДатаВозврата;
КонецЕсли;
// штраф
Если БудемШтрафовать и ДатаВозвратаШтрафа = Дата(1,1,1) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, необходимо заполнить дату возврата штрафа";
Сообщение.Сообщить();
КонецЕсли;
Если БудемШтрафовать Тогда
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.КредитыИЗаймыВыданные;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Сумма = Сумма/100;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудник] = Сотрудник;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = ДатаВозвратаШтрафа;
КонецЕсли;
КонецПроцедуры
7) Отчет.
Потребовалось соединение 2-х таблиц
ВЫБРАТЬ
Выдача.СубконтоДт1 КАК Сотрудник,
Выдача.СуммаОборот КАК СуммаЗайма,
Выдача.СубконтоДт2 КАК ПланируемаяДатаВозвращения,
Возвраты.ПериодДень КАК РеальнаяДатаВозвращения,
ВЫБОР
КОГДА Выдача.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки)
ТОГДА "V"
КОНЕЦ КАК ЯвляетсяШтрафом
ИЗ
РегистрБухгалтерии.Управленческий.ОборотыДтКт(&ДатаНачала, &ДатаОкончания, , СчетДт = &Счет, , , , ) КАК Выдача
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Авто, СчетДт = &счетКасса, , СчетКт = &Счет, , ) КАК Возвраты
ПО Выдача.СубконтоДт1 = Возвраты.СубконтоКт1
И Выдача.СуммаОборот = Возвраты.СуммаОборот
УПОРЯДОЧИТЬ ПО
ПланируемаяДатаВозвращения


13 Comments

  1. slazzy

    Я конечно всё понимаю, но Вы не могли бы объяснить почему тут ЕСТЬNULL?

    |СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0)) КАК Долг

    а вот тут нету

    Потребовалось соединение 2-х таблиц
    Reply
  2. Betis

    (1) slazzy, благодарю за наблюдательность. В данном случае сумма не имеет смысла, так как не влияет на результат. В ближайшее время исправлю и постараюсь впредь так не делать)

    Reply
  3. slazzy

    (2) Вы похоже не совсем поняли суть моего вопроса

    |ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК Долг

    Зачем тут использовать ЕСТЬNULL?

    И вот тут аналогично

    |СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0)) КАК Долг,
    |УправленческийОстатки.Субконто2 КАК ПланируемаяДатаВозврата
    |ИЗ
    |РегистрБухгалтерии.Управленческий.Остатки(&ТочкаИтогов, Счет = &Счет, &мсубконто, Субконто1 = &Сотрудник) КАК УправленческийОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |УправленческийОстатки.Субконто2″;
    

    Показать

    Группировать таблицу остатков не надо, она уже сгруппирована.

    Reply
  4. Betis

    (3) slazzy,

    1) Я Вас понял насчет группировки, погорячился)

    2) За замечание про ЕСТЬNUll отдельное спасибо, уже вошло в привычку все подряд ресурсы «изналлить» на всякий случай. В этом случае естественно это необязательно так как нет соединений таблиц, что могло бы привести к появлению «null».

    3) Еще исправил ошибку в документе «Возврат займа»

    Если результат запроса пустой добавил

    Отказ=Истина;

    Сообщение = Новый СообщениеПользователю;

    Сообщение.Текст = «Проведение невозможно, сотрудник ничего не должен»;

    Сообщение.Сообщить();

    КонецЕсли;

    Reply
  5. baton_pk

    А почему только одна? И почему именно эта?

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

    Reply
  6. Betis

    (5) baton_pk, 7

    Если имеете в виду исправленную ошибку, то где я написал что одна? Почему именно эта- наверное потому что ее я обнаружил.

    Если у Вас имеется конструктивная критика, то не стесняйтесь критикуйте. буду благодарен.

    Reply
  7. baton_pk

    (6)

    Я не про ошибку, я про публикацию вообще. Почему только одна задача и почему именно эта??? Тут народ выкладывает решения сразу если не всех, то гораздо большего количества задач.

    Reply
  8. fancy

    Замечание касательно 5) пункта решения.

    После условия

    Если БудемШтрафовать и ДатаВозвратаШтрафа = Дата(1,1,1) Тогда …

    в случае БудемШтрафовать = ИСТИНА будет зачем-то выполняться следующий блок,

    Если БудемШтрафовать Тогда …

    даже если Отказ = ИСТИНА

    Reply
  9. Betis

    (7) baton_pk, Это ж я как лучше хочу, выложу одно задание, народ покритикует, я в следующей задаче учту и исправлюсь. А именно эта просто потому что эта последняя что я решал.

    Reply
  10. Betis

    (8) fancy, Вы правы, в случае Отказ = ИСТИНА незачем даже выполнять этот блок.

    Reply
  11. slazzy

    теперь по поводу того же ISNULL

    ВЫБРАТЬ
    Выдача.СубконтоДт1 КАК Сотрудник,
    Выдача.СуммаОборот КАК СуммаЗайма,
    Выдача.СубконтоДт2 КАК ПланируемаяДатаВозвращения,
    Возвраты.ПериодДень КАК РеальнаяДатаВозвращения,
    ВЫБОР
    КОГДА Выдача.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки)
    ТОГДА «V»
    КОНЕЦ КАК ЯвляетсяШтрафом
    ИЗ
    РегистрБухгалтерии.Управленческий.ОборотыДтКт(&ДатаНачала, &ДатаОкончания, , СчетДт = &Счет, , , , ) КАК Выдача
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Авто, СчетДт = &счетКасса, , СчетКт = &Счет, , ) КАК Возвраты
    ПО Выдача.СубконтоДт1 = Возвраты.СубконтоКт1
    И Выдача.СуммаОборот = Возвраты.СуммаОборот
    УПОРЯДОЧИТЬ ПО
    ПланируемаяДатаВозвращения

    Показать

    вот тут

    Возвраты.ПериодДень КАК РеальнаяДатаВозвращения,

    Наоборот нужен ISNULL

    А вот тут

    ВЫБОР
    КОГДА Выдача.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки)
    ТОГДА «V»
    КОНЕЦ КАК ЯвляетсяШтрафом

    Неплохо бы сделать ветку ИНАЧЕ. Иначе если Счет не ПрибылиУбытки, то значение будет null

    Я в задачу не вникал, мне лень 🙂 но мне кажется странным соединение по сумме

    Reply
  12. Betis

    (11) slazzy, насчет «Null» в отчете, я не в курсе зачем ISNULL запросе в этом случае, ведь даже если получится «Null» я его не сравниваю и не складываю с другими значениями, если можно объясните как может возникнуть ошибка?

    насчет соединения по сумме, то еще раз перепроверил все нормально, без этого результат запроса будет задваиваться, если займов выдано и погашено 2.

    В документе «Возврат займа» нашел еще одну ошибку, надеюсь последнюю), нужно:

    Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Выборка.ПланируемаяДатаВозврата;

    вместо

    Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Выборка.Дата;

    Reply
  13. slazzy

    (12)

    slazzy, насчет «Null» в отчете, я не в курсе зачем ISNULL запросе в этом случае, ведь даже если получится «Null» я его не сравниваю и не складываю с другими значениями, если можно объясните как может возникнуть ошибка?

    Ошибки в принципе не будет. Это просто нуу как бы правило хорошего тона в общем случае избавляться от потенциальных NULL при соединениях. Но в целом никаких ошибок быть не должно.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *