Записки программиста 1с

Приходная накладная в 1с

Приходная накладная в 1с присутствует в большинстве задач экзамена 1С:Специалист по платформе.

Рассмотрим пример реализации Документа «Приходная накладная» для решения экзамена 1С:Специалист по платформе.

Для решение будем использовать каркасную конфигурацию специально разработанную для сдачи экзамена 1С:Специалист по платформе.

Текст задачи:

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

Разумеется, Настройка учетной политики описана в статье: «Как настроить учетную политику в 1с«.

Решение

Во-первых в регистр накопления добавляем недостающие данные. Измерение Партия и Ресурс Сумма.

Приходная накладная в 1с
Настройка измерения Партия

Для Измерения «Номенклатура» также выставим флаг «Запрет незаполненных значений».

Как принято, для Ресурса Сумма Тип «Число» точность «2».

Во-вторых настраиваем Документ «Приходная накладная». Добавим Недостающие данные. Перейдет на вкладку «Данные».

Приходная накладная в 1с
Данные Приходной накладной

В-третьих измененям процедуру проведения документа «Приходная накладная» 1с. Воспользуемся конструктором движений и заполним поля согласно картинки ниже.

Приходная накладная в 1с
Настройка движения Документа «Приходная накладная».

После нажатия кнопки «ОК» в Обработке Проведения создастся следующий код:

Приходная накладная в 1с
Код обработки Проведения Документа «Приходная накладная».

И вот еще, изменим код Обработки Проведения.

После кода:

Движения.ОстаткиНоменклатуры.Записывать = Истина;

Вставим Запрос.

Запрос=новый запрос;
Запрос.Текст=" ";

Кроме того, установим курсом между двумя Символами («). И вызовем конструктор запроса.

Во-первых выберем таблицы и поля.

Конструктор запроса в 1с
Конструктор запроса Вкладка Таблицы и поля.

Во-вторых настроим Группировку.

Группировка в Конструкторе запросов
Группировка

В-третьих установим условие:

Условие в запросе
Условие

Добавляем код, предназначенный для задания параметра:

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

Кроме того, определяем выборку из запроса.

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

Применяем цикл.

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

	конеццикла;
Приходная накладная в 1с
Полный код процедуры Обработка Проведения.
Код прописывается в модуле объекта


Процедура ОбработкаПроведенияПриход()Экспорт

	Движения.ОстаткиНаСкладах.Записывать = Истина;
		Движение = Движения.ОстаткиНаСкладах.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Номенклатура = ГотоваяПродукция;
		Движение.Склад = Справочники.Склады.ГотовойПродукции;
		Движение.Количество = 1;
		Движение.Сумма = 100;
		Движения.Записать();
		//КонецЦикла;

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


Процедура ОбработкаПроведенияРасход()Экспорт

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

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


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

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









+что должно быть в модуле формы 


&НаСервере
Процедура ЭтапыПроизводстваПриИзмененииНаСервере()
	ДокументОбъект=РеквизитФормыВЗначение("Объект");
	ДокументОбъект.ОбработкаПроведенияПриход(); 
	ДокументОбъект.ОбработкаПроведенияРасход();

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

&НаКлиенте
Процедура ЭтапыПроизводстваПриИзменении(Элемент)
Если Объект.ЭтапыПроизводства=ПредопределенноеЗначение("Перечисление.ЭтапыПроизводтсва.Завершен") Тогда

ЭтапыПроизводстваПриИзмененииНаСервере();
	

КонецЕсли;	
	КонецПроцедуры


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

&НаКлиенте
Процедура ТрудозатратыВидРаботыПриИзменении(Элемент) 
	Строка=Элементы.Трудозатраты.ТекущиеДанные;
	Строка.СтоимостьЧаса= ТрудозатратыВидРаботыПриИзмененииНаСервере(Строка.ВидРаботы);
КонецПроцедуры

&НаКлиенте
Процедура ТрудозатратыСтоимостьЧасаПриИзменении(Элемент)
	Строка=Элементы.Трудозатраты.ТекущиеДанные; 
	Строка.Сумма=Строка.СтоимостьЧаса*Строка.ВремяВыполнения;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

Объект.СуммаПоДок=Объект.Трудозатраты.Итог("Сумма");
конецпроцедуры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *