вторник, 17 февраля 2015 г.

1с специалист задача 1.19


Решение:

Это действительно интересная задача. Аналоги... как же это организовать? Взяв на вооружение логику и учитывая что эту задачу нужно решить в кратчайшие сроки реализуем самым простым способом: добавим регистр сведений "Аналоги" с измерениями "Номенклатура" и "аналог" без ресурсов.
Добавим справочник "склады" и добавим реквизиты этого типа в "документы" и регистр "Остатки номенклатуры".
Для отчета потребуется создать оборотный регистр "продажи" с измерениями "Номенклатура", "аналог" и ресурсами "Себестоимость" и "Продано".\
Добавим реквизит "артикул" в справочник "номенклатура".
Заполним регистр сведений начальными данными


Затем с помощью конструктора напишем обработку проведения приходной накладной.

Переходи к обработке проведения расходной накладной.
Не забываем очистить движения и установить блокировки для начала.
План запроса будет такой
1) Получим временную таблицу по данным табличной части текущего документа. (ДокТЧ)
2) Получим временную таблицу аналогов (Аналоги) состоящую из 3-х полей "Номенклатура", "Аналог", "Приоритет". Эту таблицу получим путем соединения ДокТЧ (аналог = номенклатуре) и левого соединения таблицы ДокТЧ с регистром сведений "Аналоги". (Отсюда модем вытянуть аналог).
3) В итоговой таблице добавим 3  таблицы (ДокТЧ, Аналоги и таблицу остатков регистра "ОстаткиНоменклатуры". Установим связи этих таблиц и на закладке "Итоги" укажем итоги по номенклатуре, на закладке "порядок" укажем упорядочение по приоритету и артикулу.
Далее обработка результата запроса вполне стандартна и понятна.

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

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

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

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

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

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

// продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
Движение.Аналог = Выборка.Аналог;
Движение.Себестоимость = Себестоимость * Списываем;
Движение.Продажа = Списываем*Выборка.СуммаДок/Выборка.КолДок;
Движение.Количество = Списываем;

ТребуетсяСписать = ТребуетсяСписать- Списываем;
КонецЦикла;
КонецЕсли;

КонецЦикла;




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

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


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

1 комментарий:

  1. Хорошее решение. Довольно компактное. А, вот, если, в дополнение, требуется партионный учет и списание по партиям в соответствии с учетной политикой?..

    ОтветитьУдалить