gifts2017

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

Опубликовал Игорь Шкурин (Betis) в раздел Программирование - Сертификация

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
И Выдача.СуммаОборот = Возвраты.СуммаОборот
УПОРЯДОЧИТЬ ПО
ПланируемаяДатаВозвращения


Скачать файлы

Наименование Файл Версия Размер
Z2_23.dt 2
.dt 174,45Kb
11.03.15
2
.dt 174,45Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Артем Целовальников (slazzy) 11.03.15 10:51
Я конечно всё понимаю, но Вы не могли бы объяснить почему тут ЕСТЬNULL?
|СУММА(ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0)) КАК Долг


а вот тут нету
Потребовалось соединение 2-х таблиц
2. Игорь Шкурин (Betis) 11.03.15 11:09
(1) slazzy, благодарю за наблюдательность. В данном случае сумма не имеет смысла, так как не влияет на результат. В ближайшее время исправлю и постараюсь впредь так не делать)
3. Артем Целовальников (slazzy) 11.03.15 13:40
(2) Betis, Вы похоже не совсем поняли суть моего вопроса
|ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК Долг


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


Группировать таблицу остатков не надо, она уже сгруппирована.
4. Игорь Шкурин (Betis) 11.03.15 15:00
(3) slazzy,
1) Я Вас понял насчет группировки, погорячился)
2) За замечание про ЕСТЬNUll отдельное спасибо, уже вошло в привычку все подряд ресурсы "изналлить" на всякий случай. В этом случае естественно это необязательно так как нет соединений таблиц, что могло бы привести к появлению "null".
3) Еще исправил ошибку в документе "Возврат займа"
Если результат запроса пустой добавил
Отказ=Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проведение невозможно, сотрудник ничего не должен";
Сообщение.Сообщить();
КонецЕсли;

5. Сергѣй Батанов (baton_pk) 11.03.15 19:53
А почему только одна? И почему именно эта?
Мы как-то тут разбаловались и привыкли, что народ сразу скопом решения выкладывает.
6. Игорь Шкурин (Betis) 11.03.15 21:32
(5) baton_pk, 7
Если имеете в виду исправленную ошибку, то где я написал что одна? Почему именно эта- наверное потому что ее я обнаружил.
Если у Вас имеется конструктивная критика, то не стесняйтесь критикуйте. буду благодарен.
7. Сергѣй Батанов (baton_pk) 11.03.15 22:45
(6) Betis,
Я не про ошибку, я про публикацию вообще. Почему только одна задача и почему именно эта??? Тут народ выкладывает решения сразу если не всех, то гораздо большего количества задач.
8. Фаниль Исламов (fancy) 12.03.15 07:35
Замечание касательно 5) пункта решения.
После условия
Если БудемШтрафовать и ДатаВозвратаШтрафа = Дата(1,1,1) Тогда ...


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


даже если Отказ = ИСТИНА
9. Игорь Шкурин (Betis) 12.03.15 08:41
(7) baton_pk, Это ж я как лучше хочу, выложу одно задание, народ покритикует, я в следующей задаче учту и исправлюсь. А именно эта просто потому что эта последняя что я решал.
10. Игорь Шкурин (Betis) 12.03.15 08:47
(8) fancy, Вы правы, в случае Отказ = ИСТИНА незачем даже выполнять этот блок.
11. Артем Целовальников (slazzy) 12.03.15 09:34
теперь по поводу того же ISNULL
ВЫБРАТЬ
Выдача.СубконтоДт1 КАК Сотрудник,
Выдача.СуммаОборот КАК СуммаЗайма,
Выдача.СубконтоДт2 КАК ПланируемаяДатаВозвращения,
Возвраты.ПериодДень КАК РеальнаяДатаВозвращения,
ВЫБОР
КОГДА Выдача.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки)
ТОГДА "V"
КОНЕЦ КАК ЯвляетсяШтрафом
ИЗ
РегистрБухгалтерии.Управленческий.ОборотыДтКт(&ДатаНачала, &ДатаОкончания, , СчетДт = &Счет, , , , ) КАК Выдача
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , Авто, СчетДт = &счетКасса, , СчетКт = &Счет, , ) КАК Возвраты
ПО Выдача.СубконтоДт1 = Возвраты.СубконтоКт1
И Выдача.СуммаОборот = Возвраты.СуммаОборот
УПОРЯДОЧИТЬ ПО
ПланируемаяДатаВозвращения
...Показать Скрыть


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

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

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

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

Я в задачу не вникал, мне лень :) но мне кажется странным соединение по сумме
12. Игорь Шкурин (Betis) 12.03.15 10:30
(11) slazzy, насчет "Null" в отчете, я не в курсе зачем ISNULL запросе в этом случае, ведь даже если получится "Null" я его не сравниваю и не складываю с другими значениями, если можно объясните как может возникнуть ошибка?
насчет соединения по сумме, то еще раз перепроверил все нормально, без этого результат запроса будет задваиваться, если займов выдано и погашено 2.
В документе "Возврат займа" нашел еще одну ошибку, надеюсь последнюю), нужно:
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Выборка.ПланируемаяДатаВозврата;
вместо
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ДатаВозврата] = Выборка.Дата;
13. Артем Целовальников (slazzy) 12.03.15 10:49
(12) Betis,
slazzy, насчет "Null" в отчете, я не в курсе зачем ISNULL запросе в этом случае, ведь даже если получится "Null" я его не сравниваю и не складываю с другими значениями, если можно объясните как может возникнуть ошибка?

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