Учебный курс: Подготовка на 1С:Специалист по платформе 1С:Предприятие 8.3
Задачи оперативного учета – тема № 4:
Как реализовать учет номенклатуры в различных единицах измерения
Для одного и того же товара на разных этапах работы бывает удобнее использовать различные единицы измерения.
Например, батарейки в розницу продаются упаковками по 4 штуки. В магазин со склада они поступают в коробках по 25 упаковок (100 штук), а на складе их получают от поставщика и хранят в ящиках по 10 коробок (1 000 штук).
Бывает, что батарейки в магазине не только продают, но и поштучно расходуют на другие цели. Например, их могут использовать в пульте от кондиционера или телевизора, установленных в магазине. Или для выдачи покупателям вместе с электронными товарами, если и комплектные батарейки были утеряны или испорчены.
При внесении данных в учетную систему удобнее указывать количество в тех единицах измерения, которые используются при работе с товаром и которые указаны в бумажных документах:
- в магазине – штуки, упаковки и коробки,
- на складе – коробки и ящики.
Но для хранения данных об остатках товаров количество каждого товара должно быть выражено в какой-то одной единице измерения. В противном случае итоги по количеству будут некорректными.
Предположим, что в магазин поступило 3 коробки, было продано 10 упаковок, и 2 штуки израсходованы на хозяйственные нужды. Сколько осталось в магазине?
Если считать напрямую, получится бессмыслица: (3 коробки – 10 упаковок – 2 штуки) = –9, причем непонятно чего: коробок? упаковок? штук?
Если принять, что для количества батареек в остатках используют единицу измерения «штука», то получается корректный результат: (3 x 100 – 10 x 4 – 2) = 258 штук.
Единицу измерения, в которой указывается количество остатка товара, называют единицей хранения остатков. Как правило, это самая мелкая из используемых для работы с товаром единиц измерения.
Документы, которые вносятся в систему, должны в движениях по регистрам использовать количество, выраженное в единицах хранения остатков.
Этого можно добиться, если указывать количество в документах также в единицах хранения товаров. Но для пользователей это было бы неудобно: им пришлось бы каждый раз вручную пересчитывать количество в нужную единицу измерения. А это чревато как потерей времени, так и ошибками при пересчете. Поэтому применяют иной подход: в документе указывается та единица измерения, с которой в действительности имеет дело пользователь, а пересчет в единицу хранения остатков выполняется автоматически.
Для полного понимания решения, которое мы рассмотрим далее, рекомендуется предварительно изучить кванты общего раздела, посвященные новой методике контроля остатков и управляемым блокировкам.
Постановка задачи
Поступление и продажа товаров отражаются документами «Приходная накладная» и «Расходная накладная» соответственно. В этих документах требуется реализовать возможность задания количества товаров в различных единицах измерения. Например:
- в штуках
- в коробках, содержащих по 10 штук
- ящиках по 50 штук.
Набор единиц измерения для каждой номенклатурной позиции индивидуален и может содержать произвольное количество единиц измерения. Например, для одного товара:
- штука
- коробка из 10 штук
- ящик из 30 штук
- палета из 20 коробок, т.е. из 200 штук.
Для другого товара:
- бутылка
- коробка из 6 бутылок
- ящик из 20 бутылок.
При выполнении движений по регистрам документы должны автоматически пересчитывать количество из выбранных в документе единиц измерения в единицу хранения остатков. Например, если в накладной будет указана продажа 3 коробок, то в движениях регистра должны быть списаны 30 штук (для данной номенклатуры единица хранения остатков – штука).
Такая подзадача – пересчет количества из единицы измерения, указанной в документе, в единицу хранения остатков – встречается в следующих задачах сборника для подготовки к экзамену «1С:Специалист по платформе»: 1.10, 1.15, 1.23.
Заметим, что в задачах сборника единицы измерения учитываются только при продаже, в то время как в рассмотренной задаче они учитываются как при продаже, так и при поступлении. Это сделано в образовательных целях для демонстрации некоторых подходов к построению конфигурации. Сам же принцип решения данной задачи подходит и для решения упомянутых выше задач сборника для подготовки к экзамену.
Построение учетной схемы
Основные объекты
Исходя из постановки задачи, для решения потребуются следующие объекты:
- справочник «Номенклатура»
- справочник «Единицы измерения»
- документ «Приходная накладная»
- документ «Расходная накладная»
- регистр накопления «Остатки номенклатуры».
Для справочника Номенклатура будет достаточно стандартного реквизита – Наименование.
Справочник «Единицы измерения» будет подчинен справочнику «Номенклатура» (напомним, для каждой позиции номенклатуры могут быть свои индивидуальные единицы измерения). Для единицы измерения определим коэффициент пересчета – числовой реквизит Коэффициент, который задает количество содержащихся в ней единиц хранения остатков. Он понадобится для пересчета из одной единицы в другую.
Для позиций номенклатуры указывать в явном виде единицы хранения остатков не будем: пересчеты будут выполняться исключительно на основе заданных для единиц измерения коэффициентов пересчета. При решении экзаменационной задачи этого будет вполне достаточно.
Будем исходить из предположения, что единица хранения остатков – это единица измерения, у которой коэффициент пересчета равен 1.
В документах «Приходная накладная» и «Расходная накладная» будет табличная часть со следующими реквизитами: Номенклатура, ЕдиницаИзмерения, Количество, Коэффициент. Заполняться коэффициент пересчета (реквизит Коэффициент) в строке документа будет автоматически при выборе пользователем единицы измерения. При проведении документов для вычисления количества в единицах хранения остатков будет использоваться значение реквизита Коэффициент из строки табличной части документа.
Для хранения данных об остатках товаров будет использоваться регистр накопления «Остатки номенклатуры» (вид регистра – остатки). У него будет одно измерение – Номенклатура и один ресурс – Количество.
Исходя из постановки задачи можно предположить, что в операциях поступления и отгрузки будут участвовать штучные товары. Поэтому для упрощения решения ограничим значения реквизитов Количество и Коэффициент целыми числами. При необходимости точность этих реквизитов можно было бы увеличить, например, до 3 знаков после запятой. Это позволило бы не ограничиваться штучными товарами, а также использовать и те единицы измерения, которые составляют дробную часть от единицы хранения остатков.
Почему бы не упростить решение?
Нетрудно заметить, что коэффициент пересчета хранится и в справочнике «Единицы измерения», и в табличных частях документов «Приходная накладная» и «Расходная накладная». На первый взгляд, можно было бы использовать и более простое решение – если хранить коэффициент пересчета только в справочнике «Единицы измерения». В этом случае при проведении документов имелись бы все необходимые данные для выполнения пересчета в единицу хранения остатков. Для этого достаточно было бы получить коэффициент пересчета из единицы измерения в строке документа и умножить его на количество в документе.
Казалось бы, это вполне рабочее решение. Однако оно обладает следующими недостатками.
Во-первых, так как при проведении документа используются внешние (относительно документа) данные, система становится менее устойчивой, ее поведение будет менее предсказуемым для пользователей.
Обычно предполагается, что если документ перепроводится, и при этом сам документ явно не менялся, то и результат его работы измениться не должен. То есть говорят, что документ – это зафиксированная хозяйственная операция.
В данном случае, если изменится коэффициент пересчета в элементе справочника, перепроведение документа даст результат, отличный от первоначального, хотя данные самого документа не изменились. Такое поведение системы является неприемлемым и на экзамене признается ошибкой со следующей формулировкой: «Не реализована возможность корректного перепроведения документов задним числом».
Проиллюстрируем это на примере.
30 апреля пользователь Иванов оприходовал на склад 5 коробок бумаги, в каждой коробке по 5 пачек, итого поступило на склад 25 пачек бумаги. Затем 1 июня бумага поступила на склад в новой упаковке – в коробках по 10 пачек. И пользователь Петров, вместо того, чтобы завести новую единицу измерения «Коробка (10 пачек)», по ошибке исправил данные у существующей единицы измерения «Коробка (5 пачек)», изменив коэффициент пересчета с 5 на 10.
Новый документ провелся корректно, на тот момент данные по остаткам товаров на складе соответствовали реальности.
Далее, 30 июня в рамках операции закрытия 2 квартала были перепроведены все документы движения ТМЦ за квартал. При этом первый документ изменил свои движения, в результате чего теперь на складе числится на 25 пачек бумаги больше. В итоге через некоторое время инвентаризация на складе покажет ошибочную недостачу в 25 пачек бумаги, и найти причину этой ошибки будет довольно трудно, ведь изменений данных самих документов нигде не зафиксировано.
Во-вторых, при проведении документа для получения всех данных, необходимых для выполнения движений, нужно будет обращаться не к одной таблице базы данных (табличной части документа), а к двум (табличная часть документа и справочник единиц измерения). А это увеличит нагрузку на систему.
Чтобы избавиться от описанных выше недостатков, мы и поместили коэффициент пересчета (реквизит Коэффициент) в табличные части документов. В нашем варианте при проведении документа для пересчета в единицу хранения остатков будет использоваться значение коэффициента пересчета, сохраненное в строке документа. Это обеспечит корректное перепроведение документов, которое не будет зависеть от изменений в справочнике «Единицы измерения».
Неявное определение единицы хранения остатков
В задании фигурирует термин «единица хранения остатков». Это та единица измерения, в которой выражаются количественные остатки регистров для данной позиции номенклатуры.
Возможен вариант решения, в котором единица хранения остатков для номенклатуры определяется явно – созданием соответствующего реквизита для справочника «Номенклатура». В качестве значения этого реквизита выбирается одна из единиц измерения, подчиненных позиции номенклатуры. Для единиц измерения определяются коэффициенты пересчета в единицу хранения остатков. Для единицы измерения, выбранной в качестве единицы хранения остатков, коэффициент пересчета принудительно задается равным 1, для остальных единиц измерения он указывается произвольно.
Возможен также и более универсальный вариант решения, в котором, подобно типовым конфигурациям, используется независимый классификатор единиц измерения.
Одна из единиц измерения из классификатора назначается для позиции номенклатуры как единица хранения остатков. Для позиции номенклатуры создается также список всех возможных единиц измерения (из классификатора) – через подчиненный справочник «Единицы измерения». Каждый из элементов этого справочника содержит ссылку на единицу измерения из классификатора – так происходит сопоставление позиции номенклатуры и тех единиц измерения из классификатора, которые могут применяться для данной номенклатуры.
В подчиненном справочнике для единиц измерения определяются коэффициенты пересчета в единицу хранения остатков. Для единицы измерения, выбранной в качестве единицы хранения остатков, коэффициент пересчета принудительно задается равным 1, для остальных единиц измерения он указывается произвольно.
Эти решения более удобны для пользователей, универсальны, позволяют выводить в отчетах о движениях и остатках не только количество, но и те единицы, в которых это количество выражено. Однако такие решение более горомоздки, более трудоемки для реализации, требуют дополнительных алгоритмов заполнения, проверки корректности и согласованности данных.
При решении экзаменационных задач имеет смысл использовать более простое решение. Для позиций номенклатуры можно не определять единицы хранения остатков в явном виде. Чтобы выполнить пересчеты при проведени, достаточно знать только коэффициенты пересчета количества из выбранных в документе единиц измерения в единицу хранения остатков. Поэтому можно ограничиться заданием коэффициентов пересчета для единиц измерения. А за единицу хранения остатков условно принять такую единицу измерения, у которой коэффициент пересчета равен 1.
Для решения экзаменационной задачи такой вариант вполне подойдет. И именно этот вариант реализован в нашем решении.
Зачем создавать формы у документов?
Заполняться коэффициент пересчета в строке документа будет автоматически при выборе единицы измерения. Чтобы избежать рассогласования данных, нужно запретить пользователю изменять коэффициент пересчета в строке документа – так мы обеспечим соответствие коэффициента пересчета в строке документа и единице измерения.
Именно эти два соображения приводят к тому, что для документов необходимо будет создать формы, в которых можно будет сделать нужные настройки. В противном случае формы можно было бы и не создавать – вполне достаточно было бы и тех, которые система автоматически генерирует при запуске.
Заметим также, что в интерфейсе документов нужно сделать так, чтобы пользователь мог выбирать только те единицы измерения, которые принадлежат номенклатуре в строке документа – ведь единицы измерения в данной задаче индивидуальны для каждой позиции номенклатуры. Однако только из-за этого требования создавать форму не пришлось бы – подобное поведение можно реализовать и настройками свойств реквизитов документов.
Зачем выносить алгоритм в общий модуль?
Как упоминалось ранее, коэффициент пересчета будет храниться в строке документа и заполняться при выборе единицы измерения. Функцию, которая получает данный коэффициент, можно было бы реализовать непосредственно в модуле формы каждого из документов.
Но так как документов несколько, а алгоритмы получения коэффициента пересчета идентичны, то одна и та же функция дублировалась бы в нескольких модулях конфигурации. А это не самый удачный вариант решения, хотя бы из соображений удобства дальнейшей поддержки конфигурации. Лучше, если есть возможность, однократно определить общие алгоритмы в общедоступных местах конфигурации и затем вызывать их из всех объектов, где это требуется.
Запрет пустых значений
Исходя из логики задачи, значения номенклатуры в документах и регистре не могут быть пустыми. Также не имеют смысла незаполненные значения для количества, единицы измерения и коэффициента пересчета. Поэтому для реквизитов Номенклатура, Количество, ЕдиницаИзмерения, Коэффициент документов «Приходная накладная» и «Расходная накладная», а также для реквизита Коэффициент справочника «Единицы измерения» установим свойство «Проверка заполнения» в значение «Выдавать ошибку». А для измерения Номенклатура регистра «Остатки номенклатуры» установим свойство «Запрет незаполненных значений» в Истина.
Практическая реализация
Создание объектов конфигурации
Так как решение строим на каркасной конфигурации, прежде всего проанализируем, какие из требуемых объектов там уже есть, какие нужно добавить, устраивает ли нас набор реквизитов, нужно ли что-то изменить в свойствах объектов.
Справочник «Номенклатура» из каркасной конфигурации нас полностью устраивает.
Справочник «Единицы измерения» отсутствует, создадим его:
-
- Реквизиты:
- Коэффициент (Число 10, 0; Неотрицательное):
- Реквизиты:
Рисунок 1 – Реквизиты справочника «Единицы измерения»
- Владелец – справочник «Номенклатура»:
Рисунок 2 – Настройка подчинения справочника «Единицы измерения»
Для реквизита Коэффициент установим свойство «Проверка заполнения» в значение «Выдавать ошибку»:
Рисунок 3 – Свойства реквизита Коэффициент справочника «Единицы измерения»
Документы «Приходная накладная» и «Расходная накладная» уже имеются в каркасной конфигурации. Изменим их, как описано ниже.
В документе «Приходная накладная» в табличной части СписокНоменклатуры:
- Добавим реквизиты:
- ЕдиницаИзмерения (СправочникСсылка.ЕдиницыИзмерения)
- Коэффициент (Число 10, 0; Неотрицательное)
- Оставим без изменения реквизиты:
- Номенклатура (СправочникСсылка.Номенклатура)
- Количество (Число 10, 0; Неотрицательное).
Прочие реквизиты документа в этой задаче не используются, оставим их, как есть.
В результате документ «Приходная накладная» будет иметь следующую структуру:
Рисунок 4 – Структура документа «Приходная накладная»
Для реквизитов Номенклатура, ЕдиницаИзмерения, Коэффициент, Количество установим свойство «Проверка заполнения» в значение «Выдавать ошибку»:
Рисунок 5 – Свойства реквизита Номенклатура документа «Приходная накладная»
Далее нужно сделать так, чтобы пользователь мог выбирать только те единицы измерения, которые принадлежат номенклатуре в строке документа.
Более того, при изменении номенклатуры значение единицы измерения должно очищаться, так как будет некорректным, если в этом случае сохранится значение «чужой» единицы измерения. Чтобы это сделать, откроем на редактирование свойство «Связи параметров выбора» реквизита ЕдиницаИзмерения табличной части документа:
Рисунок 6 – Свойства «Связи параметров выбора» для реквизита документа ЕдиницаИзмерения
Из доступных реквизитов перенесем СписокНоменклатуры.Номенклатура в таблицу Параметры и убедимся, что «Режим изменения связанного значения» установлен в значение «Очищать»:
Рисунок 7 – Настройка свойства «Связи параметров выбора» для реквизита ЕдиницаИзмерения
Заметим, что свойство «Связи параметров выбора» имеется и у элемента формы, и эффект от его установки был бы аналогичным. Если у элемента формы и реквизита документа есть совпадающие свойства, свойства элемента формы являются более приоритетными и позволяют переопределить настройки для реквизита.
В решении данной задачи предполагается создание формы, и можно было бы определить свойство «Связи параметров выбора» для элемента формы. Однако формы для объектов мы будем создавать далеко не всегда – зачастую достаточно форм, автоматически генерируемых системой «на лету». Поэтому мы предпочли более универсальное решение: определили это свойство у реквизита документа.
Для документа «Расходная накладная» проделаем те же действия, что и для документа «Приходная накладная» – структура этих документов идентичная.
Для хранения остатков будем использовать уже имеющийся в каркасной конфигурации регистр накопления «Остатки номенклатуры». Вид данного регистра – Остатки:
Рисунок 8 – Основные свойства регистра накопления «Остатки номенклатуры»
Он имеет следующую структуру:
Рисунок 9 – Структура данных регистра накопления «Остатки номенклатуры»
Состав измерений и ресурсов этого регистра нас полностью устраивает, оставим их без изменения:
- Измерение Номенклатура (СправочникСсылка.Номенклатура)
- Ресурс Количество (Число 10, 0).
Для измерения Номенклатура установим свойство «Запрет незаполненных значений» в Истина:
Рисунок 10 – Свойства измерения Номенклатура регистра накопления
«Остатки номенклатуры»
Установим для регистра в качестве регистраторов документы «Приходная накладная» и «Расходная накладная»:
Рисунок 11 – Регистраторы регистра накопления «Остатки номенклатуры»
На этом подготовительные действия для решения задачи завершены. Был произведен анализ условий задачи, на его основе разработана учетная схема решения. Также были созданы все необходимые объекты конфигурации.
В следующем разделе нам предстоит «оживить» нашу конфигурацию: разработать формы документов, сделать так, чтобы коэффициент пересчета заполнялся автоматически при выборе единицы измерения, а также разработать алгоритмы проведения документов.
Кроме того, на тестовом примере будет наглядно продемонстрировано, как работает наше решение. Мы также убедимся, что получаются правильные результаты.
Комментарии закрыты