Выручка и себестоимость по чекам в УТ 11.4

Дата: 15 февраля 2021. Объем: 1.5 час.

Клиент обратился с проблемой, что в УТ 11.4 не ведётся расчет выручки и прибыли по чекам. Т.е. анализ этих важных для бизнеса показателей запаздывает на один день и не является оперативным.

Он сказал, что на Инфостарте видел отчеты, которые собирают вместе выручку по чекам и другим документам. Но я поискал и не нашел таких отчетов.

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

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

Объем работ я несколько не дооценил, но в конечном итоге, в него вписался.

Сначала я думал скопировать код по заполнению из документа «Отчет о розничных продажах», но, поковырявшись в типовом коде минут 10, бросил это гиблое дело. Аналитики номенклатуры и партнеров оказалось несложно получить и самому. А движения я сделал построчно — не люблю использовать запросы там, где они не дают ощутимого прироста скорости. В чеках, поди не тысячи строк.

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

Для экономии времени не трогал чеки возвратов, но предупредил клиента об этом.

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

Добавил еще и условие, чтобы для архивных чеков движения не делались.

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

В итоге получилось довольно неплохо:

Код повесил на подписку события «Обработка проведения»:

Процедура дор_ДополительныеДвиженияЧекаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
   
//Осипов 2021-02-04

    //У архивных ничего не дописываем
   
Если Источник.Архивный Тогда
        Возврат;
    КонецЕсли;


   
УстановитьПривилегированныйРежим(Истина);



   
//Создаем аналитику по партнерам
   
Структура = Новый Структура();
   
Структура.Вставить(«Партнер», Источник.Партнер);
   
Структура.Вставить(«Контрагент», Справочники.Контрагенты.ПустаяСсылка());
   
Структура.Вставить(«Организация», Источник.Организация);

   
КлючАналитикиУчетаПоПартнерам = РегистрыСведений.АналитикаУчетаПоПартнерам.ЗначениеКлючаАналитики(Структура);


   
//Создаем аналитики номенклатуры
   
СтруктураАналитики = Новый Структура();
   
СтруктураАналитики.Вставить(«Номенклатура», );
   
СтруктураАналитики.Вставить(«Серия», );
   
СтруктураАналитики.Вставить(«Характеристика», );
   
СтруктураАналитики.Вставить(«Склад», Источник.Склад);
   
СтруктураАналитики.Вставить(«Организация», Источник.Организация);

   
З = Новый Запрос(
   
«ВЫБРАТЬ
    |    ТН.Ссылка КАК Номенклатура,
    |    ТН.ТипНоменклатуры КАК ТипНоменклатуры,
    |    ЕСТЬNULL(ТС.Стоимость, 0) КАК Цена
    |ИЗ
    |    Справочник.Номенклатура КАК ТН
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтоимостьТоваров.СрезПоследних(&Дата, ) КАК ТС
    |        ПО ТН.Ссылка = ТС.АналитикаУчетаНоменклатуры.Номенклатура
    |ГДЕ
    |    ТН.Ссылка В(&Товары)»
);
   
З.УстановитьПараметр(«Товары», Источник.Товары.Выгрузить(, «Номенклатура»).ВыгрузитьКолонку(«Номенклатура»));
   
З.УстановитьПараметр(«Дата», Источник.Дата);
   
ТЗСС = З.Выполнить().Выгрузить();

   
//Проводки по себестоимости
   
НЗ = РегистрыНакопления.ВыручкаИСебестоимостьПродаж.СоздатьНаборЗаписей();
   
НЗ.Отбор.Регистратор.Установить(Источник.Ссылка);


    Для Каждого
Строка ИЗ Источник.Товары Цикл

       
//Аналитики учета номенклатуры
       
СтруктураАналитики.Номенклатура = Строка.Номенклатура;
       
СтруктураАналитики.Серия = Строка.Серия;
       
СтруктураАналитики.Характеристика = Строка.Характеристика;
       
КлючАналитикиУчетаНоменклатуры = РегистрыСведений.АналитикаУчетаНоменклатуры.ЗначениеКлючаАналитики(СтруктураАналитики);


       
//Рассчеты
       
Если Источник.ЦенаВключаетНДС Тогда
           
СуммаСНДС = Строка.Сумма;
           
СуммаБезНДС = Строка.Сумма Строка.СуммаНДС;
        Иначе
           
СуммаСНДС = Строка.Сумма + Строка.СуммаНДС;
           
СуммаБезНДС = Строка.Сумма;
        КонецЕсли;

       
ИскСС = ТЗСС.Найти(Строка.Номенклатура, «Номенклатура»);
       
ЦенаСС = ИскСС.Цена;
       
СуммаСС = ЦенаСС * Строка.Количество;
        Если
СуммаСС = 0 Тогда  //Чтобы не было больших выручек из воздуха.
           
СуммаСС = СуммаСНДС;
        КонецЕсли;

       
//НЗ.Прочитать(); //Не читаем, там ничего стандартно не будет
       
МЗ = НЗ.Добавить();
       
МЗ.Период = Источник.Дата;
       
МЗ.АналитикаУчетаНоменклатуры = КлючАналитикиУчетаНоменклатуры;
       
МЗ.АналитикаУчетаПоПартнерам = КлючАналитикиУчетаПоПартнерам;
       
МЗ.Склад = Источник.Склад;
       
МЗ.Количество = Строка.Количество;
       
МЗ.СуммаВыручки = СуммаСНДС;
       
МЗ.СуммаВыручкиРегл = СуммаБезНДС;
       
МЗ.СуммаВыручкиСНДСРегл = СуммаСНДС;
       
МЗ.СуммаВыручкиБезНДС = СуммаБезНДС;
       
МЗ.Стоимость = СуммаСС;
       
МЗ.СтоимостьБезНДС = ?(СуммаСНДС = 0, 0, СуммаСС * (СуммаБезНДС/СуммаСНДС)); //Пропорцией
       
МЗ.СтоимостьУпр = МЗ.Стоимость;
       
МЗ.СтоимостьРегл = МЗ.Стоимость;

        Если
ИскСС.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
           
МЗ.ТипЗапасов = Перечисления.ТипыЗапасов.Услуга;
        Иначе
           
МЗ.ТипЗапасов = Перечисления.ТипыЗапасов.Товар;
        КонецЕсли;



    КонецЦикла;

   
НЗ.Записать();

КонецПроцедуры

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *