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

11.03.15

Разработка - Подготовка к аттестации

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Z2_23.dt
.dt 174,45Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

Решение:

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


специалист

См. также

Подготовка к аттестации Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Обучающая программа 1С Online представляет собой интерактивное изучение языка запросов с самого начала: - 50 практических заданий с различным уровнем сложности; - Методические материалы по практике написания запросов; - Описание назначения таблиц и индексов 1С Предприятие 8; - Методика решения реальных задач запросом 1С; - Автоматическая система проверки решений с указанием ошибок; - Инструкции по решению задач с разъяснениями; - Техническая поддержка пользователей. Тренажер запросов подходит для начинающих и действующих разработчиков 1С

1800 руб.

11.02.2014    78779    103    15    

197

Подготовка к аттестации Программист Запросы 1C:Бухгалтерия Платные (руб)

Желаете повысить свой уровень разработки? Не знаете, как оптимизировать работу тяжелых запросов 1С? Или знаете методы оптимизации, но на практике не получаете результат? Тогда эта интерактивная обучающая программа для Вас! Оптимизация запросов прямо в программе 1С:Предприятие 8. Несколько десятков практических заданий, рассматривающих методы оптимизации на практике. От Вас требуются реальные решения - оптимизация представленных запросов. Автоматизированная система оценит Ваш запрос и представит результат проверки.

1800 руб.

06.07.2015    72877    122    9    

135

Подготовка к аттестации Программист Россия Бесплатно (free)

Источники информации для подготовки к Эксперту.

18.12.2024    10418    GraVVitY    61    

64

Подготовка к аттестации Программист Стажер Бесплатно (free)

Меня зовут Татьяна, в 1С-разработке я уже семь лет, а в этом году официально стала junior-специалистом. Рассказываю, как всё происходило.

10.09.2024    8400    PROSTO-1C    21    

14

Подготовка к аттестации Программист Стажер Платформа 1С v8.3 Россия Бесплатно (free)

Я Олег, разработчик 1С. Расскажу, как сдавал на сертификат Специалиста, в чём ошибся и что стоит учесть.

11.06.2024    16704    PROSTO-1C    52    

68

Подготовка к аттестации Программист Стажер Платформа 1С v8.3 Россия Бесплатно (free)

Хочу поделиться своей историей планирования обучения, подготовки к экзамену и сдачи непосредственно экзамена. Надеюсь, что это будет полезно и откинет все вопросы об экзамене.

04.06.2024    11029    anton99    50    

58

Подготовка к аттестации Стажер 1C:Бухгалтерия Фармацевтика, аптеки Россия Управленческий учет Бесплатно (free)

Краткий рассказ о выборе 1С как основного языка программирования для дипломной работы в университете, и само приложение к диплому.

28.05.2024    5002    DmitryOneBit    20    

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


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


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


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

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


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


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


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

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

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

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

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

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