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

Для Измерения «Номенклатура» также выставим флаг «Запрет незаполненных значений».
Как принято, для Ресурса Сумма Тип «Число» точность «2».
Во-вторых настраиваем Документ «Приходная накладная». Добавим Недостающие данные. Перейдет на вкладку «Данные».

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

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

И вот еще, изменим код Обработки Проведения.
После кода:
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Вставим Запрос.
Запрос=новый запрос;
Запрос.Текст=" ";
Кроме того, установим курсом между двумя Символами («). И вызовем конструктор запроса.
Во-первых выберем таблицы и поля.

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

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

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

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