Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
17 Дек 2017, 09:05
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Списание по партиям - дополните код  (Прочитано 3917 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн qwedor

  • *
  • Сообщений: 17
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 1С
Вот написал код. вроде как работает но не полностью.

При условии что Количество в документе товара меньше чем в партии  - проблем нету. а если больше?

ДЛя Каждого СтрокаТовары ИЗ ТаблицаТоваров Цикл
ОсталосьСписать =СтрокаТовары.КоличествоВдокументе;

Для каждого СтрокаПартии Из Партии Цикл

Если СтрокаТовары.Номенклатура = СтрокаПартии.Номенклатура  Тогда

Если ОсталосьСписать <= СтрокаПартии.КоличествоОстаток  Тогда
КолСписание = ОсталосьСписать;

Если ОсталосьСписать =  СтрокаПартии.КоличествоОстаток
ТОгда
СуммаСписания =  СтрокаПартии.СтоимостьОстаток;
Иначе
СуммаСписания = СтрокаПартии.СтоимостьОстаток / СтрокаПартии.КоличествоОстаток *  СтрокаТовары.КоличествоВдокументе;
КонецЕсли;

СтрокаПартии.КоличествоОстаток = СтрокаПартии.КоличествоОстаток - СтрокаТОвары.КоличествоВДокументе;
СтрокаПартии.СтоимостьОстаток = СтрокаПартии.СтоимостьОстаток - СуммаСписания;
ОсталосьСписать = ОсталосьСписать - КОлСписание;
Иначе
ЧТО ТУТ НАПИСАТЬ?

Помогите с выражением. заранее Спасибо.

прилагаю полный листинг.:


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

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

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




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

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

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


ДЛя Каждого СтрокаТовары ИЗ ТаблицаТоваров Цикл
ОсталосьСписать =СтрокаТовары.КоличествоВдокументе;

Для каждого СтрокаПартии Из Партии Цикл

Если СтрокаТовары.Номенклатура = СтрокаПартии.Номенклатура  Тогда

Если ОсталосьСписать <= СтрокаПартии.КоличествоОстаток  Тогда
КолСписание = ОсталосьСписать;

Если ОсталосьСписать =  СтрокаПартии.КоличествоОстаток
ТОгда
СуммаСписания =  СтрокаПартии.СтоимостьОстаток;
Иначе
СуммаСписания = СтрокаПартии.СтоимостьОстаток / СтрокаПартии.КоличествоОстаток *  СтрокаТовары.КоличествоВдокументе;
КонецЕсли;

СтрокаПартии.КоличествоОстаток = СтрокаПартии.КоличествоОстаток - СтрокаТОвары.КоличествоВДокументе;
СтрокаПартии.СтоимостьОстаток = СтрокаПартии.СтоимостьОстаток - СуммаСписания;
ОсталосьСписать = ОсталосьСписать - КОлСписание;
Иначе
ЧТО ТУТ НАПИСАТЬ?














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

//Регистр Продажи

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





КонецЕсли;


КонецЦикла;


КонецЦикла;


Оффлайн Besart

  • *****
  • Сообщений: 678
  • РЕПУТАЦИЯ: 142
  • КПД: 21%
  • Регистрация: 2012-12-10
    • Skype: artfa.a
  • Компания: Фрилансер
  • Профессия: Программист 8.1
смотрите тут, там во многих задачах есть списание по партиям

Оффлайн qwedor

  • *
  • Сообщений: 17
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 1С
Спасибо, нашел решение :zebzdr:.  правда немного другим вариантом.
Осталось конечно еще вопросы :)

Оффлайн qwedor

  • *
  • Сообщений: 17
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 1С
добрый день.Задачу  то я решил но у меня возник вопрос. Все работает. и правильно считает. 

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

Пока ВыборкаНоменклатура.Следующий() Цикл
Если НЕ ВыборкаНоменклатура.Номенклатура.Услуга Тогда


Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда


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


  НеобходимоСписать = ВыборкаНоменклатура.Количество;
 
  ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() И НеобходимоСписать > 0 Цикл

КоличествоКСписанию = Мин(НеобходимоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);


Если

