пятница, 13 февраля 2015 г.

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


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

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

4) Обработка проведения "Приходной накладной".

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

Обратите внимание на получение поле количество, страховка от того что нет данных о единице измерения в  регистре сведений. тогда считаем что коэффициент как будто =1;

ВЫБОР
КОГДА ЕСТЬNULL(КоэффициентыЕИ.Коэффициент, 0) = 0
ТОГДА ДокТЧ.Количество * 1
ИНАЧЕ ДокТЧ.Количество * КоэффициентыЕИ.Коэффициент
КОНЕЦ КАК Количество


5) Расходная накладная

Реализуем видимость колонок согласно условия.

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПолучательЭтоСклад() Тогда
Элементы.СписокНоменклатурыСумма.Видимость = Ложь;
Элементы.СписокНоменклатурыЦена.Видимость = Ложь;
Иначе
Элементы.СписокНоменклатурыСумма.Видимость = Истина;
Элементы.СписокНоменклатурыЦена.Видимость = Истина
КонецЕсли;
КонецПроцедуры

Функция ПолучательЭтоСклад()
Если ТипЗнч(Объект.Получатель) = Тип("СправочникСсылка.Склады") Тогда
Возврат Истина
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции



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

6) Документ "Распределение".


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

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

6) Отчет "Продажи".

ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.Документ КАК Накладная,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.СуммаОборот КАК Продажа,
ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
ПродажиОбороты.СуммаОборот - ПродажиОбороты.СебестоимостьОборот КАК Прибыль
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПродажиОбороты


Все БЕСПЛАТНЫЕ курсы по работе в 1С:УТ 11.1


Вы можете скачать бесплатные видеокурсы по работе в 1С:УТ 11.1 перейдя по ссылке 








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

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