Учебный курс: Подготовка на 1С:Специалист по платформе 1С:Предприятие 8.3

Задачи бухгалтерского учета – тема № 7:
Как рассчитать себестоимость списания товаров по уникальным номерам (инвентарным номерам)

На экзамене «1С:Специалист по платформе 1С 8.3» может встретиться задача с такими условиями:

Необходимо реализовать возможность купли/продажи редких товаров. В документе поступления каждая единица товара оформляется отдельной строкой (с количеством равным 1). Каждой позиции закупаемого товара присваивается уникальный инвентарный номер (считается, что за уникальностью следит пользователь, автоматизировать получение уникальных инвентарных номеров в рамках задачи не требуется). Одним документом может оформляться поступление нескольких одинаковых товаров, но с разными инвентарными номерами.

Документ «Приходная накладная» реализует следующую проводку:

Дт «Товары» – Кт «Поставщики» на сумму закупаемого товара

Продажа товара регистрируется документом «Расходная накладная». При продаже инвентарный номер вводится в табличную часть документа вручную. При проведении документа должен производиться контроль наличия указанного в документе товара (по указанному инвентарному номеру).

Себестоимость списываемого товара определяется как средняя по номенклатурной позиции по всем ее инвентарным номерам.

Документ «Расходная накладная» реализует следующие проводки:

Дт «Прибыли и убытки» – Кт «Товары» на сумму себестоимости

Дт «Покупатели» – Кт «Прибыли и убытки» на сумму в продажных ценах.

При списании себестоимости следует учесть, что она может быть скорректирована пользователем документом «Операция» и не совпадать с закупочной ценой.

По данным бухгалтерского учета необходимо сформировать отчет, который за указанный интервал дат показывал бы данные о проданном товаре:

Продажи за период с 01.10.2018 по 31.10.2018

Товар

Инвентарный номер

Себестоимость

Продажа

Скрипка

0001

120 000

200 000

Барабан

0002

51 000

70 000

Барабан

5008

51 000

75 890

Проанализируем условия задачи

Присутствует дополнительная аналитика учета товаров – это инвентарный номер. По инвентарному номеру нужно производить контроль наличия остатков, а вот себестоимость нужно рассчитывать как среднюю по номенклатуре по всем инвентарным номерам. Это значит, что на активном счете «Товары» кроме вида субконто «Номенклатура» еще понадобится вид субконто «Инвентарные номера», по которому будем вести только количественный учет. Суммовой учет в разрезе инвентарных номеров не нужен.

В приходных и расходных документах нужно будет обеспечить пользователям возможность указывать инвентарный номер. Для этого в табличную часть документов добавим реквизит «Инвентарный номер».

Кроме того, в отчете необходимо выводить сумму продажи в разрезе номенклатуры и инвентарных номеров. Если посмотреть на проводки в условии задачи, то увидим что сумма в продажных ценах отражается по Кт счета «Прибыли и убытки». Значит, на этом счете понадобится два вида субконто «Номенклатура» и «Инвентарный номер». Сумма продажи – это оборотный показатель, остаток суммы продажи смысла не имеет. Поэтому и виды субконто на счете «Прибыли и убытки» должны быть оборотными.

Какой тип данных выбрать для хранения инвентарных номеров?

С точки зрения механизмов платформы правильный вариант хранения инвентарных номеров – в справочнике. Из условия задачи «Каждой позиции закупаемого товара присваивается уникальный инвентарный номер» сделаем вывод, что инвентарные номера уникальны не только в пределах конкретного товара, но вообще в пределах всех закупаемых редких товаров. То есть два разных товара не могут иметь один и тот же инвентарный номер. Поэтому подчинять его справочнику «Номенклатура» не будем.

Не следует беспокоиться, что в этом варианте пользователь в «Расходной накладной» сможет выбрать не соответствующий номенклатуре инвентарный номер. При проведении должен сработать контроль остатков, что не позволить провести такой документ, так как номенклатуры с таким инвентарным номером не будет на остатках.

Согласно информации от сдававших экзамен, на аттестации допустим и другой вариант хранения инвентарных номеров, когда справочник «Инвентарные номера» делают подчиненным справочнику «Номенклатура».

Расчет себестоимости списания как средней по номенклатуре по всем ее инвентарным номерам

Рассмотрим на примере:

Товар

Инвентарный номер

Стоимость закупки

Себестоимость по средней по всем инвентарным номерам

Скрипка

001

10 000

10 000

Барабан

002

50 000

51 000

Барабан

003

52 000

51 000

На момент списания получим по товару остаток количества и остаток стоимости без учета инвентарных номеров. На основании этих данных рассчитаем себестоимость единицы товара. Это и будет себестоимость списания для товара с любым инвентарным номером:

СебестоимостьСписания = СебестоимостьОстаток/КоличествоОстаток

В приведенном выше примере себестоимость Барабанов с уникальными номерами 002 и 003 будет одинакова и равна 51 000 рублей.

Главная сложность этого варианта в том, что количественный учет нужен в разрезе номенклатуры и инвентарных номеров, а стоимостной учет – только в разрезе номенклатуры. Как это сделать, разберем далее.

«Проблема копеек» при расчете себестоимости списания уникальных товаров

Из-за того, что товары уникальны и остаток по конкретному инвентарному номеру может быть только в количестве одна штука, возникает соблазн посчитать, что к таким задачам «проблема копеек» отношения не имеет. Ведь списать можно тоже только одну штуку такого товара.

И даже если себестоимость рассчитывается как средняя по всем инвентарным номерам, то перед списанием последнего инвентарного номера товара остаток количества по номенклатуре без учета инвентарных номеров будет равен единице, т.е. формула
СебестоимостьСписания = СебестоимостьОстаток/КоличествоОстаток по сути превращается в формулу СебестоимостьСписания = СебестоимостьОстаток/1 = СебестоимостьОстаток.

Верно ли это рассуждение?

Разберем пример. Пусть на складе следующая ситуация:

Товар

Инвентарный номер

Кол-во остаток

Стоимость остаток

Ручка

001

1

500

Ручка

002

1

300

Ручка

003

1

200

Теперь предположим, что нам нужно оформить списание всех ручек одним документом.

Рассчитаем себестоимость списания: (500 + 300 + 200) / 3 = 333,33.

После проведения документа у нас спишется 999,99 руб, а одна копейка «зависнет».

Пример показал, что проблему копеек решать придется и в случае уникальных товаров. Сделаем это в практической части.

Переходим к практическому решению задачи.

Подготовка объектов метаданных

Понадобятся объекты метаданных, которые уже есть в каркасной конфигурации:

  • Справочник «Номенклатура»
  • Документ «Приходная накладная»
  • Документ «Расходная накладная».

Создадим справочник «Инвентарные номера». В документы «Расходная накладная», «Приходная накладная» добавим реквизит ИнвентарныйНомер (СправочникСсылка.ИнвентарныеНомера):

Реквизит Инвентарный номер в документах  «Приходная накладная» и «Расходная накладная»

Рисунок 1 – Реквизит Инвентарный номер в документах «Приходная накладная» и «Расходная накладная»

Товар с определенным инвентарным номером всегда поступает в количестве 1 шт и списать его возможно тоже только в количестве 1 шт. Поэтому указывать количество товара в документах нет необходимости, так как оно всегда равно единице. Удалим реквизит Количество из табличной части.

Удалять реквизиты в прикладных объектах каркасной конфигурации, которые используем в процессе решения разрешено. Нельзя удалять сами прикладные объекты – справочники, документы и т.д. В требованиях к экзамену сказано: «Допускается изменение структуры «каркасной» конфигурации согласно требований задачи, и на усмотрение кандидата. В любом случае необходимо уметь обосновать свои решения…»