КоличествоКСписанию = ВыборкаДетальныеЗаписи.КоличествоОстаток
Тогда
   СуммаКСписанию = ВыборкаДетальныеЗаписи.СтоимостьОстаток;
   Иначе
   СуммаКСписанию = ВыборкаДетальныеЗаписи.СтоимостьОстаток / ВыборкаДетальныеЗаписи.КоличествоОстаток * КоличествоКСписанию;
   КонецЕсли;

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


// Вот тут
НеобходимоСписать = НеобходимоСписать - КоличествоКСписанию;

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



Если я удалю строку :
        
// Вот тут
НеобходимоСписать = НеобходимоСписать - КоличествоКСписанию;

Списывает с каждой партии по количеству (например 2 партии по 20 штук у меня. продаю 5 штук. - спишет 5 с каждой.  в итоге - остаток 10..:wacko:)
С этой строкой - все в порядке. но в движениях у меня отсутствует: "НеобходимоСписать".
как же оно влияет на движения?
"

Оффлайн l2qwe

  • *
  • Сообщений: 20
  • РЕПУТАЦИЯ: 5
  • КПД: 25%
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 8.1
Может вывести продажу за внутренний цикл?

   
	
ПродажаКоличество = 0;
ПродажаСумма  = 0;
ПродажаСебестоимость = 0;

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

// Движения  для Регистров Остатки ТОваров и Продажи для Не Услуги       

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

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

Оффлайн qwedor

  • *
  • Сообщений: 17
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 1С
Может вывести продажу за внутренний цикл?

так тоже может. но у меня тоже все работает. но я не могу понять значение этой строки:

        
// Вот тут
НеобходимоСписать = НеобходимоСписать - КоличествоКСписанию;

Если  она есть - все работает, в противном случае:
Списывает с каждой партии по количеству (например 2 партии по 20 штук у меня. продаю 5 штук. - спишет 5 с каждой.  в итоге - остаток 10..:wacko:)

Оффлайн l2qwe

  • *
  • Сообщений: 20
  • РЕПУТАЦИЯ: 5
  • КПД: 25%
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 8.1
Эта строка определяет сколько осталось списать.

То есть надо нам списать 17 пимпачек
Есть 3 партии (4,40,20)
Таким образом у нас внутренний цикл максимум 3 прохода
Но мы должны списать (4,(17-4) = 13 ,0)
На второй итерации мы видим что остаток большем чем нам необходимо списать, досписываем остаток (13) и сбрасывем в 0 после чего по условию цикла мы выходим
НеобходимоСписать > 0

Оффлайн qwedor

  • *
  • Сообщений: 17
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-03-28
  • Сайт: 
  • Профессия: Программист 1С
так стало яснее, спасибо :ooifh:


Теги:
 

Цена не вставляется в документ "Списание "

Автор TanyaXРаздел Пользователям "1С - Предприятие 8"

Ответов: 2
Просмотров: 158
Последний ответ 14 Ноя 2017, 23:44
от Геннадий ОбьГЭС
Документ "Списание товаров" в Комплексной автоматизации

Автор Mar@tinРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 2552
Последний ответ 02 Июл 2014, 11:30
от Mar@tin
Некорректно заполнено поле "Ведомость" при начислении ЗП - списание с расч.счета

Автор iDimiOРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 7681
Последний ответ 26 Мар 2015, 14:46
от iDimiO
Чем отличается документ «Платежное поручение исходящее» от документа «Платежный ордер на списание денежных средств»?

Автор Prosto_DenisРаздел Пользователям "1С - Предприятие 8"

Ответов: 2
Просмотров: 364
Последний ответ 04 Сен 2017, 06:26
от Prosto_Denis
Списание основных средств, выбывших из-за пожара, не могут стать причиной восстановления по ним НДС

Автор newsРаздел Новости

Ответов: 0
Просмотров: 1829
Последний ответ 11 Авг 2014, 12:49
от news

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

Смотрите бесплатно более 300 видеоуроков по работе в 1С:Бухгалтерия 8 и 1C:ЗУП 8 ред. 3.0

СМОТРЕТЬ >>

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
145 Сообщений
ilyay ilyay
63 Сообщений
AIFrame
50 Сообщений
alex0402
50 Сообщений
andron81_81
44 Сообщений
oleg-x
42 Сообщений
BuhRust
32 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
24 Сообщений

* Кто онлайн

  • Точка Гостей: 178
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal