пятница, 19 июня 2015 г.

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

На мой взгляд единственная сложность этой задачи в ее простоте, как бы не парадоксально это не звучало. В условии задачи явно не сказано о том, что нужны документы "Перемещение" или "Сборка". Исходя из этого предполагаю что разработчик на свое усмотрение выбирает способ решения. В моем решении будет все максимально просто только 2 документа "Расходная накладная" для продажи и "Операция" для всего остального.

1) Добавляем недостающий справочник "Склады". Добавляем предопределенное  значение "Центральный склад". В справочник "Номенклатура" добавляем булевый реквизит "Это Компьютер".
2) ПВХ "Виды субконто". 

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

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


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




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

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

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
ПакетРезультатов = Запрос.ВыполнитьПакет();

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

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

Блокировка.Заблокировать(); 


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

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

ПакетРезультатов = Запрос.ВыполнитьПакет();

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


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


КонецЦикла;
КонецЕсли;

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


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

КонецЦикла;
КонецЕсли;


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



7) Отчеты
Отчет по остаткам не требует комментариев,  кроме того что в плане счетов у нас нет субконто "Склад" у счета "материалы", но по условию задачи материалы есть только на одном центральном складе, поэтому может решить вопрос объединением таблиц и у таблицы материалов через параметр установить склад равный предопределенному значению.


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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
&Центр,
УправленческийОстатки.Субконто1,
УправленческийОстатки.КоличествоОстаток,
УправленческийОстатки.СуммаОстаток
ИЗ

РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Материалы), , ) КАК УправленческийОстатки

Отчет о продажах построим на счете "ПрибылиУбытки"

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

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


В решении реализованы проверки на то чтобы в документе "Операция" не давать оприходовать  комплектующие на склад отличный от центрального.


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

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