Для того, чтобы нельзя было провести документы с незаполненными инвентарными номерами, в каждом документе для реквизита Инвентарный номер свойство Проверка заполнения установим в значение «Выдавать ошибку»:

Установка свойства «Проверка заполнения»

Рисунок 2 – Установка свойства «Проверка заполнения»

Общие действия по подготовке объектов метаданных для организации бухгалтерского учета разбирали в главе «Как анализировать условия задач по учету товаров и расчету себестоимости и правильно выбирать методику решения», поэтому разберем лишь дополнительные действия, связанные со спецификой задачи.

В ПВХ «Виды субконто» сделаем Тип значения характеристик составным и добавим в его состав тип значения СправочникСсылка.ИнвентарныеНомера.

Предопределенный вид субконто «Номенклатура» уже есть, добавляем еще один предопределенный вид субконто: «Инвентарные номера»:

Предопределенные элементы ПВХ «ВидыСубконто»

Рисунок 3 – Предопределенные элементы ПВХ «ВидыСубконто»

В плане счетов «Управленческий» определим, что Максимальное количество субконто будет равно 2:

Закладка Субконто плана счетов «Управленческий»

Рисунок 4 – Закладка Субконто плана счетов «Управленческий»

Отключение суммового учета по субконто «Инвентарные номера»

Для возможности отключения суммового учета по субконто в плане счетов «Управленческий» добавим признак учета субконто «Суммовой»:

Закладка Субконто плана счетов «Управленческий»

Рисунок 5 – Закладка Субконто плана счетов «Управленческий»

Далее в регистре бухгалтерии свяжем ресурс Сумма с признаком учета субконто «Суммовой»:

Свойства ресурса Сумма РБ «Управленческий»

Рисунок 6 – Свойства ресурса Сумма РБ «Управленческий»

В настройке предопределенного счета «Товары» для субконто «Инвентарные номера» снимем флаг суммового учета:

Настройка счета «Товары»

Рисунок 7 – Настройка счета «Товары»

Для признака учета «Количественный» устанавливаем флаг «учитывать», так как на счете «Товары» будем вести количественный учет.

Какие возможны ошибки при настройке вида субконто «Инвентарные номера»?

Ошибка №1 – не использовать признак учета субконто совсем или забыть в настройке счета «Товары» для вида субконто снять флаг «суммовой»:

Примеры неверной настройки вида субконто  «Инвентарные номера» – не отключен суммовой учет

Рисунок 8 – Примеры неверной настройки вида субконто «Инвентарные номера» – не отключен суммовой учет

В обоих вариантах по субконто «Инвентарные номера» будет вестись суммовой учет, а себестоимость при этом рассчитывается как средняя по номенклатуре без учета инвентарных номеров. Разберем на примере, что получится в результате списания.

Предположим, что на остатках имеется две уникальные скрипки:

Товар

Инвентарный номер

Кол-во остаток

Стоимость остаток

Скрипка

0001

1

10 000

Скрипка

0002

1

20 000

Итого

2

30 000

Далее обе скрипки были проданы. Себестоимость списания, как средняя по всем инвентарным номерам, составила (10 000 + 20 000)/2 = 15 000.

Так как по инвентарным номерам суммовой учет не отключили, то на остатках после списания будет следующая ситуация:

Товар

Инвентарный номер

Кол-во остаток

Стоимость остаток

Скрипка

0001

0

-5 000

Скрипка

0002

0

5 000

Итого

0

0

Итак, если по виду субконто «Инвентарные номера» не отключить суммовой учет, то после списания товара по количеству на этом субконто будет оставаться остаток по стоимости на разницу между суммой оприходования и суммой себестоимости списания. В таком варианте содержится сразу две ошибки:

Фрагмент из списка часто встречающихся ошибок

Рисунок 9 – Фрагмент из списка часто встречающихся ошибок

Ошибка №2 следует из попытки избавиться от ошибки №1, поставив для вида субконто «Инвентарные номера» флаг «только обороты», вместо использования признака учета субконто:

