Учебный курс: Подготовка на 1С:Специалист по платформе 1С:Предприятие 8.3
Задачи бухгалтерского учета – тема № 18, часть 1:
Как рассчитать себестоимость возвращаемых товаров – решение в текстовом формате
Текст задачи
Деятельность
Компания занимается оптовой торговлей бытовой техникой.
Хозяйственные операции
Необходимо отразить в учете три хозяйственные операции.
- Покупка товаров.
Оформляется документом «Приходная накладная». При проведении документ формирует следующие проводки:
Дт «Товары» – Кт «Поставщики» (отражается количество и стоимость приобретенного товара).
- Реализация товаров.
Оформляется документом «Расходная накладная». При проведении документ формирует следующие проводки:
Дт «Прибыли и убытки» – Кт «Товары» (отражается количество и себестоимость реализованного товара);
Дт «Покупатели» – Кт «Прибыли и убытки» (отражается продажная стоимость реализованного товара).
Списание себестоимости товаров производится по партиям. Метод списания себестоимости (FIFO или LIFO) задается в учетной политике предприятия, которая меняется не чаще одного раза в год.
- Возврат товаров.
Покупатель может вернуть товар ненадлежащего качества. Операция оформляется документом «Возврат товаров». При возврате обязательно необходимо указать документ «Расходная накладная», по которому производится возврат, а также перечень возвращаемого товара и его количество.
По одной расходной накладной может быть оформлено несколько документов возврата. По всем документам возврата, оформленным на основании одной расходной накладной, нельзя вернуть товара больше, чем указано в документе «Расходная накладная».
У покупателя есть 5 дней на возврат товара. Если с даты продажи до даты возврата товара прошло более 5 календарных дней, документ возврата не проводится, возвращаемый товар не принимается.
При проведении документ «Возврат товаров» формирует следующие проводки:
Дт «Товары» – Кт «Прибыли и убытки» (отражается количество и себестоимость возвращаемого товара);
Дт «Прибыли и убытки» – Кт «Покупатели» (отражается продажная стоимость возвращаемого товара).
Возвращаемый товар формирует новую партию. Себестоимость возвращаемого товара рассчитывается как средняя списанная себестоимость этого товара из документа «Расходная накладная», по которому происходит возврат.
Важно учитывать, что при помощи документа «Операция» пользователь имеет возможность внести проводки с произвольной корреспонденцией счетов.
Отчеты
Необходимо построить отчет по продажам и возвратам товаров за период
Продажи с 01.11.2019 по 30.11.2019
Номенклатура |
Себестоимость продаж | Сумма продаж | Количество продаж | Сумма возврата | Количество возврата |
Bosch KGS 3760 IE |
41 000 | 60 000 | 3 | 40 000 | 2 |
Electrolux ER 9007 B |
90 000 | 120 000 | 3 | 120 000 | 3 |
Итого |
131 000 | 180 000 | 6 | 160 000 | 5 |
Решение задачи
Задача решена в двух форматах: в текстовом и в формате видео.
Предлагаем сначала ознакомиться с текстовым решением, но, если Вы предпочитаете просмотр видеоуроков, можете сразу переходить к видео: Задачи бухгалтерского учета – тема № 18: Как рассчитать себестоимость возвращаемых товаров (видео).
Анализ задачи
Поскольку решается задача по бухгалтерскому учету, решение должно быть построено на регистре бухгалтерии.
Из условий задачи следует, что учет ведется по номенклатуре в суммовом и количественном выражении, а это значит, что потребуется два ресурса регистра бухгалтерии – Сумма и Количество. При этом количество имеет смысл хранить только для счета “Товары”, следовательно, необходимо использовать признаки учета.
В постановке задачи сказано, что “Списание себестоимости товаров производится по партиям. Метод списания себестоимости (FIFO или LIFO) задается в учетной политике предприятия, которая меняется не чаще одного раза в год”. Это значит, что потребуется добавить дополнительную аналитику на счете Товары – “Партии”. А также хранить метод списания партий с периодичностью год – создать периодический регистр сведений “УчетнаяПолитика”.
Основная проблема этой задачи – это создание документа “Возврат товаров”.
В описании механизма работы документа “Возврат товаров” есть две ключевые фразы – “По одной расходной накладной можно оформить несколько документов возврата” и “Возвращаемый товар формирует новую партию”. Это значит, что, во-первых, при проведении возврата потребуется анализировать все возвраты по расходной накладной. А во-вторых, и это самое главное, что возврат товаров формирует новую партию. Отсюда следует, что аналитика “Партии” должна иметь составной тип – содержать документы “Приходная накладная” и “Возврат товаров”. Также нужно обратить внимание на фразу “Себестоимость возвращаемого товара рассчитывается как средняя списанная себестоимость этого товара из документа «Расходная накладная» ” – она означает, что при возврате можно не анализировать конкретные партии, списанные реализацией, а просто получить себестоимость и количество по номенклатуре в целом.
Кроме создания документа “Возврат товаров” еще потребуется создать документ “Операция” для отражения ручных операций.
Поскольку по условию задачи счет “ПрибылиУбытки” корреспондирует со счетами “Товары” и “Покупатели”, из оборотов счета “ПрибылиУбытки” можно получить все необходимые для отчета данные. Поэтому для создания отчета потребуется добавить аналитику “Номенклатура” и “Партии” на счет “ПрибылиУбытки”.
Проанализировав задачу, составим план работ:
- Создание регистра сведений “Учетная политика”
- Настройка плана счетов, субконто и регистра бухгалтерии
- Создание документа “Операция”
- Доработка документа “Приходная накладная”
- Доработка документа “Расходная накладная”
- Создание документа “Возврат товаров”
- Создание контрольного примера
- Разработка отчета
Выполнение общих настроек
Перед тем, как перейти непосредственно к решению задачи, сразу установим управляемый режим блокировки на уровне конфигурации. Для этого в свойствах корневого элемента дерева объектов метаданных в разделе “Совместимость” устанавливаем режим управления блокировкой данных – “Управляемый”:
Рисунок 1 – Установка управляемой блокировки
Создание регистра сведений “Учетная политика”
Общую информацию о том, что такое “учетная политика” и какие ее варианты встречаются на экзамене, можно посмотреть в теме 15. Что такое учетная политика и какие варианты настроек объектов метаданных могут встретиться в экзаменационных задачах.
Создадим новый периодический регистр сведений “Учетная политика предприятия”.
По условию задачи учетная политика предприятия меняется не чаще одного раза в год, значит, периодичность созданного регистра необходимо установить в значение “В пределах года”.
Добавим в регистр один ресурс МетодСписанияСебестоимости (тип – ПеречислениеСсылка.УчетнаяПолитика).
Рисунок 2 – Регистр сведений “Учетная политика предприятия”
Рисунок 3 – Ресурс регистра сведений “Учетная политика предприятия”
Ресурс регистра должен обязательно быть заполнен, поэтому свойство “Проверка заполнения” устанавливаем в значение “Выдавать ошибку”:
Рисунок 4 – Свойство “Проверка заполнения” ресурса “МетодСписанияСебестоимости”
Настройка плана счетов, субконто и регистра бухгалтерии
Для настройки плана счетов и субконто нужно сначала добавить новые документы – “Операция” и “Возврат товаров”. Они потребуются в качестве регистраторов движений регистра бухгалтерии.
Пока добавим только сами документы, их детальная настройка будет выполнена позже.
После добавления документа “Возврат товаров” нужно выполнить настройку плана видов характеристик (ПВХ) “Виды субконто” (подробно работа с ПВХ разобрана в разделе Общие приемы и механизмы решения задач, в теме 29. Какие объекты конфигурации следует использовать для хранения произвольных свойств).
По условию задачи аналитика “Партии” должна быть составного типа – содержать документы типа “Приходная накладная” и “Возврат товаров”, поэтому добавим в ПВХ “Виды субконто” новые типы значения характеристик – “ДокументСсылка.ПриходнаяНакладная” и “ДокументСсылка.ВозвратТоваров”.
Рисунок 5 – Настройка ПВХ “ВидыСубконто”
В постановке задачи сказано, что списание себестоимости товаров производится по партиям, поэтому нужно добавить новый предопределенный элемент “Партии” в ПВХ “Виды субконто”. Этот элемент будет иметь составной тип, в который включены два вида документов – “ПриходнаяНакладная” и “ВозвратТоваров”:
Рисунок 6 – Новый вид субконто “Партии”
Поскольку по условию задачи суммовой учет должен вестись на всех счетах, а для товаров необходимо учитывать количество, создадим в плане счетов “Управленческий” признак учета “Количественный”. Подробнее про признаки учета можно почитать в теме 1. Что нужно знать об объекте «План счетов» для решения аттестационных задач.
Рисунок 7 – Признаки учета плана счетов “Управленческий”
По условию задачи, аналитика количественного и суммового учета совпадает, поэтому признаки учета субконто использовать не нужно.
Добавим вид субконто “Партии” к счету “Товары”:
Рисунок 8 – Настройка счета “Товары”
Отчет будет построен на оборотах счета “ПрибылиУбытки”, а значит, на нем потребуется аналитика, аналогичная счету “Товары”. Подобные настройки выполнялись теме 7. Как рассчитать себестоимость списания товаров по уникальным номерам (инвентарным номерам).
Важно установить у обоих видов субконто (“Номенклатура” и “Партии”) на счете “ПрибылиУбытки” признак «Только обороты», так как используемые показатели (сумма продажи и себестоимость) являются оборотными.
Рисунок 9 – Настройка счета “ПрибылиУбытки”
Переходим к созданию регистра бухгалтерии. Подробнее проектирование структуры регистра бухгалтерии рассмотрено в теме 3. Что нужно знать об объекте «Регистр бухгалтерии».
Добавляем регистр бухгалтерии “Управленческий” и создаем у него следующие ресурсы:
- “Сумма” (тип – Число: длина – 12, точность – 2)
- “Количество” (тип – Число: длина – 10, точность – 0, неотрицательное)
Рисунок 10 – Ресурсы регистра бухгалтерии “Управленческий”
Устанавливаем поддержку корреспонденции:
Рисунок 11 – Свойство “Корреспонденция” регистра бухгалтерии “Управленческий”
Свяжем ресурс “Количество“ с признаком учета “Количественный”, это позволит ограничить хранение итогов по ресурсу “Количество” только счетом “Товары”, так как только у этого счета установлен признак учета “Количественный”:
Рисунок 12 – Связь ресурса “Количество” с признаком учета “Количественный”
Укажем регистраторы, выполняющие движения по регистру бухгалтерии:
Рисунок 13 – Регистраторы движений регистра бухгалтерии “Управленческий”
Можно переходить к детальной настройке документов.
Создание документа “Операция”
Подробно про создание документа “Операция” можно прочитать в теме 5. Как создать документ «Операция» для ручного ввода проводок.
Основное, что нужно помнить про документ “Операция”, – это то, что у него должно быть запрещено проведение:
Рисунок 14 – Отключение движений у документа “Операция”
Доработка документа “Приходная накладная”
В приходной накладной никаких дополнительных реквизитов добавлять не нужно, поэтому можно сразу перейти к созданию обработки проведения.
Для экономии времени воспользуемся конструктором движений по регистру бухгалтерии “Управленческий”. Указываем счет дебета, счет кредита, табличную часть, заполняем выражения и вручную прописываем ссылку на текущий документ в субконто “Партии”.
Рисунок 15 – Конструктор движений приходной накладной
В результате работы конструктор сформирует следующий код процедуры “ОбработкаПроведения”:
Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = ТекСтрокаСписокНоменклатуры.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = Ссылка; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры
Преимущество использования конструктора движений – быстрота создания программного кода, поэтому на аттестации для таких простых документов, как “Приходная накладная”, рекомендуется пользоваться именно конструктором движений.
Однако при наличии в табличной части строк с повторяющимися номенклатурными позициями приведенный код создаст несколько однотипных проводок с одинаковой аналитикой. Ошибкой это не является, но данный код можно оптимизировать.
Для этого потребуется выбрать данные из табличной части проводимого документа запросом, сгруппировать данные по номенклатуре. Это позволит избавиться от лишних проводок. Применение запроса в данной ситуации не является обязательным, на экзамене его стоит использовать только при наличии свободного времени.
Можно перейти к настройке расходной накладной.
Доработка документа “Расходная накладная”
Никаких дополнительных реквизитов в расходную накладную добавлять не нужно, поэтому сразу перейдем к программированию проведения.
Для формирования движений потребуется в запросе получить остатки по партиям, отсортированные в соответствии с учетной политикой, и сравнить суммарный остаток по партиям с количеством, указанным в расходной накладной, для того, чтобы исключить пересписание.
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // 1. Подготовка наборов записей регистра Движения.Управленческий.Записывать = Истина; Движения.Записать(); // 2. Восстановление для свойства набора движений Записывать значения Истина Движения.Управленческий.Записывать = Истина; // 3. Запрос, получающий метод списания партии Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УчетнаяПолитикаПредприятияСрезПоследних.МетодСписанияСебестоимости |ИЗ | РегистрСведений.УчетнаяПолитикаПредприятия.СрезПоследних(&НаДату, ) КАК УчетнаяПолитикаПредприятияСрезПоследних |"; // 4. Установка параметров запроса Запрос.УстановитьПараметр("НаДату", Дата); Результат = Запрос.Выполнить(); // 5. Проверка наличия учетной политики на момент проведения документа Если Результат.Пустой() Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "На дату документа нет учетной политики. Провести документ невозможно!"; Сообщение.Сообщить(); Возврат; КонецЕсли; ВыборкаМетодСписания = Результат.Выбрать(); ВыборкаМетодСписания.Следующий(); МетодСписанияСебестоимости = ВыборкаМетодСписания.МетодСписанияСебестоимости; // 6. Управляемая блокировка данных регистра Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); // 7. Запрос, получающий себестоимость списания номенклатуры Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ТЧСписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура КАК Номенклатура, | ПРЕДСТАВЛЕНИЕ(ТЧСписокНоменклатуры.Номенклатура) КАК НоменклатураПредставление, | ТЧСписокНоменклатуры.Количество КАК Количество, | ТЧСписокНоменклатуры.Сумма КАК Сумма, | УправленческийОстатки.Субконто2 КАК Партия, | ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(УправленческийОстатки.СуммаОстаток, 0) КАК СуммаОстаток |ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = &Счет, | &МассивВидовСубконто, | Субконто1 В | (ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура | ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры)) КАК УправленческийОстатки | ПО ТЧСписокНоменклатуры.Номенклатура = УправленческийОстатки.Субконто1 | |УПОРЯДОЧИТЬ ПО | УправленческийОстатки.Субконто2.МоментВремени |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; // 8. Корректировка сортировки результата запроса в зависимости от метода списания себестоимости Если МетодСписанияСебестоимости = Перечисления.УчетнаяПолитика.ЛИФО Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "УправленческийОстатки.Субконто2.МоментВремени", "УправленческийОстатки.Субконто2.МоментВремени УБЫВ"); КонецЕсли; // 9. Определение массива видов субконто МассивВидовСубконто = Новый Массив(); МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Партии); Запрос.УстановитьПараметр("МассивВидовСубконто", МассивВидовСубконто); Запрос.УстановитьПараметр("Счет", ПланыСчетов.Управленческий.Товары); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Результат = Запрос.Выполнить(); // 10. Цикл по номенклатуре документа ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // 11. Контроль остатков Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда Нехватка = ВыборкаНоменклатура.Количество-ВыборкаНоменклатура.КоличествоОстаток; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает остатка по номенклатуре " + ВыборкаНоменклатура.НоменклатураПредставление + ", не хватает: " + Нехватка; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // 12. Остатка не хватает, нет смысла формировать движения Если Отказ Тогда Продолжить; КонецЕсли; // 13. Получим количество для списания КоличествоСписать = ВыборкаНоменклатура.Количество; ВыручкаСписать = ВыборкаНоменклатура.Сумма; // 14. Цикл по партиям ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() И КоличествоСписать <> 0 Цикл // 15. Расчет количества для списания Количество = Мин(КоличествоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток); // 16. Расчет суммы для списания и доли выручки Если Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда Себестоимость = ВыборкаДетальныеЗаписи.СуммаОстаток; Иначе Себестоимость = Количество * ВыборкаДетальныеЗаписи.СуммаОстаток / ВыборкаДетальныеЗаписи.КоличествоОстаток; КонецЕсли; Если Количество = КоличествоСписать Тогда Выручка = ВыручкаСписать; Иначе Выручка = Окр(Количество * ВыборкаНоменклатура.Сумма / ВыборкаНоменклатура.Количество, 2) КонецЕсли; // 17. Сформируем движение по себестоимости Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = ВыборкаДетальныеЗаписи.Партия; Движение.СчетКт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = ВыборкаДетальныеЗаписи.Партия; Движение.КоличествоКт = Количество; Движение.Сумма = Себестоимость; // 18. Сформируем движение по выручке Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = ВыборкаДетальныеЗаписи.Партия; Движение.Сумма = Выручка; // 19. Уменьшим количество для списания КоличествоСписать = КоличествоСписать - Количество; ВыручкаСписать = ВыручкаСписать - Движение.Сумма; КонецЦикла; КонецЦикла; КонецПроцедуры
Отметим важные моменты приведенного программного кода.
- В п. 3 получаем текущее значение метода списания партий.
- В п. 6 устанавливается управляемая блокировка данных регистра. Подробно о проведении в режиме управляемой блокировки рассказано в теме 6. Расчет себестоимости по средней в разрезе складов. Старая методика контроля остатков.
- В п. 7 составляется запрос по остаткам партий. Особенностью запроса является использование итогов по номенклатуре. Это позволит получить в итоговых записях суммарный количественный остаток по всем партиям конкретной номенклатуры, а на уровне детальных записей – информацию по списываемым партиям.
- В п. 8 устанавливается сортировка партий в запросе в зависимости от выбранной учетной политики.
- В п. 10 и п. 11 происходит обход итоговых записей и контроль остатков.
- В п. 14 – п. 19 происходит подбор партий с учетом остатка и формирование проводок по списанию себестоимости и по выручке.
Создание документа “Возврат товаров”
Добавим в ранее созданный документ “Возврат товаров” обязательный для заполнения реквизит шапки “Расходная накладная” и табличную часть “СписокНоменклатуры” (в ней будут храниться данные о возвращаемом товаре).
Рисунок 16 – Реквизиты документа “Возврат товаров”
Переходим к созданию обработки проведения.
По условию задачи в обработке проведения необходимо предусмотреть следующие моменты:
- Возврат должен быть не позже 5 дней от реализации.
- По одному документу “Расходная накладная” может быть введено несколько документов возврата.
- Суммарное количество возвращаемого товара не должно превышать проданное количество.
- Так как “Себестоимость возвращаемого товара рассчитывается как средняя списанная себестоимость этого товара из документа «Расходная накладная»”, необходимо просто получить сумму и количество товара, списанного расходной накладной, без подбора партий.
Текст разработанной процедуры “ОбработкаПроведения” выглядит следующим образом:
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // 1. Проверка, сколько дней прошло с даты продажи РазницаВДнях = (КонецДня(Дата) - КонецДня(РасходнаяНакладная.Дата)) / (60 * 60 * 24); Если Дата < РасходнаяНакладная.Дата Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Дата возврата раньше даты отгрузки. Провести документ невозможно!"; Сообщение.Сообщить(); Возврат; КонецЕсли; Если РазницаВДнях > 5 Тогда Отказ = Истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Прошло более 5 дней с даты продажи. Провести документ невозможно!"; Сообщение.Сообщить(); Возврат; КонецЕсли; // 2. Подготовка наборов записей регистра Движения.Управленческий.Записывать = Истина; Движения.Записать(); // 3. Восстановление для свойства набора движений Записывать значения Истина Движения.Управленческий.Записывать = Истина; // 4. Управляемая блокировка данных регистра Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.ПрибылиУбытки); ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); // 5. Пакет запросов, в котором группируются данные табличной части // и выполняется проверка на превышение Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВозвратТоваровСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ВозвратТоваровСписокНоменклатуры.Количество) КАК Количество |ПОМЕСТИТЬ ТЧСписокНоменклатуры |ИЗ | Документ.ВозвратТоваров.СписокНоменклатуры КАК ВозвратТоваровСписокНоменклатуры |ГДЕ | ВозвратТоваровСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ВозвратТоваровСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | УправленческийОбороты.Субконто1 КАК Номенклатура, | УправленческийОбороты.КоличествоКорОборотДт КАК Количество, | УправленческийОбороты.СуммаОборотДт КАК Сумма, | УправленческийОбороты.СуммаОборотКт КАК Выручка, | 0 КАК КоличествоПоДокументу |ПОМЕСТИТЬ ТЧВозвраты |ИЗ | РегистрБухгалтерии.Управленческий.Обороты( | &НачПериода, | &НачПериода, | Регистратор, | Счет = &СчетПрибылиУбытки, | &ВидСубконто, | Субконто1 В | (ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура КАК Номенклатура | ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры), | , | ) КАК УправленческийОбороты |ГДЕ | УправленческийОбороты.Регистратор = &РасходнаяНакладная | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | УправленческийОбороты.Субконто1, | -УправленческийОбороты.КоличествоКорОборотКт, | -УправленческийОбороты.СуммаОборотКт, | -УправленческийОбороты.СуммаОборотДт, | 0 |ИЗ | РегистрБухгалтерии.Управленческий.Обороты( | &НачПериода, | &КонПериода, | Регистратор, | Счет = &СчетПрибылиУбытки, | &ВидСубконто, | Субконто1 В | (ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура КАК Номенклатура | ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры), | , | ) КАК УправленческийОбороты |ГДЕ | УправленческийОбороты.Регистратор В | (ВЫБРАТЬ | ВозвратТоваров.Ссылка КАК Ссылка | ИЗ | Документ.ВозвратТоваров КАК ВозвратТоваров | ГДЕ | ВозвратТоваров.РасходнаяНакладная = &РасходнаяНакладная | И ВозвратТоваров.Ссылка <> &Ссылка) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура, | 0, | 0, | 0, | ТЧСписокНоменклатуры.Количество |ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧВозвраты.Номенклатура КАК Номенклатура, | ТЧВозвраты.Номенклатура.Представление КАК НоменклатураПредставление, | СУММА(ТЧВозвраты.Количество) КАК Количество, | СУММА(ТЧВозвраты.Сумма) КАК Сумма, | СУММА(ТЧВозвраты.Выручка) КАК Выручка, | СУММА(ТЧВозвраты.КоличествоПоДокументу) КАК КоличествоПоДокументу |ИЗ | ТЧВозвраты КАК ТЧВозвраты | |СГРУППИРОВАТЬ ПО | ТЧВозвраты.Номенклатура, | ТЧВозвраты.Номенклатура.Представление"; // 6. Установка параметров запроса Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("РасходнаяНакладная", РасходнаяНакладная); Запрос.УстановитьПараметр("ВидСубконто", ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("СчетПрибылиУбытки", ПланыСчетов.Управленческий.ПрибылиУбытки); Запрос.УстановитьПараметр("НачПериода", РасходнаяНакладная.Дата); Запрос.УстановитьПараметр("КонПериода", Дата); // 7. Результат основного запроса РезультатЗапроса = Запрос.Выполнить(); ВыборкаНоменклатура = РезультатЗапроса.Выбрать(); Пока ВыборкаНоменклатура.Следующий() Цикл // 8. Контроль остатков Если ВыборкаНоменклатура.КоличествоПоДокументу > ВыборкаНоменклатура.Количество Тогда Нехватка = ВыборкаНоменклатура.КоличествоПоДокументу - ВыборкаНоменклатура.Количество; Сообщение = Новый СообщениеПользователю; Шаблон = "Возвращается больше, чем продано, по номенклатуре %1, превышение: %2"; Сообщение.Текст = СтрШаблон(Шаблон, ВыборкаНоменклатура.НоменклатураПредставление, Нехватка); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; // 9. Остатка не хватает, нет смысла формировать движения Если Отказ Тогда Продолжить; КонецЕсли; // 10. Расчет суммы для проводки Если ВыборкаНоменклатура.КоличествоПоДокументу = ВыборкаНоменклатура.Количество Тогда СуммаСебестоимость = ВыборкаНоменклатура.Сумма; СуммаВыручка = ВыборкаНоменклатура.Выручка; Иначе СуммаСебестоимость = ВыборкаНоменклатура.КоличествоПоДокументу * ВыборкаНоменклатура.Сумма / ВыборкаНоменклатура.Количество; СуммаВыручка = ВыборкаНоменклатура.КоличествоПоДокументу * ВыборкаНоменклатура.Выручка / ВыборкаНоменклатура.Количество; КонецЕсли; // 11. Сформируем движение по себестоимости Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = Ссылка; Движение.КоличествоДт = ВыборкаНоменклатура.КоличествоПоДокументу; Движение.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = Ссылка; Движение.Сумма = СуммаСебестоимость; // 12. Сформируем движение по выручке Движение = Движения.Управленческий.Добавить(); Движение.Период = Дата; Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаНоменклатура.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Партии] = Ссылка; Движение.СчетКт = ПланыСчетов.Управленческий.Покупатели; Движение.Сумма = СуммаВыручка; КонецЦикла; КонецПроцедуры
Программный код требует дополнительных пояснений:
- В п. 1 проводится проверка на возможный период возврата в 5 дней.
- В п. 4 устанавливаем управляемую блокировку данных регистра бухгалтерии.
- В п. 5 создается пакет запросов с данными для проведения документа и проверки превышения возвращаемого количества над реализованным:
- Первый запрос пакета получает и группирует данные из табличной части проводимого документа.
- Второй запрос пакета состоит из трех объединяемых запросов:
- В первом запросе объединения получаются данные по количеству, выручке и себестоимости товаров, проданных в расходной накладной. Для этого используются обороты счета ПрибылиУбытки.
- Во втором запросе объединения получаются данные о ранее возвращенных товарах (анализируем документы возврата, оформленные по той же расходной накладной, за исключением самого проводимого документа).
- В третьем запросе объединения получаются данные о товарах, возвращаемых текущим документом.
- Третий запрос пакета группирует полученные во втором запросе данные.
- В п. 7 – п. 12 производится обход выборки, проверка возвращаемого количества и формирование проводок. При этом контролируется факт полного или частичного возврата для решения “проблемы копеек” (п. 10).
Создание контрольного примера
Создаем учетную политику
Рисунок 17 – Учетная политика
Используем элементы справочника “Номенклатура”, присутствующие в каркасной конфигурации:
Рисунок 18 – Новые элементы справочника “Номенклатура”
Создаем несколько приходных накладных для формирования партий и проводим их:
Рисунок 19 – Приходная накладная №1
Рисунок 20 – Проводки документа Приходная накладная №1
Рисунок 21 – Приходная накладная №2
Рисунок 22 – Проводки документа Приходная накладная №2
Рисунок 23 – Приходная накладная №3
Рисунок 24 – Проводки документа Приходная накладная №3
Создаем несколько расходных накладных, проводим их и проверяем порядок списания партий в соответствии с учетной политикой.
Рисунок 25 – Расходная накладная №1
Рисунок 26 – Проводки документа Расходная накладная №1
Рисунок 27 – Расходная накладная №2
Рисунок 28 – Проводки документа Расходная накладная №2
Возвращаем часть проданных товаров
Рисунок 29 – Возврат товаров №1
Рисунок 30 – Проводки документа Возврат товаров №1
Рисунок 31 – Возврат товаров №2
Рисунок 32 – Проводки документа Возврат товаров №2
Можно переходить к разработке отчета.
Разработка отчета
Отчет разрабатываем с использованием системы компоновки данных (СКД).
Детально процесс разработки отчета описан в дополнении к теме 7. Разработка отчета по продажам уникальных товаров.
Создаем новый отчет. Имя – “Отчет по продажам”
Создадим набор данных – запрос. Запрос строим по оборотам счета ПрибылиУбытки.
Текст запроса набора данных:
ВЫБРАТЬ УправленческийОбороты.Субконто1 КАК Номенклатура, ВЫБОР КОГДА УправленческийОбороты.КорСчет = &Товары ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ КАК Себестоимость, ВЫБОР КОГДА УправленческийОбороты.КорСчет = &Покупатели ТОГДА УправленческийОбороты.СуммаОборотКт ИНАЧЕ 0 КОНЕЦ КАК Продажа, ВЫБОР КОГДА УправленческийОбороты.КорСчет = &Товары ТОГДА УправленческийОбороты.КоличествоКорОборотДт ИНАЧЕ 0 КОНЕЦ КАК КоличествоПродажа, ВЫБОР КОГДА УправленческийОбороты.КорСчет = &Покупатели ТОГДА УправленческийОбороты.СуммаОборотДт ИНАЧЕ 0 КОНЕЦ КАК Возврат, ВЫБОР КОГДА УправленческийОбороты.КорСчет = &Товары ТОГДА УправленческийОбороты.КоличествоКорОборотКт ИНАЧЕ 0 КОНЕЦ КАК КоличествоВозврат ИЗ РегистрБухгалтерии.Управленческий.Обороты(, , , Счет = &ПрибылиУбытки, &МассивСубконто, , КорСчет В (&Покупатели, &Товары), ) КАК УправленческийОбороты
С помощью нескольких операторов “ВЫБОР” получаем количество и сумму продажи, себестоимость, количество и сумму возврата по корреспондирующим со счетом “ПрибылиУбытки” счетам:
- Сумма дебетового оборота по счету “ПрибылиУбытки” в корреспонденции со счетом “Товары” – это себестоимость реализованных товаров.
- Сумма кредитового оборота по счету “ПрибылиУбытки” в корреспонденции со счетом “Покупатели” – это сумма выручки (сумма продажи).
- Так как количественный учет ведется только на счете “Товары”, то в оборотах по счету “ПрибылиУбытки” количества не будет. Получить количество можно только из оборотов корреспондирующего счета “Товары”. Поэтому для получения проданного количества используется ресурс “КоличествоКорОборотДт” виртуальной таблицы “Обороты”
- Сумма дебетового оборота по счету “ПрибылиУбытки” в корреспонденции со счетом “Покупатели” – это сумма возвратов.
- Количество возвращенного товара получается аналогично третьему оператору с той разницей, что используется корреспондирующий кредитовый оборот – “КоличествоКорОборотКт”
Настраиваем ресурсы:
Рисунок 33 – Ресурсы СКД
Настраиваем параметры:
Рисунок 34 – Параметры СКД
Для параметра “КонецПериода” прописываем выражение “КонецПериода(&КонецПериода, “ДЕНЬ”)”, чтобы отчет всегда формировался на конец дня.
Для параметра “МассивСубконто” указываем только один элемент – ПланВидовХрактеристик.ВидыСубконто.Номенклатура. Это необходимо для того, чтобы задать типы данных и порядок следования субконто в результате запроса. То есть Субконто1 – это Номенклатура.
Переходим на закладку “Настройки”:
Добавляем группировку по полю “Номенклатура”, назначаем ей имя “Заголовок” для дальнейшей настройки макета заголовка группировки и добавляем выводимые в отчет ресурсы.
Рисунок 35 – Настройки СКД
Включим параметры в пользовательские настройки для их автоматического вывода на форму отчета в режиме “1С:Предприятие”:
Рисунок 36 – Настройка параметров СКД
Осталось доработать оформление отчета. Для того, чтобы внешний вид отчета соответствовал указанному в постановке задачи, необходимо настроить макет схемы компоновки данных.
Стандартный заголовок отчета, формируемый средствами СКД, не подходит, поскольку по условию задачи требуется вывести в заголовок период формирования отчета. Поэтому отключим вывод стандартного заголовка и лишней информации. Для этого перейдем на закладку “Другие настройки” и установим следующие значения параметров:
- Выводить заголовок – Не выводить
- Выводить параметры – Не выводить
Рисунок 37 – Другие настройки СКД
Доработаем вывод заголовка отчета. Для этого настроим макет заголовка группировки “Номенклатура”.
Рисунок 38 – Настройка макета СКД
В пользовательском режиме открываем отчет, указываем период и нажимаем “Сформировать”:
Рисунок 39 – Отчет “Продажи”
Отчет готов. Он соответствует образцу, приведенному в постановке задачи.
Альтернативные варианты постановки задачи
На экзамене также могут встретиться задачи, очень похожие на разобранную, но с немного другими формулировками. Рассмотрим такие варианты подробнее.
- Для отражения операции возврата товаров вместо отдельного документа может использоваться уже существующий документ “Приходная накладная”. В таком случае потребуется создать реквизит в документе “Приходная накладная” (например, типа Булево или перечисление с двумя значениями – “Поступление товаров” и “Возврат товаров”). В зависимости от значения этого реквизита в процедуре ОбработкаПроведения необходимо реализовать два сценария формирования проводок:
- Поступление товаров от поставщика.
- Возврат товаров от покупателя.
- Существует несколько вариантов формирования проводок для отражения возврата:
- Сторнирование проводок, сформированных расходной накладной:
Дт «Прибыли и убытки» – Кт «Товары» (количество и себестоимость со знаком “минус”);
Дт «Покупатели» – Кт «Прибыли и убытки» (продажная стоимость со знаком “минус”).
-
- Формирование “обратных” проводок (этот вариант используется в приведенном решении):
Дт «Товары» – Кт «Прибыли и убытки» (количество и себестоимость со знаком “плюс”);
Дт «Прибыли и убытки» – Кт «Покупатели» (продажная стоимость со знаком “плюс”).
- Также важно определить, как требуется работать с партиями:
- Документ возврата становится новой партией (этот вариант используется в приведенном решении).
- Необходимо использовать партии, списанные расходной накладной.
Таким образом, нужно внимательно читать постановку задачи, чтобы разработать правильное решение.
Итоги
Разобрано решение бухгалтерской задачи учета возвратов с помощью отдельного документа “Возврат товаров”. Показана возможность получения необходимых данных с помощью одного пакета запросов, в котором используется объединение отдельных запросов и получение итогов. Продемонстрировано создание отчета с помощью системы компоновки данных.
Если Вы хотите ознакомиться с решением этой задачи в формате видео, переходите по ссылке ниже:
Комментарии закрыты