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