Автор Тема: Задача 2.31  (Прочитано 19969 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Nechipury

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Нечипоренко Евгений Александрович
Задача 2.31
« Ответ #15 : Август 29, 2013, 04:49:50 pm »
Кто делал как я тот я....
 1.Создаем РС и Док с движениями например ЛимитДенежныхСредств
 2.Делаем общий модуль , где проверяем превышение лимита и возвращаем булево.
 3.Есть такой общий модуль ДенежныеСредстваСервер находим там РазрешеныПлатежиБезУказанияЗаявок и прям в этой функции вызываем наш модуль = в зависимости от значения возврат Ложь.

 Функция РазрешеныПлатежиБезУказанияЗаявок(ДокументОбъект) Экспорт
    //+2.30
     Если Задача.ПревышенЛимитДС(ДокументОбъект) = Истина Тогда
        Если ДокументОбъект.ЗаявкаНаРасходованиеДенежныхСредств.Пустая() Тогда
       Сообщение = Новый СообщениеПользователю;
       Сообщение.Текст = "Лимит ДС исчерпан!";
       Сообщение.Сообщить();
       Возврат Ложь;
       КонецЕсли;
       
    КонецЕсли;   
    //-2.30

 4.В менеджере док.СписаниеБезналичныхДенежныхСредств добавляем МассивРеквизитовОперации.Добавить("Подразделение");
 5.Ну и модулеОбъекта родимом нашем запиливаем

 Процедура ОбработкаПроведения(Отказ, РежимПроведения)

 ////+2.31   
 Если ДенежныеСредстваСервер.РазрешеныПлатежиБезУказанияЗаявок(ЭтотОбъект) = Ложь И
    ЭтотОбъект.ЗаявкаНаРасходованиеДенежныхСредств.Пустая() Тогда
    Отказ = Истина;
 Иначе
    Отказ = Ложь;
 КонецЕсли;
 6.Делаем Отчет в СКД

VaKiSe

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: VaKiSe
Задача 2.31
« Ответ #16 : Сентябрь 18, 2013, 11:38:01 pm »
Предлагаю такое решение очень простое и быстрое:

 1.) Создаем Рег. Нак. "ЛимитыПоПодразделениям"
 2.) Создаем документ "Ввод лимита на месяц"
 документ обнуляет лимит по всем подразделениям за прошлый месяц "-"(если они не израсходованы) и вводит записи на новый (как сказано в условии)со знаком "+".
 3.) При проведении документов расходования Д/С (через подписку на события) расходуем из РН лимит и контролируем остаток(как сказано в условии), если лимита не хватает выводим сообщение мол сделайте заявку на не хватаемую сумму.
 4.) При проведении документа "Заявка на расход Д/С" опять же через подписку делаем запись в регистр со знаком "+" тем самым увеличиваем лимит по выбранному подразделению!
 5.) Лепим примитивный отчет в СКД по остаткам Рег.нак. "ЛимитыПоПодразделениям"
 6.) Все!


asu2

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: asu2
Задача 2.31
« Ответ #17 : Октябрь 02, 2013, 09:30:40 am »
Мой вариант... на проверку

Добавлено (02.10.2013, 09:29)
---------------------------------------------
.

Добавлено (02.10.2013, 09:30)
---------------------------------------------
блин почему не прикрепляются файлы............


reckoner

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: reckoner
Задача 2.31
« Ответ #18 : Октябрь 06, 2013, 02:21:36 pm »
Если бы я делал, то сделал бы вариант как у VaKiSe, тоже так думаю.
 Один Рег. Накопления, по нему устанавливаем изначально лимиты ПРИХОД, а документ Списание делает РАСХОД по ним с соответствубщенй проверкой на не превышение.
 Только непонятно зачем пункт 4, про это в задаче не сказано, лимит повышать не нужно. На то он и лимит, чтобы один раз установиться.
 Кто что думает еще?

