Задача 1. Управленческий учет
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа — «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.
Складской учет товаров не ведется.
При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ.
Списание себестоимости товаров должно быть организовано по партиям, в зависимости от текущего значения принятого на этот год в учетной политике метода списания себестоимости (FIFO или LIFO). Еще раз подчеркивается — учетная политика действует год. На следующий год метод списания может смениться.
Необходимо построить отчет по продажам товаров за период и остаткам товара на указанную дату.
Продажи с 01.01.2019 по 31.03.2019
Номенклатура |
Количество |
Себестоимость |
Продажа |
Прибыль |
Куртка замшевая |
3 |
300 |
620 |
320 |
Портсигар |
3 |
30 |
50 |
20 |
Доставка |
1 |
|
100 |
100 |
Прибыль рассчитывается как: «Сумма продаж» — «Себестоимость»
Остатки товаров на 01.01.2019
Номенклатура |
Партия |
Количество |
Стоимость |
Куртка замшевая |
|
4 |
350 |
|
Прих. Накладная №1 |
2 |
250 |
|
Прих. Накладная №2 |
2 |
100 |
Портсигар |
|
|
65 |
|
Прих. Накладная №1 |
5 |
50 |
|
Прих. Накладная №3 |
1 |
15 |
Задача 2. Бухгалтерский учет.
Взаиморасчеты с покупателями ведутся в разрезе договоров. С каждым контрагентом может быть заключено произвольное количество договоров. Задолженность покупателей возникает при проведении документа «Расходная накладная». В этом документе пользователем указывается сам покупатель («Контрагент») и договор (договор вместе с контрагентом указывается в шапке документа). Пользователю должно быть запрещено указывать не соответствующий контрагенту договор.
Документ «Расходная накладная» формирует следующую проводку:
Дт «Покупатели» — Кт «Прибыли и убытки» на сумму продажи
Погашение задолженности (оплата переданного покупателю товара) регистрируется с помощью документа «Приход денег». В табличной части документа указывается контрагент, договор и сумма оплаты. В случае превышения суммы оплаты над суммой задолженности по какому - либо из договоров документ не проводится, но при этом нужно учесть, что задолженность может гаситься частями.
Документ «Приход денег» формирует следующие проводки:
Дт «Касса» — Кт «Покупатели» на указанную сумму
Необходимо создать отчет по состоянию взаиморасчетов с покупателями. В отчете должна быть видна как общая задолженность по контрагенту, так и эта же задолженность, но в разрезе действующих договоров.
Задолженность покупателей на 01.02.2019
Контрагент |
Договор |
Сумма |
АО Рога и Копыта |
|
100000 |
АО Рога и Копыта |
Договор основной |
40000 |
АО Рога и Копыта |
Договор дополнительный |
60000 |
Выполнялось на платформе 1С 8.3.19.1723
Определяемся с составом регистров:
Незабываем добавить регистр сведений МетодСписанияТоваров. Периодичность "В пределах года"
Т.к. оказываются еще и услуги, добавляем в справочник Номенклатура реквизит "Услуга" с типом булево.
Код модуля документа Приходная Накладная:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Запрос = новый запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| ПриходнаяНакладнаяСписокНоменклатуры.Количество КАК Количество,
| ПриходнаяНакладнаяСписокНоменклатуры.Сумма КАК Сумма,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка.Дата КАК Период,
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка КАК Партия
|ИЗ
| Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",ссылка);
результат = Запрос.Выполнить();
движения.ОстаткиНоменклатуры.Загрузить(результат.Выгрузить());
КонецПроцедуры
Код модуля объекта Расходная Накладная:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Очистить();
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.Период = Дата;
Движение.Сумма = СуммаПоДокументу;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Контрагент;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = Договор;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();
МетодСписания = РегистрыСведений.МетодСписанияТоваров.ПолучитьПоследнее(Дата).МетодСписания;
Если МетодСписания.Пустая()Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не указан метод списания! Проведение не возможно";
Сообщение.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать=Истина;
Движения.ОстаткиНоменклатуры.Записать();
Движения.Продажи.Записать();
Запрос = Новый Запрос("ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
|ПОМЕСТИТЬ ВТ
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Номенклатура КАК Номенклатура,
| ВТ.Количество КАК КоличествоВДокументе,
| ВТ.Сумма КАК СуммаВДокументе,
| ОстаткиНоменклатурыОстатки.Партия КАК Партия,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
| ВТ.Номенклатура.Услуга КАК НоменклатураУслуга
|ИЗ
| ВТ КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ВТ.Номенклатура
| ИЗ
| ВТ КАК ВТ)) КАК ОстаткиНоменклатурыОстатки
| ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ОстаткиНоменклатурыОстатки.Партия.МоментВремени
|ИТОГИ
| МАКСИМУМ(КоличествоВДокументе),
| МАКСИМУМ(СуммаВДокументе),
| СУММА(КоличествоОстаток),
| СУММА(СуммаОстаток)
|ПО
| Номенклатура");
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВОЗР", "УБЫВ");
КонецЕсли;
ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНоменклатура.Следующий() Цикл
Если НЕ ВыборкаНоменклатура.НоменклатураУслуга и ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.КоличествоВДокументе Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не хватает " + Строка(ВыборкаНоменклатура.КоличествоВДокументе - ВыборкаНоменклатура.КоличествоОстаток) + " количества номенклатуры " + ВыборкаНоменклатура.Номенклатура + ". Проведение невозможно.";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
ОсталосьСписать = ВыборкаНоменклатура.КоличествоВДокументе;
ИтоговаяСебестоимостьНоменклатуры = 0;
ВыборкаДетЗаписи = ВыборкаНоменклатура.Выбрать();
Пока ВыборкаДетЗаписи.Следующий() И ОсталосьСписать <> 0 Цикл
Если ВыборкаДетЗаписи.НоменклатураУслуга Тогда
продолжить;
КонецЕсли;
КСписанию = Мин(ОсталосьСписать, ВыборкаДетЗаписи.КоличествоОстаток);
СуммаСписания = ?(ВыборкаДетЗаписи.КоличествоОстаток =КСписанию,
ВыборкаДетЗаписи.СуммаОстаток,
ВыборкаДетЗаписи.СуммаОстаток/ВыборкаДетЗаписи.КоличествоОстаток * КСписанию);
НовоеДвижение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
НовоеДвижение.Период = Дата;
НовоеДвижение.Регистратор = Ссылка;
НовоеДвижение.Количество = КСписанию;
НовоеДвижение.Номенклатура = ВыборкаДетЗаписи.Номенклатура;
НовоеДвижение.Партия = ВыборкаДетЗаписи.Партия;
НовоеДвижение.Сумма = СуммаСписания;
ИтоговаяСебестоимостьНоменклатуры = ИтоговаяСебестоимостьНоменклатуры + СуммаСписания;
КонецЦикла;
НовоеДвижение = Движения.Продажи.Добавить();
НовоеДвижение.Активность = Истина;
НовоеДвижение.Период = Дата;
НовоеДвижение.Регистратор = Ссылка;
НовоеДвижение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
НовоеДвижение.Количество = ВыборкаНоменклатура.КоличествоВДокументе;
НовоеДвижение.Сумма = ВыборкаНоменклатура.СуммаВДокументе;
НовоеДвижение.Себестоимость = ИтоговаяСебестоимостьНоменклатуры;
КонецЦикла;
КонецПроцедуры
По второй части задачи:
Справочник Договор подчинен справочнику Контрагенты.
Для ограничения выбора несоответствующего договора в Расходной Накладной и документе Приход Денег заполним свойство реквизита Договор "Связи параметра выбора" следующим образом:
В виды субконто добавляем справочники Контрагент и Договор.
В плане счетов для счета "Покупатели" добавляем субконто Контрагент и Договор.
В плане счетов "Управленческий" на вкладке субконто проверяем заполненность соответствующего вида субконто.
Модуль объекта документа Расходная Накладная описан выше.
Модуль документа "Приход денег":
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
Блокировка = новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий");
ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
//
Запрос = новый запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходДенегРасшифровкаПлатежа.Контрагент КАК Контрагент,
| ПриходДенегРасшифровкаПлатежа.Договор КАК Договор,
| СУММА(ПриходДенегРасшифровкаПлатежа.Сумма) КАК Сумма
|ПОМЕСТИТЬ Расшифровка
|ИЗ
| Документ.ПриходДенег.РасшифровкаПлатежа КАК ПриходДенегРасшифровкаПлатежа
|ГДЕ
| ПриходДенегРасшифровкаПлатежа.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПриходДенегРасшифровкаПлатежа.Контрагент,
| ПриходДенегРасшифровкаПлатежа.Договор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Расшифровка.Контрагент КАК Контрагент,
| Расшифровка.Договор КАК Договор,
| Расшифровка.Сумма КАК Сумма,
| Расшифровка.Сумма - ЕСТЬNULL(УправленческийОстатки.СуммаОстаток, 0) КАК Переплата
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(плансчетов.Управленческий.Покупатели), , ) КАК УправленческийОстатки,
| Расшифровка КАК Расшифровка";
Запрос.УстановитьПараметр("МоментВремени",моментВремени());
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Переплата > 0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Переплата по контрагенту: " + Выборка.Контрагент + " по договору: " + Выборка.Договор + " на сумму: "+Выборка.Переплата;
Сообщение.Сообщить();
КонецЕсли;
Если Отказ тогда
Продолжить;
КонецЕсли;
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.Касса;
Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели;
Движение.Период = Дата;
Движение.Сумма = Выборка.Сумма;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Выборка.Контрагент;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договор] = Выборка.Договор;
КонецЦикла;
КонецПроцедуры
Запрос отчета "Остатки товаров" в компановке:
ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстатки.Партия КАК Партия,
ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество,
ОстаткиНоменклатурыОстатки.СуммаОстаток КАК Стоимость
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
Для такого же отображения отчета необходимо сделать следующие настройки: