Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Билет 15 ОУ          
Sunset1 Подменю пользователя
сообщение 28.11.13, 23:35
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 20
Спасибо сказали: 0 раз
Рейтинг: 0

На пробу что-то небольшое. С виду вроде простое, если там нет подвоха. Или подвох был в побуждении влепить допзатраты в регистр остатков?
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.
Складской учет товаров не ведется.
Списание себестоимости товаров должно быть организовано по партиям, в зависимости метода списания (FIFO или LIFO), принятого в учетной политике. Значение учетной политики меняется не чаще одного раза в год. При проведении документа необходимо использовать метод, актуальный на момент проведения.
Дополнительные затраты при продаже вводятся отдельным документом «Дополнительные затраты» с указанием расходной накладной, к которой относятся эти затраты, номенклатуры и суммы затрат по каждой номенклатурной позиции.
Необходимо построить отчет по продажам товаров за период. В отчете себестоимость должна отражаться с учетом распределенных затрат, вне зависимости от того, в каком периоде был введен документ «Дополнительные затраты».


Сделала рег. Остатки Номенклатура/Партия, Количество/Стоимость
и рег.Продажи (оборотный) Номенклатура, Количество/СуммаПродажи/Стоимость/ДопСтоимость

Расходная накладная, модуль.


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.Остатки.Очистить();
    Движения.Остатки.Записать();
    
    Движения.Продажи.Очистить();
    Движения.Продажи.Записать();
    
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Остатки");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных =Товары;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    Блокировка.Заблокировать();
    


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

    Запрос.УстановитьПараметр("Момент", ?(РежимПроведения=РежимПроведенияДокумента.Оперативный,Дата(1,1,1),МоментВремени()));
    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    Результат = Запрос.Выполнить();

    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаНоменклатура.Следующий() Цикл
        Если ВыборкаНоменклатура.КоличествоОстаток<ВыборкаНоменклатура.Количество и НЕ ВыборкаНоменклатура.Номенклатура.Услуга Тогда
            Отказ=Истина;
            Сообщ=Новый СообщениеПользователю;
            Сообщ.Поле="Товары["+ ВыборкаНоменклатура.НомерСтроки+"].Количество";
            Сообщ.Текст="Мало товара "+ВыборкаНоменклатура.Номенклатура+ " есть "+ВыборкаНоменклатура.КоличествоОстаток+ " надо "+ВыборкаНоменклатура.Количество;
            Сообщ.Сообщить();
        КонецЕсли;    
        
        Если не Отказ Тогда
                        
            ВсегоСебестоимость=0;
            
            Если НЕ ВыборкаНоменклатура.Номенклатура.Услуга   Тогда
                УжеСписано=0;
                Списать =  ВыборкаНоменклатура.Количество;
                Пока Списать > УжеСписано Цикл
                    ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                        СейчасСпишем=МИН(Списать,ВыборкаДетальныеЗаписи.КоличествоОстаток);
                        Движение = Движения.Остатки.Добавить();
                        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                        Движение.Период = Дата;
                        Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
                        Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                        Движение.Количество = СейчасСпишем;
                        Движение.Стоимость = ?(СейчасСпишем=ВыборкаДетальныеЗаписи.Количество,ВыборкаДетальныеЗаписи.СтоимостьОстаток,
                                                           ВыборкаДетальныеЗаписи.СтоимостьОстаток*СейчасСпишем/ВыборкаДетальныеЗаписи.КоличествоОстаток);
                        
                        УжеСписано=УжеСписано+Движение.Количество;
                        
                        ВсегоСебестоимость=ВсегоСебестоимость+Движение.Стоимость;
                    КонецЦикла;    
                КонецЦикла;
            КонецЕсли;
            
            Движение = Движения.Продажи.Добавить();
            Движение.Период=Дата;
            Движение.Номенклатура=  ВыборкаНоменклатура.Номенклатура;
            Движение.Количество = ВыборкаНоменклатура.Количество;
            Движение.СуммаПродажи=ВыборкаНоменклатура.Сумма;
            Движение.Стоимость = ВсегоСебестоимость;

        КонецЕсли;    
    КонецЦикла;
    
    Если не Отказ Тогда
    Движения.Остатки.Записывать = Истина;
    Движения.Продажи.Записывать=Истина;
    КонецЕсли;



Документ ДопЗатраты

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РасхНакл") Тогда
        // Заполнение шапки
        РН = ДанныеЗаполнения.Ссылка;
        Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
            Если НЕ ТекСтрокаТовары.Номенклатура.Услуга Тогда
            НоваяСтрока = Товары.Добавить();
            НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.Продажи.Очистить();
    Движения.Продажи.Записать();
    
    Блокировка = Новый БлокировкаДанных;        //или не надо??
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Продажи");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных =Товары;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    Блокировка.Заблокировать();

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

    Запрос.УстановитьПараметр("МоментРН", РН.МоментВремени());
    Запрос.УстановитьПараметр("РН", РН);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    Результат = Запрос.Выполнить();

    ВыборкаНоменклатура = Результат.Выбрать();

    Пока ВыборкаНоменклатура.Следующий() Цикл
        Если  ВыборкаНоменклатура.КоличествоРасход=0 Тогда
            Сообщить("Нет в РН "+ВыборкаНоменклатура.Номенклатура); // вдруг всунули в ДопЗатраты то чего нет в РН
            Отказ=Истина;
        КонецЕсли;    
        
        Если не Отказ Тогда
                Движение = Движения.Продажи.Добавить();
                Движение.Период = РН.Дата;   //можно так??????????  Нам нужно чтоб ДопЗатраты относились к периоду РН
                Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
                Движение.Количество = 0;
                Движение.Стоимость = 0;
                Движение.ДопСтоимость =  ВыборкаНоменклатура.СуммаДопЗатраты;
        КонецЕсли;
    КонецЦикла;


    Если не Отказ Тогда
        Движения.Продажи.Записывать = Истина;
    КонецЕсли;


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


Отчет на три строчки из одного регистра.

Может надо контролировать в РН, если она распроводится, чтоб это ДопЗатраты ругались или сторнировались? Или это не наша забота?

зы ФИФО и ЛИФО не хочу заморачиваться. Ну понятно что регистр сведений и т.п. В учебных целях оно только мешает.

Сообщение отредактировал Vofka - 01.12.13, 11:59

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 24.04.24, 11:54
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!