VaKiSe

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: VaKiSe
Задача 2.31
« Ответ #19 : Октябрь 09, 2013, 12:02:56 am »
reckoner, согласен с тобой думаю пункт 4 не нужен. Да и еще, я думаю, что в этой задаче нужна управляемая блокировка, перед запросом к остатку лимита по подразделению. И еще, я дела подразделение доп. сведением, чтобы не вносить в типовую форму документа изменение(хотя реквизит подразделение есть, но он не виден при оплате поставщику)

SanPav

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Александр
Задача 2.31
« Ответ #20 : Октябрь 10, 2013, 03:49:43 pm »
В данной задаче дополнительный регистр не нужен.
 Вполне можно обойтись штатным регистром "Денежные средства к выплате".
 Мой вариант решения:
 1. Использование заявок на расходование ДС в настройках программы включаем.
 2. У банковских счетов разрешаем списание ДС без заявок. Контролировать будем через доп. обработку сами.
 3. Лимиты устанавливаем документами  "Заявки на расходование ДС" для каждого подразделения, где операция = "Прочие расходы", Дата платежа = начало месяца на который устанавливается лимит, а контрагент, счет = предопределенные значения, например, с наименованием "Для лимитов", статья расходов с аналитикой "Подразделение".
 4. Включаем видимость реквизита "Подразделение" в форме документа "Списание безналичных ДС" для операций "Оплата поставщику". Изменения вносятся в процедуру ЗаполнитьИменаРеквизитовПоХозяйственнойОперации модуля менеджера документа. Нужно заполнять для проверки далее.
 5. Создаем подписку на событие проведения документа "Списание безналичных ДС". Где если заявка не заполнена, то проверяем остаток по регистру "Денежные средства к выплате" по предопределенным значениям аналитики учета по партнерам, статье расхода, подразделению, заявке, статье движения ДС и периоду установки.  Сравниваем ее с суммой документа, если все ОК, то списываем сумму документа с этого регистра по проверочным измерениям. Иначе отказ от проведения с соответствующим сообщением об ошибке.
 6. Отчет строим все по тому же штатному регистру  "Денежные средства к выплате".

reckoner

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: reckoner
Задача 2.31
« Ответ #21 : Октябрь 10, 2013, 04:19:28 pm »
Интересно вот что - откуда брать проверяемое подразделение для документа СписаниеБезналичныхДенежныхСредств?
 И еще насколько я понял, все таки нужно использовать типовой регистр, а не создавать свой. Вот к примеру подойдет Движения Денежные средства Контрагент (там есть подразделение).
 Но с другой стороны документ может писать туда РАЗНЫМИ подразделениями. Как тогда реализоывать условие проверки для Заявки на расходование? (оно действует по одному подразделению). Вообщем запутался.

Добавлено (10.10.2013, 16:19)
---------------------------------------------
SanPav,  Можете сделать выкладки кода? Интересует как вы реализовали условия на проверку заполненности Заявки на Расходование в зависимости от введенности лимита.


SanPav

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Александр
Задача 2.31
« Ответ #22 : Октябрь 10, 2013, 04:20:19 pm »
reckoner
 см. п. 4
 регистр используем один = "Денежные средства к выплате". 
 Пробуем сделать по шагам в базе, смотрим движения, и все станет ясно.

VaKiSe

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: VaKiSe
Задача 2.31
« Ответ #23 : Октябрь 10, 2013, 08:51:06 pm »
Кто бы мог подумать! Спасибо,  SanPav!

reckoner

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: reckoner
Задача 2.31
« Ответ #24 : Октябрь 10, 2013, 08:54:13 pm »
Кто-нибудь запилите сам код проверки на превышение лимита.
 Непонятно как это делается у oltie и у Nechipury.

 SanPav, вы хоть и предложили вариант, он мне не очень понятен.

 Вот мой вариант -
 1. Включаем видимость подразделения.
 2. Используем регистр ДвиженияДенежныеСредстваКонтрагент (там есть подразделение). Делаем, чтобы док писал туда подразделение из шапки. (до изменений он пишет из ТЧ)
 3. Проверяем чтобы лимит не был превышен -> Обороты с начала месяца по ДвиженияДенежныеСредстваКонтрагент не превышали наш лимит по подразделению.

 НО, оно мне не нравится. Судя по всему люди в топике по другому решали..

 ---------
 SanPav, поделитесь кодом!
