Имя: Пароль:
1C
1С v8
задача 1.7. специалист
0 wwwqwert2014
 
22.05.13
17:56
Решаю задачу 1.7 из сборника задач по платформе 8.2.

вот условие задачи
Компания занимается оптовой торговлей. Поступление товаров отражается
документом «Приходная накладная», продажа - «Расходная накладная». Помимо
продажи товара, могут оказываться дополнительные услуги, например по доставке.
И услуги и товары указываются в одной табличной части.
Учет товаров ведется в разрезе складов. Поступление и продажа
осуществляются с указанием склада (в шапке документа).
При проведении документа «Расходная накладная» необходимо
производить только списание товара со склада. В том случае, когда товара не
хватает, документ проводиться не должен. Расчет себестоимости списанного товара
должен происходить позднее с помощью регламентной обработки «Расчет
себестоимости». Запуск этой обработки должен происходить автоматически с
использованием регламентного задания, но может быть произведен и вручную по
желанию пользователя. Обработка должна автоматически определять самый первый
документ, нуждающийся в расчете себестоимости, и рассчитывать себестоимость
для всех остальных документов начиная с него.
Списание себестоимости должно быть организовано по партиям, в
зависимости от текущего значения принятого на этот год в учетной политике
метода списания себестоимости (FIFO или LIFO). Еще раз подчеркивается - учетная
политика действует год. На следующий год метод списания может смениться.
Для расчета себестоимости при списании товара необходимо учитывать
только момент поступления товара в компанию, вне зависимости от того, на какой
склад он пришел. Предположим, для метода списания FIFO первое поступление
портсигара произошло на склад «Основной» документом «Приходная накладная
№1», а потом на склад «Транзитный» документом «Приходная накладная №2». В
этом случае при продаже товара со склада «Транзитный» в первую очередь должна
быть списана себестоимость портсигара по документу «Приходная накладная №1»,
так как она пришла раньше Необходимо построить отчет по продажам товаров за
период и остаткам товара по складам на указанную дату.









все вроде понятно, да и сделал я почти все, за исключением следующего абзаца:

Для расчета себестоимости при списании товара необходимо учитывать
только момент поступления товара в компанию, вне зависимости от того, на какой
склад он пришел. Предположим, для метода списания FIFO первое поступление
портсигара произошло на склад «Основной» документом «Приходная накладная
№1», а потом на склад «Транзитный» документом «Приходная накладная №2». В
этом случае при продаже товара со склада «Транзитный» в первую очередь должна
быть списана себестоимость портсигара по документу «Приходная накладная №1»,
так как она пришла раньше Необходимо построить отчет по продажам товаров за
период и остаткам товара по складам на указанную дату.

Алгоритм расчета себестоимости я так до конца и не смог продумать. Может подскажете?
Я думаю как-то так надо делать:
Взять таблицу ОстаткиНоменклатуры и выбрать из нее через ГДЕ те записи, у которых ОстаткиНоменклатуры.Себестоимость = НЕОПРЕДЕЛЕНО;
Далее её помещаю во временную таблицу ВТ_ДляРасчета.
Следующим этапом соединяю её с таблицей ОстаткиНомнклатурыОстаткиИОбороты по полям Номенклатура, Склад, Партия. И дальше по сути надо проверять:
Если расход номенклатуры по партии равен остаткам (списалась вся партия), тогда нужно в себестоимость расхода перенести всю себестоимость из остатков.
В противном случае надо считать: себестоимостьРасхода = СебестоимостьОстатков*КоличествоРасхода/КоличествоОстатков. Это надо сделать, чтобы регистр выводился в 0 и не было проблемы копеек.
А вот как это сделать, я до конца понять не могу. Наверно Это все надо взять из ОстаткиНоменклатурыОстаткиИОбороты, брать на текущую дату и к этой дате прибавить 1 секунду (чтобы остатки просчитались).
Вот DT-шник, что я начал делать.
http://zalil.ru/34523173
1 wwwqwert2014
 
22.05.13
17:57
а вот начал запрос составлять.
Процедура Рассчитать () Экспорт
   
   //узнаем текущую ценовую политику
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    УчетнаяПолитикаСрезПоследних.ТекущаяУчетнаяПолитика
       |ИЗ
       |    РегистрСведений.УчетнаяПолитика.СрезПоследних(&ТекущаяДата, ) КАК УчетнаяПолитикаСрезПоследних";

   Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

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

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

   ТекущаяУчетнаяПолитика = "";

   Если Не ВыборкаДетальныеЗаписи.Следующий() Тогда
       // Вставить обработку выборки ВыборкаДетальныеЗаписи
       
       Сообщить("Не выбрана учетная политика");
       Отказ = Истина;
       Возврат;
   Иначе
       Если ВыборкаДетальныеЗаписи.ТекущаяУчетнаяПолитика = Перечисления.УчетнаяПолитика.ЛИФО Тогда
           ТекущаяУчетнаяПолитика = " УБЫВ";
       КонецЕСли;
   КонецЕсли;

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

   Запрос.УстановитьПараметр("ДатаОкончания", ТекущаяДата());

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

   ВыборкаПартия = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

   Пока ВыборкаПартия.Следующий() Цикл//цикл по партиям
       // Вставить обработку выборки ВыборкаПартия

       ВыборкаДетальныеЗаписи = ВыборкаПартия.Выбрать();

       Пока ВыборкаДетальныеЗаписи.Следующий() Цикл //внутри партий проходим по номенклатуре
           // Вставить обработку выборки ВыборкаДетальныеЗаписи
       КонецЦикла;
   КонецЦикла;

   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА


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


подскажите, пожалуйста
2 zak555
 
22.05.13
18:07
> Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.

> При проведении документа «Расходная накладная» необходимо
производить только списание товара со склада.

факт продажи услуги не надо отражать ?
3 Relader
 
22.05.13
18:48
2 + 2 = 3.9999999999999999999999999999999...