Примеры неверной настройки вида субконто «Инвентарные номера»: не отключен суммовой учет, а флаг «только обороты» включен

Рисунок 10 – Примеры неверной настройки вида субконто «Инвентарные номера»: не отключен суммовой учет, а флаг «только обороты» включен

Да, при такой настройке вида субконто «Инвентарные номера» суммовой остаток «зависать» уже не будет. Но тут есть другая проблема: в таблице остатков по виду субконто «Инвентарные номера» будут храниться только обороты и по количеству, и по сумме. Данных по остаткам количества по этому виду субконто не будет, а это плохо, так как они нужны для организации контроля отрицательных остатков по количеству в разрезе инвентарных номеров. Использование информации по оборотам регистра вместо информации по остаткам – это ошибка:

Фрагмент из списка часто встречающихся ошибок для неверного варианта №2

Рисунок 11 – Фрагмент из списка часто встречающихся ошибок для неверного варианта №2

Видим, что на экзамене очень важно знать что такое «признак учета субконто» и уметь им пользоваться.

Настройка счета «Прибыли и убытки»

У предопределенного счета «Прибыли и убытки» добавим два вида субконто:

Настройка счета «Прибыли и убытки»

Рисунок 12– Настройка счета «Прибыли и убытки»

Количественный учет по счету «Прибыли и убытки» отключаем. Суммовой учет ведем по обоим видам субконто.

Очень важно установить у обоих видов субконто признак «Только обороты», так как накапливаемый показатель – сумма продажи является оборотным.

Что произойдет, если не установить флаг «Только обороты»? В этом случае на счете «Прибыли и убытки» в разрезе видов субконто «Номенклатура» и «Инвентарные номера» будут хранится суммовые остатки. При этом согласно проводок из условия задачи по Дт счета отражается сумма себестоимости, а по Кт счета – выручка (сумма в продажных ценах), то есть. на остатке будет оставаться прибыль или убыток в разрезе номенклатуры и инвентарного номера.

Ну и что, казалось бы, в этом плохого? Будем знать прибыль по каждому уникальному товару. На первый взгляд – это даже хорошо.

А теперь представим, что нужно отразить распределение полученной прибыли: часть направить на выплату дивидендов акционерам, часть – на формирование резервного фонда и т.п. Но при распределении прибыли уже не хочется вдаваться в подробности, от какого именно уникального товара прибыль пошла на выплату дивидендов, а от какого на пополнение резервного фонда. В проводках, отражающих использование прибыли, не имеет смысла заполнять субконто «Номенклатура» и «Инвентарные номера», а это допустимо, только если эти виды субконто будут оборотными, так как иначе в разрезе субконто получим суммовые остатки, которые никогда не будут списаны.

Итак, если забыть установить флаг Только обороты, то на экзамене за такую ошибку снимут 1,5 балла:

Фрагмент из списка часто встречающихся ошибок

Рисунок 13 – Фрагмент из списка часто встречающихся ошибок

Обработка проведения для документа «Приходная накладная»

С помощью конструктора движений сформируем движения документа «Приходная накладная» по регистру бухгалтерии «Управленческий». Подробнее оформление поступления товаров рассматривали в общем разделе в главе 6 «Приходная накладная» и в разделе задач по бухгалтерскому учету в главе «Расчет себестоимости по средней в разрезе складов. Старая методика контроля остатков».

Листинг обработки проведения:

Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр Управленческий Движения.Управленческий.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.Управленческий.Добавить(); Движение.СчетДт = ПланыСчетов.Управленческий.Товары; Движение.СчетКт = ПланыСчетов.Управленческий.Поставщики; Движение.Период = Дата; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; Движение.КоличествоДт = 1; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныеНомера] = ТекСтрокаСписокНоменклатуры.ИнвентарныйНомер; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры

Так как товары уникальные, то в Движение.КоличествоДт записываем 1.