« Последнее редактирование: Октябрь 10, 2013, 09:46:14 pm от reckoner »

SanPav

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Александр
Задача 2.31
« Ответ #25 : Октябрь 12, 2013, 08:40:58 am »

 Подписка на событие проведения документа "Списание безналичных ДС":
  

 Процедура ПроверкаЛимитаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
  
  Если Источник.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ОплатаПоставщику и
   Не ЗначениеЗаполнено(Источник.ЗаявкаНаРасходованиеДенежныхСредств) Тогда
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   | ЗаявкаНаРасходованиеДенежныхСредств.Ссылка
   |ПОМЕСТИТЬ Заявки
   |ИЗ
   | Документ.ЗаявкаНаРасходованиеДенежныхСредств КАК ЗаявкаНаРасходованиеДенежныхСредств
   |ГДЕ
   | ЗаявкаНаРасходованиеДенежныхСредств.Проведен
   | И ЗаявкаНаРасходованиеДенежныхСредств.Организация = &Организация
   | И ЗаявкаНаРасходованиеДенежныхСредств.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаявокНаРасходованиеДенежныхСредств.Утверждена)
   | И ЗаявкаНаРасходованиеДенежныхСредств.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПрочиеРасходы)
   | И ЗаявкаНаРасходованиеДенежныхСредств.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ДляЛимитов)
   | И ЗаявкаНаРасходованиеДенежныхСредств.ДатаПлатежа МЕЖДУ &НачалоПериода И &КонецПериода
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   | ДенежныеСредстваКВыплатеОстатки.ЗаявкаНаРасходованиеДенежныхСредств,
   | ДенежныеСредстваКВыплатеОстатки.СтатьяДвиженияДенежныхСредств,
   | ДенежныеСредстваКВыплатеОстатки.АналитикаУчетаПоПартнерам,
   | ДенежныеСредстваКВыплатеОстатки.ПодотчетноеЛицо,
   | ДенежныеСредстваКВыплатеОстатки.СтатьяРасходов,
   | ДенежныеСредстваКВыплатеОстатки.АналитикаРасходов,
   | -ДенежныеСредстваКВыплатеОстатки.СуммаОстаток КАК СуммаОстаток
   |ИЗ
   | РегистрНакопления.ДенежныеСредстваКВыплате.Остатки(
   |   &ДатаОстатка,
   |   АналитикаРасходов = &Подразделение
   |    И ЗаявкаНаРасходованиеДенежныхСредств В
   |     (ВЫБРАТЬ
   |      Заявки.Ссылка
   |     ИЗ
   |      Заявки КАК Заявки)) КАК ДенежныеСредстваКВыплатеОстатки
   |ИТОГИ
   | СУММА(СуммаОстаток)
   |ПО
   | ОБЩИЕ";
   
   Запрос.УстановитьПараметр("ДатаОстатка", Источник.МоментВремени());
   Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Источник.Дата));
   Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Источник.Дата));
   Запрос.УстановитьПараметр("Организация", Источник.Организация);
   Запрос.УстановитьПараметр("Подразделение", Источник.Подразделение);
   
   Результат = Запрос.Выполнить();
   
   Если Результат.Пустой() Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Нет остатка по лимиту ДС! Оформите заявку на расход ДС.";
    Сообщение.Сообщить();
    Отказ = Истина;
    Возврат;
   КонецЕсли; 
   
   ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
   ВыборкаОбщийИтог.Следующий();  // Общий итог
   
   Если ВыборкаОбщийИтог.СуммаОстаток < Источник.СуммаДокумента Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "Сумма документа = " + Формат(Источник.СуммаДокумента, "ЧДЦ=2")
         + " превышает остаток по лимиту = " + Формат(ВыборкаОбщийИтог.СуммаОстаток, "ЧДЦ=2");
    Сообщение.Сообщить();
    Отказ = Истина;
    Возврат;
   КонецЕсли; 
   
   //Уменьшим доступный остаток по лимиту
   НаборЗаписей = Источник.Движения.ДенежныеСредстваКВыплате;
   НаборЗаписей.Записывать = Истина;
   НаборЗаписей.БлокироватьДляИзменения = Истина;
   
   ОстатокПоДокументу = Источник.СуммаДокумента;
   Выборка = ВыборкаОбщийИтог.Выбрать();
   
   Пока Выборка.Следующий() Цикл
    
    Движение = НаборЗаписей.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Источник.Дата;
    ЗаполнитьЗначенияСвойств(Движение, Выборка);
    
    Если Выборка.СуммаОстаток < ОстатокПоДокументу Тогда
     
     Движение.Сумма = Выборка.СуммаОстаток;
        ОстатокПоДокументу = ОстатокПоДокументу - Выборка.СуммаОстаток;
    Иначе
     Движение.Сумма = ОстатокПоДокументу;
        Прервать;
    КонецЕсли;
   КонецЦикла;
  КонецЕсли;
  
 КонецПроцедуры
  
 Сам отчет:


Вложения:
7708093.erf

samson12

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Юрий
Задача 2.31
« Ответ #26 : Октябрь 24, 2013, 10:22:37 pm »
Добрый день! Что то не работает ваш код. Ошибка возникает в момент перепроведения документа Списание денежных средств. Программа пишет, что менеджер временных таблиц не обнаружен!. Может что-нибудь ещё надо было сделать, кроме как добавить в модуль менеджера строку для подразделения?

Avet

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Аветис
Задача 2.31
« Ответ #27 : Октябрь 30, 2013, 05:05:25 pm »
« Последнее редактирование: Октябрь 30, 2013, 05:27:30 pm от Аветис »

brazil

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Бразил
Задача 2.31
« Ответ #28 : Ноябрь 14, 2013, 12:11:14 pm »
ключевые моменты: остатки лимитов не переходят на следующий месяц, оплата поставщику, безналичный расчет.

 ошибки в решениях (на мой взгляд):
  - получение информации не из регистров, а из реквизитов документов (в отчетах, в функциях), например у SanPav . При сдаче платформы  это было бы сразу НЕ сдача.
  - не сведение остаточного регистра в ноль (в некоторых решениях есть попытки выхода в ноль).
  - использовании РН."Движение средства к выплате", без проверки реквизитов регистратора невозможно определить способ оплаты (нал/безнал)

 пока вижу два решения:
 1. РС.Лимиты,
     Суммы сверх лимитов (т.е. по заявкам) - берем из РН."Движение средства к выплате".Обороты(Периодичность=Регистратор) где регистратор=СписаниеБезналки
     Сумма в рамках лимита = Сумма по РН."Движение средств контрагент".Оборот(хоз.опер=оплата пост, тип ден средств=безнал) - Суммы сверх лимитов
 Заставить Документ.СБДС заполнять измерение Подразделение в РН."Движение средств контрагент" при незаполненной заявке.
 Почему-то этот вариант не нравиться.

 2. Все завязываем на новый РН.ОБОРОТНЫЙ "Бюджет" с измерением ТипДвижения=Лимит/СуммаПоЛимиту/СуммаПоЗаявке. новый документ делает движения по лимиту. Документ.СБДС -по суммам в зависимости от заполнения.
 это решение более гибкое к дальнейшим хотелкам клиента.

Nathalie

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Nathalie
Задача 2.31
« Ответ #29 : Ноябрь 18, 2013, 08:28:33 pm »
brazil, для этой задачи нужно использовать существующие регистры.