четверг, 26 марта 2015 г.

1c специалист. Задача 2.27

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

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

 5) Переходим к Приходной накладной.

При решении задания решил использовать вспомогательный регистр "Остатки номенклатуры" для демонстрации методики  оперативного проведения.
  • С помощью конструктора движений формируем обработку проведения.


Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Управленческий.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записывать = Истина;

Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество;

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

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаПоДокументу = СписокНоменклатуры.Итог("Сумма");

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

6) Потребуется регистр сведений "Состав комплекта"
Добавляем проверку чтобы выполнялось условие задачи (Комплект не может быть частью другого комплекта)

&НаКлиенте
Процедура НоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ВыбранноеЗначение.ЭтоКомплект Тогда 
СтандартнаяОбработка = Ложь;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Комплект не может быть выбран";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры


7) Переходим к "Сборке".

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

&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры

Запретим пользователям в поле комплект выбирать не комплекты

&НаКлиенте
Процедура КомплектОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если Не ВыбранноеЗначение.ЭтоКомплект Тогда 
СтандартнаяОбработка = Ложь;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Необходимо выбрать комплект";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры


  • Пишем процедуру проведения.

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

Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать();


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

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


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

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



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



Если  Отказ Тогда 
Возврат;
КонецЕсли;


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

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

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

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

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


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

СГРУППИРОВАТЬ ПО
УправленческийОборотыДтКт.СубконтоДт3,
УправленческийОборотыДтКт.СубконтоДт2


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

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

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