Обработка проведения для документа «Расходная накладная»

В модуле объекта документа «Расходная накладная» создадим процедуру ОбработкаПроведения и заполним вручную.

Листинг обработки проведения:

Процедура ОбработкаПроведения(Отказ, РежимПроведения) // 1. подготовка регистра бухгалтерии //удаление существующих движений Движения.Управленческий.Записывать = Истина; Движения.Управленческий.Записать(); // 2.установка блокировки данных регистра Блокировка = Новый БлокировкаДанных; Элемент = Блокировка.Добавить("РегистрБухгалтерии.Управленческий"); Элемент.Режим = РежимБлокировкиДанных.Исключительный; Элемент.УстановитьЗначение("Счет", ПланыСчетов.Управленческий.Товары); Элемент.ИсточникДанных = СписокНоменклатуры; Элемент.ИспользоватьИзИсточникаДанных(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура, "Номенклатура"); Блокировка.Заблокировать(); // 3.Запрос получения данных для расчета себестоимости и контроля остатков Запрос = Новый Запрос("ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | СУММА(1) КАК КоличествоСписания |ПОМЕСТИТЬ ТЧСписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.ИнвентарныйНомер | |ИНДЕКСИРОВАТЬ ПО | Номенклатура, ИнвентарныйНомер |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура КАК Номенклатура, | ТЧСписокНоменклатуры.Номенклатура.Представление, | ТЧСписокНоменклатуры.ИнвентарныйНомер.Представление, | ТЧСписокНоменклатуры.ИнвентарныйНомер КАК ИнвентарныйНомер, | ЕСТЬNULL(УпрОстаткиПоНоменклатуре.СуммаОстаток, 0) КАК СуммаОстаток, | ЕСТЬNULL(УпрОстаткиПоНоменклатуре.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(УпрОстаткиПоИнвНомеру.КоличествоОстаток, 0) КАК КоличествоОстатокПоИнвНомеру, | ТЧСписокНоменклатуры.Сумма КАК Сумма, | ТЧСписокНоменклатуры.КоличествоСписания |ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = &Счет, | &МассивВидовСубконто, | Субконто1 В | (ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура | ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры)) КАК УпрОстаткиПоНоменклатуре | ПО ТЧСписокНоменклатуры.Номенклатура = УпрОстаткиПоНоменклатуре.Субконто1 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки( | &МоментВремени, | Счет = &Счет, | &МассивВидовСубконто, | (Субконто1, Субконто2) В | (ВЫБРАТЬ | ТЧСписокНоменклатуры.Номенклатура, | ТЧСписокНоменклатуры.ИнвентарныйНомер | ИЗ | ТЧСписокНоменклатуры КАК ТЧСписокНоменклатуры)) КАК УпрОстаткиПоИнвНомеру | ПО ТЧСписокНоменклатуры.Номенклатура = УпрОстаткиПоИнвНомеру.Субконто1 | И ТЧСписокНоменклатуры.ИнвентарныйНомер = УпрОстаткиПоИнвНомеру.Субконто2 |ИТОГИ | МАКСИМУМ(СуммаОстаток), | МАКСИМУМ(КоличествоОстаток) |ПО | Номенклатура"); //4. Заполнение параметров запроса Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Счет",ПланыСчетов.Управленческий.Товары); //4.1 Определение массива видов субконто МассивВидовСубконто = Новый Массив(); МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныеНомера); Запрос.УстановитьПараметр("МассивВидовСубконто", МассивВидовСубконто); //5. выполняем запрос, получаем выборку по номенклатуре РезультатЗапроса = Запрос.Выполнить(); ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); //6. Цикл по номенклатуре Пока ВыборкаНоменклатура.Следующий() Цикл //6.1. зафиксируем значения вспомогательных переменных КоличествоОстаток = ВыборкаНоменклатура.КоличествоОстаток; СуммаОстаток = ВыборкаНоменклатура.СуммаОстаток; СписаноКоличество = 0; СписаноСумма = 0; //7 организуем цикл по детальным записям ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл //7.1 контроль остатков Если ВыборкаДетальныеЗаписи.КоличествоСписания > ВыборкаДетальныеЗаписи.КоличествоОстатокПоИнвНомеру Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает остатка по номенклатуре " + ВыборкаДетальныеЗаписи.НоменклатураПредставление + " с инвентарным номером " + ВыборкаДетальныеЗаписи.ИнвентарныйНомерПредставление + ". Требуется: "+ВыборкаДетальныеЗаписи.КоличествоСписания+",есть: "+ВыборкаДетальныеЗаписи.КоличествоОстатокПоИнвНомеру; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; //7.2 увеличиваем счетчик списанного количества СписаноКоличество = СписаноКоличество+1; //7.3 расчет себестоимости списания Себестоимость=?(СписаноКоличество = КоличествоОстаток, СуммаОстаток - СписаноСумма, СуммаОстаток/КоличествоОстаток); //7.4 формируем движение по регистру бухгалтерии - //проводка, отражающая списание товара Проводка = Движения.Управленческий.Добавить(); Проводка.Период = Дата; Проводка.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки; Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныеНомера] = ВыборкаДетальныеЗаписи.ИнвентарныйНомер; Проводка.СчетКт = ПланыСчетов.Управленческий.Товары; Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныеНомера] = ВыборкаДетальныеЗаписи.ИнвентарныйНомер; Проводка.КоличествоКт = 1; Проводка.Сумма = Себестоимость; //7.5 увеличиваем счетчик списанной суммы именно по данным движений! //Это важно, чтобы учесть ошибку округления при последнем списании. СписаноСумма = СписаноСумма + Проводка.Сумма; //7.6 формируем движение по регистру бухгалтерии - //проводка по продаже товара Проводка = Движения.Управленческий.Добавить(); Проводка.Период = Дата; Проводка.СчетДт = ПланыСчетов.Управленческий.Покупатели; Проводка.СчетКт = ПланыСчетов.Управленческий.ПрибылиУбытки; Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура; Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ИнвентарныеНомера] = ВыборкаДетальныеЗаписи.ИнвентарныйНомер; Проводка.Сумма = ВыборкаДетальныеЗаписи.Сумма; КонецЦикла; КонецЦикла; КонецПроцедуры

