8.х Партионный учет

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем PavelBaryshev, 9 окт 2009.

  1. TopicStarter Overlay
    PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте, помогите пожалуйста создать проведение документа "Расходная". У меня задание: на пустой конфе организовать партионный учет, я сделал справочник номенклатура, регистр "ОстаткиНоменклатуры" с реквизитами склад, партия(ссылка на док "Приходная"), номенклатура, и ресурсы количество и сумма. Создал перечисление "УчетнаяПолитика" со значениями "ФИФО и ЛИФО", и константу "СписаниеТоваров" где выбираются значения из этого перечисления. Движение док "Приходная" я сделал:
    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    // регистр ОстаткиНоменклатуры Приход
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Партия = Ссылка;
    Движение.Склад = Склад;
    Движение.Номенклатура = ТекСтрокаТовары.товар;
    Движение.Количество = ТекСтрокаТовары.Количество;
    Движение.Сумма = ТекСтрокаТовары.Сумма;
    КонецЦикла;
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры
    
    Теперь осталось сделать движение "Расходная", а как я не знаю. Помогите пожалуйста?
  2. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Найдите любую книжку по программированию в 1С. Там очень любят этот пример.
  3. TopicStarter Overlay
    PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Уже сделал спасибо.

    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    
    Если НЕ ЗначениеЗаполнено(Склад) Тогда
    Сообщить("Необходимо указать склад!", Статуссообщения.Важное);
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    
    Если тчНоменклатураДокумента.Количество() = 0 Тогда
    Сообщить("Укажите номенклатуру для списания", Статуссообщения.Важное);
    Отказ = Истина;
    Возврат;
    КонецЕсли;	 
    
    РегПоследн = РегистрыСведений.МетодСписанияСебестоимости.ПолучитьПоследнее(Дата);
    текМетодСписания = РегПоследн.ТекущийМетодСписания;
    темпТчНоменклатура = ТчНоменклатураДокумента.Выгрузить();
    темпТчНоменклатура.Свернуть("Номенклатура","Количество");
    спкНоменклатрурыДокумента = темпТчНоменклатура.ВыгрузитьКолонку("Номенклатура");
    
    тктУпорядочитьПо = ?(текМетодСписания = Перечисления.МетодСписания.ЛИФО,"УБЫВ","");
    СписаниеПоСреднему = ?(текМетодСписания = Перечисления.МетодСписания.ПоСредней,Истина,Ложь);
    
    Запрос = Новый Запрос;
    
    Запрос.Текст = "ВЫБРАТЬ
    |	НоменклатураВДокументе.Номенклатура КАК Номенклатура,
    |	СУММА(ЕСТЬNULL(ПартииНаСкладеОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
    |	СУММА(ЕСТЬNULL(ПартииНаСкладеОстатки.СтоимостьОстаток, 0)) КАК СтоимостьОстаток,
    |	СУММА(НоменклатураВДокументе.Количество) КАК КоличествоВДокументе,
    |	ПартииНаСкладеОстатки.Партия КАК Партия
    |ИЗ
    |	Документ.Расход.тчНоменклатураДокумента КАК НоменклатураВДокументе
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииНаСкладе.Остатки(
    |				&МоментВремени,
    |				Склад = &текСклад
    |					И Номенклатура В (&спкНоменклатуры)) КАК ПартииНаСкладеОстатки
    |		ПО (ПартииНаСкладеОстатки.Номенклатура = НоменклатураВДокументе.Номенклатура)
    |ГДЕ
    |	НоменклатураВДокументе.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |	НоменклатураВДокументе.Номенклатура,
    |	ПартииНаСкладеОстатки.Партия
    |
    |УПОРЯДОЧИТЬ ПО
    |	Номенклатура,
    |	Партия  "+тктУпорядочитьПо+"
    |ИТОГИ
    |	СУММА(КоличествоОстаток),
    |	СУММА(СтоимостьОстаток),
    |	МАКСИМУМ(КоличествоВДокументе)
    |ПО
    |	Номенклатура";
    
    Запрос.УстановитьПараметр("МоментВремени",МоментВремени());
    Запрос.УстановитьПараметр("текСклад",Склад);
    Запрос.УстановитьПараметр("спкНоменклатуры",спкНоменклатрурыДокумента);
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    
    Резлт = Запрос.Выполнить(); 
    
    выбркНоменкл = Резлт.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
    
    Пока  выбркНоменкл.Следующий() Цикл
    
    Если выбркНоменкл.КоличествоВДокументе = 0 Тогда 
    Сообщить("По номенклатуре """+выбркНоменкл.Номенклатура+""" указано нулевое количество расхода! Проверьте правильность заполнения документа",
    Статуссообщения.Важное);
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    
    Если (выбркНоменкл.КоличествоВДокументе > выбркНоменкл.КоличествоОстаток) Тогда
    Сообщить("По номенклатуре """+выбркНоменкл.Номенклатура+""" указанное количество превышает остаток по всем партиям на складе",
    Статуссообщения.Важное);
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    
    темпТекНоменкл = выбркНоменкл.Номенклатура;
    всегоНаСкладе = выбркНоменкл.КоличествоОстаток;
    стоимВсегоНаСкладе = выбркНоменкл.СтоимостьОстаток;
    ЦенаПоВсемПартиям = стоимВсегоНаСкладе / всегоНаСкладе;
    стркВДокументе = темпТчНоменклатура.Найти(темпТекНоменкл,"Номенклатура");
    колВДокументе = стркВДокументе.Количество;
    
    колНужноСписать = колВДокументе;
    Если колВДокументе = всегоНаСкладе Тогда
    СтоимНужноСписать = стоимВсегоНаСкладе;
    Иначе
    СтоимНужноСписать = ЦенаПоВсемПартиям * колВДокументе;
    КонецЕсли;
    
    выбркПартии = выбркНоменкл.Выбрать();
    
    Пока выбркПартии.Следующий() Цикл
    темпТекПартия = выбркПартии.Партия;
    колВПартии = выбркПартии.КоличествоОстаток;
    стоимВПартии = выбркПартии.СтоимостьОстаток;
    колСписаноПоПартии = Мин(колВПартии,колНужноСписать);
    
    Если колСписаноПоПартии = колВПартии Тогда
    стоимСписаноПоПартии = выбркПартии.СтоимостьОстаток;
    Иначе
    стоимСписаноПоПартии = ?(СписаниеПоСреднему,Мин(стоимВПартии,СтоимНужноСписать),
    (выбркПартии.СтоимостьОстаток / выбркПартии.КоличествоОстаток)*колСписаноПоПартии);
    КонецЕсли;
    
    Движение = Движения.ПартииНаСкладе.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Номенклатура = темпТекНоменкл;
    Движение.Партия = темпТекПартия;
    Движение.Период = Дата;
    Движение.Склад = Склад;
    Движение.Количество = колСписаноПоПартии;
    Движение.Стоимость = стоимСписаноПоПартии;
    
    колНужноСписать = колНужноСписать - колСписаноПоПартии;
    СтоимНужноСписать = СтоимНужноСписать - стоимСписаноПоПартии;
    
    Если (колНужноСписать = 0) И (НЕ СписаниеПоСреднему ИЛИ (СтоимНужноСписать = 0)) тогда
    Прервать
    КонецЕсли;
    КонецЦикла;	 
    
    КонецЦикла;	 
    
    КонецПроцедуры
    
Похожие темы
  1. Tanya
    Ответов:
    5
    Просмотров:
    4.491
  2. Morgan_MK
    Ответов:
    1
    Просмотров:
    1.224
  3. bolonka
    Ответов:
    2
    Просмотров:
    753
  4. TerANik
    Ответов:
    2
    Просмотров:
    1.142
Загрузка...

Поделиться этой страницей