четверг, 18 июня 2015 г.

1с Специалист. Ршение задачи 2.36

Решение:
Для решения задачи задействуем следующие объекты:

1) Добавляем недостающие справочники "Организации" и "склады".
2) ПВХ "Виды субконто". 

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

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

7) Переходим к Расходной накладной.

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

Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();

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


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


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


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


ВыборкаНом = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
Пока ВыборкаНом.Следующий() Цикл
Нехватка = ВыборкаНом.ОстатокКол - ВыборкаНом.КолДок;
Если Нехватка < 0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара "+ ВыборкаНом.Номенклатура +" в количестве " + (-Нехватка);
Сообщение.Сообщить();
Продолжить;
КонецЕсли;

ОсталосьСписать = ВыборкаНом.КолДок;
Выборка = ВыборкаНом.Выбрать();
Пока Выборка.Следующий() И ОсталосьСписать>0  Цикл
КСписанию = Мин(ОсталосьСписать, Выборка.ОстатокКол);

Движение = Движения.Управленческий.Добавить();
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.КоличествоКт = КСписанию;
Движение.Сумма = КСписанию * (Выборка.ОстатокСум/Выборка.ОстатокКол);
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНом.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности;

ОсталосьСписать = ОсталосьСписать -КСписанию;
КонецЦикла;
КонецЦикла;


Движение = Движения.Управленческий.Добавить();
Движение.Организация = Организация;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.Период = Дата;
Движение.Сумма = СуммаПоДокументу;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;


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


8) Переходим к отчету.


ВЫБРАТЬ
УправленческийОборотыДтКт.Организация,
УправленческийОборотыДтКт.СубконтоДт1 КАК Контрагент,
УправленческийОборотыДтКт.СуммаОборот
ИЗ
РегистрБухгалтерии.Управленческий.ОборотыДтКт(, , , СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели), , СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ПрибылиУбытки), , ТИПЗНАЧЕНИЯ(СубконтоДт1) = ТИП(Справочник.Организации)) КАК УправленческийОборотыДтКт


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

Скачать решение задачи 2.36



Комментариев нет:

Отправить комментарий