Разберем ключевые точки алгоритма

Подготовка наборов записей регистра бухгалтерии (п.1)

Подготавливаем наборы записей, чтобы при перепроведении документа не учитывались старые движения документа.

Управляемая блокировка данных регистра бухгалтерии (п.2)

Установим управляемую блокировку на данные регистра бухгалтерии «Управленческий» по счету «Товары» и виду субконто «Номенклатура». По виду субконто «Инвентарные номера» блокировку не ограничиваем, так как для расчета себестоимости будут нужны данные по всем инвентарным номерам.

Тема управляемых блокировок рассматривалась в общем разделе в главе 11 «Управляемые блокировки».

Запрос получения данных для расчета себестоимости (п. 3)

Первый запрос пакета – это получение данных из табличной части документа:

  • В списке полей выбора выбираем Номенклатуру, ИнвентарныйНомер, Сумму и в качестве КоличествоСписания берем значение 1
  • В табличной части документа могут быть дубли строк, поэтому делаем группировку по полю Номенклатура и ИнвентарныйНомер
  • Устанавливаем отбор по Ссылке для отбора данных только по документу
  • Для оптимизации производительности индексируем поля Номенклатура и ИнвентарныйНомер. Далее по ним будем соединяться с другими таблицами
  • Результат помещаем во временную таблицу ТЧСписокНоменклатуры.

Второй запрос пакета

