В практике автоматизации розничной торговли часто возникает задача: в документе поступления (приходной накладной) пользователь указывает фактические закупочные цены и суммы поставщика, однако учет остатков и стоимости в регистрах накопления должен вестись по розничным (продажным) ценам. Разберем по шагам, как правильно организовать такой учет в платформе 1С, какую структуру регистров выбрать и как доработать модуль проведения документа.
При использовании учетной оценки по продажным ценам документ поступления фиксирует факт покупки по цене поставщика, но движении по ресурсам стоимости в регистр накопления записывается сумма, рассчитанная из установленной продажной цены. Для этого перед проведением документа поступления в системе уже должны быть зарегистрированы розничные цены для поступающих позиций номенклатуры.
Рассмотрим порядок действий для реализации этой схемы:
ЦеныНоменклатуры).СрезПоследних.Для хранения установленных розничных цен создадим или задействуем периодический регистр сведений ЦеныНоменклатуры (периодичность — В пределах секунды или В пределах дня).
Измерения и ресурсы регистра сведений:
Номенклатура (Тип: СправочникСсылка.Номенклатура), ТипЦен (Тип: СправочникСсылка.ТипыЦен, если используется несколько типов цен).Цена (Тип: Число, точность 2).Проанализируем исходную структуру из вопроса. Использование двух отдельных регистров (ОстаткиТоваров только для количества и СтоимостьТоваров только для суммы) является избыточным и потенциально приводит к рассинхронизации данных. Кроме того, сохранение в измерениях наименования номенклатуры в виде строки (ТекСтрока.Наименование) является критической ошибкой. В измерениях должна храниться ссылка на справочник.
Рекомендуется объединить учет в один регистр накопления остатков УчетТоваров со следующей структурой:
Номенклатура (Тип: СправочникСсылка.Номенклатура), Склад (Тип: СправочникСсылка.Склады).Количество (Тип: Число), СтоимостьПродажная (Тип: Число).Разберем алгоритм получения розничной цены и формирования движений в процедуре ОбработкаПроведения модуля документа. Нам потребуется обратиться к регистру сведений ЦеныНоменклатуры через выборку или запрос.
Рассмотрим пример кода с использованием метода СрезПоследних объекта РегистрыСведений.ЦеныНоменклатуры:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.УчетТоваров.Записывать = Истина;
Движения.УчетТоваров.Очистить();
Для Каждого ТекСтрока Из СписокТоваров Цикл
// 1. Получаем актуальную продажную цену из регистра сведений
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ТекСтрока.Номенклатура);
Отбор.Вставить("ТипЦен", Справочники.ТипыЦен.Розничная);
СрезЦен = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата, Отбор);
Если СрезЦен.Количество() = 0 Или СрезЦен[0].Цена = 0 Тогда
Сообщить("Для товара """ + ТекСтрока.Номенклатура + """ не задана розничная цена!");
Отказ = Истина;
Возврат;
КонецЕсли;
ПродажнаяЦена = СрезЦен[0].Цена;
ПродажнаяСумма = ТекСтрока.Количество * ПродажнаяЦена;
// 2. Формируем движение по регистру остатков в продажных ценах
Движение = Движения.УчетТоваров.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрока.Количество;
Движение.СтоимостьПродажная = ПродажнаяСумма;
КонецЦикла;
КонецПроцедуры
Для повышения производительности при проведении документов с большим количеством строк рекомендуется делать не отдельные обращения к СрезПоследних в цикле, а один запрос к таблице РегистрыСведений.ЦеныНоменклатуры.СрезПоследних по всем позициям из табличной части документа.
Выясним важные нюансы, которые необходимо учитывать при проектировании системы с такой моделью учета:
ПереоценкаТоваров, который делает корректировочные движения (дооценку или уценку) по ресурсу СтоимостьПродажная.Отказ = Истина, иначе учетная стоимость оприходованного товара станет нулевой.