Источниками данных для второго запроса послужат:

  • Временная таблица ТЧСписокНоменклатуры, подготовленная первым запросом
  • Виртуальная таблица остатков РБ «Управленческий» (УпрОстаткиПоНоменклатуре) – получим остатки по стоимости и количеству по номенклатуре в целом без детализации по инвентарным номерам. Будем использовать следующие параметры виртуальной таблицы остатков:
    • Период – это значение параметра МоментВремени
    • УсловиеСчета – установим отбор по значению параметра Счет
    • Субконто – в этот параметр будем передавать массив из предопределенных видов субконто. Пользователь в пользовательском режиме может изменить порядок следования субконто на счете. Поэтому, чтобы действия пользователя не влияли на результат запроса, через параметр МассивВидовСубконто определяем свой порядок следования видов субконто для запроса
    • Условие – ограничим выборку данных по Субконто1 номенклатурой из ТЧСписокНоменклатуры. Интересуют остатки только по этой номенклатуре.
  • Параметры виртуальной таблицы для  получения остатков в разрезе номенклатуры

    Рисунок 14 – Параметры виртуальной таблицы для получения остатков в разрезе номенклатуры

  • Виртуальная таблица остатков РБ «Управленческий» (УпрОстаткиПоИнвНомеру) – получим остатки количества по номенклатуре в разрезе инвентарных номеров.
    Будем использовать те же параметры виртуальной таблицы, что и для таблицы УпрОстаткиПоНоменклатуре, за исключением параметра Условие. В этой виртуальной таблице ограничим выборку и по Субконто1, и по Субконто2:
  • Параметры виртуальной таблицы для получения  остатков в разрезе номенклатуры и инвентарных номеров

    Рисунок 15 – Параметры виртуальной таблицы для получения остатков в разрезе номенклатуры и инвентарных номеров

Временную таблицу ТЧСписокНоменклатуры соединяем с таблицей УпрОстаткиПоНоменклатуре по условию, что Номенклатура равна значению Субконто1. С таблицей УпрОстаткиПоИнвНомеру по условию, что Номенклатура равна значению Субконто1 и ИнвентарныйНомер равен значению Субконто2.

В обоих соединениях используем левое соединение, на случай, если соответствующих записей в таблицах с остатками не будет. По этой же причине используем функцию ЕстьNULL() применительно к полям выбора из виртуальных таблиц.

В списке выбранных полей обязательно указываем Номенклатура.Представление и ИнвентарныйНомер.Представление. Они будут нужны для формирования текстовых сообщений по результатам контроля остатков.

Заполнение параметров запроса (п.4)

Заполняем параметры запроса. В п.4.1 через параметр МассивВидовСубконто устанавливаем свой порядок следования субконто. Для этого создаем массив, заполняем его предопределенными видами субконто и передаем в параметры виртуальной таблицы. Порядок следования субконто в результате запроса будет соответствовать порядку элементов в массиве.

Обход выборки из результата запроса (п.5 – 7)

Получаем результат запроса и обходим выборку в цикле.

У нас будет два цикла:

  • Внешний цикл – обход выборки по номенклатуре
  • Вложенный цикл – обход детальных записей по инвентарным номерам.

В рамках итерации внешнего цикла (обхода по номенклатуре) заводим переменные СписаноКоличество и СписаноСумма. Устанавливаем их значение в 0. В них будем накапливать сколько товаров с одинаковой номенклатурой, но разными инвентарными номерами списали и на какую сумму. Это нужно, чтобы правильно определить момент последнего списания и решить «проблему копеек».

Контроль остатков (п.7.1)

В цикле по детальным записям первым делом выполняем контроль отрицательных остатков. Сравниваем количество списания по документу с имеющимся на складе количеством товара с данным инвентарным номером. Условие сравнения имеет вид:

ВыборкаДетальныеЗаписи.КоличествоСписания > ВыборкаДетальныеЗаписи.КоличествоОстатокПоИнвНомеру

Казалось бы, товары уникальные, в табличной части реквизит Количество удалили, почему бы для контроля отрицательных остатков не использовать такое условие:

ВыборкаДетальныеЗаписи.КоличествоОстатокПоИнвНомеру<1

Дело в том, что пользователь может ввести дубли строк и тогда в поле выборки по детальным записям КоличествоСписания может оказаться больше 1, то есть оно по сути будет содержать количество дублей строк.

Если количество списания больше, чем остаток, то выдаем сообщение пользователю и устанавливаем Отказ в истину. Такой документ проведен не будет.

Если Отказ равен истине, то с помощью команды Продолжить прерываем выполнение текущей итерации цикла и передаем управление в начало цикла. Так как в этом случае нет смысла выполнять формирование движений по регистру.

Формирование движений (п.п.7.2 – 7.6)

п. 7.2 – увеличиваем счетчик списанного количества – значение переменной СписаноКоличество.

п.7.3 – списание будет являться последним, если СписаноКоличество будет равно КоличествоОстаток. При последнем списании не будем рассчитывать сумму себестоимости списания по формуле, а возьмем значение СуммаОстаток из строки итогов за вычетом суммы, которую мы уже успели списать и накопили в переменной СписаноСумма.

п.7.4 – формируем движение по регистру бухгалтерии, отражающее списание товара. Все поля движения заполняем в соответствии с проводкой из условия задачи.

п. 7.5 – не забываем увеличить значение переменной СписаноСумма.

Важно: для увеличения переменной СписаноСумма прибавляем именно значение Проводка.Сумма, а не значение переменной Себестоимость. Нужно помнить, что при записи в ресурс регистра происходит автоматическое округление, а в переменной СписаноСумма нужно накапливать именно суммы в том виде, как они были записаны в регистр. Только в этом случае при последнем списании мы сможем получить с помощью формулы СуммаОстатокСписаноСумма значение с учетом ошибки округления и, таким образом, вывести остаток по сумме в ноль.

п.7.6 – формируем движение по регистру бухгалтерии, отражающее выручку от продажи товара.

Проверка результата в режиме «1С:Предприятие»

Оформим поступление товаров с помощью документа «Приходная накладная»:

Документ «Приходная накладная № 1»

Рисунок 16 – Документ «Приходная накладная № 1»

Проверим движения по РБ «Управленческий»:

Проводки документа «Приходная накладная № 1»

Рисунок 17 – Проводки документа «Приходная накладная № 1»

Оформим продажу товаров документом «Расходная накладная». Преднамеренно создадим в нем дубли строк, а также попытаемся продать товар с инвентарным номером, который не поступал:

Документ «Расходная накладная № 1»

Рисунок 18 – Документ «Расходная накладная № 1»

После нажатия на кнопку «ОК» получим следующие сообщения:

Сообщения по результатам контроля остатков  по документу «Расходная накладная № 1»

Рисунок 19 – Сообщения по результатам контроля остатков
по документу «Расходная накладная № 1»

Контроль остатков успешно сработал.

Теперь исправим документ и снова его проведем:

Документ «Расходная накладная № 1»

Рисунок 20 – Документ «Расходная накладная № 1»

Смотрим движениям по регистру бухгалтерии:

Проводки документа «Расходная накладная № 1»

Рисунок 21 – Проводки документа «Расходная накладная № 1»

Обращаем внимание на значения себестоимости списания и видим, что ошибка округления отразилась на себестоимости последнего списанного товара. Результат получился верный!

Подведем итоги

На примере задачи учета товара по инвентарным номерами было разобрано:

  • Как решить задачу, в которой учет товаров ведется в разрезе дополнительной аналитики, а себестоимость нужно рассчитывать как среднюю по номенклатуре без учета дополнительной аналитики
  • Как отключить суммовой учет по одному из субконто
  • Как настроить счета и сформировать проводку для отражения выручки при продаже.

В следующей главе разберем задачу учета товаров в разрезе сроков годности.

Перейти к следующей теме:
“Разработка отчета по продажам уникальных товаров” (дополнение к теме № 7)

Комментарии закрыты