Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как из регистра накопления получить стоимость для расх. накладной?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
MihaSerb
Подскажите мне пожалуйста направление для размышления, мне необходимо чтобы при создание документа Расходная накладная списывался товар со складов по себестоимости, определяет стоимость товара в регистре с измерениями (Сумма и количество). Как это возможно реализовать?
logist
В регистре должны быть Измерения: Товар, Склад и Ресурсы Количество, Сумма.
Vofka
Не "измерения", а ресурсы; не "при создании документа", а при проведении. faceoff.gif

Советую ознакомиться и выучить хотя бы базовую терминологию, а то ой как тяжело вам будет и помочь никто нормально не поможет. То что вы спрашиваете - это основы основ, которые описаны во многих книгах. Посмотрите книгу Радченка, много интересного для себя откроете.
MihaSerb
Цитата(Vofka @ 08.02.13, 14:25) необходимо зарегистрироваться для просмотра ссылки
Не "измерения", а ресурсы; не "при создании документа", а при проведении. faceoff.gif

Советую ознакомиться и выучить хотя бы базовую терминологию, а то ой как тяжело вам будет и помочь никто нормально не поможет. То что вы спрашиваете - это основы основ, которые описаны во многих книгах. Посмотрите книгу Радченка, много интересного для себя откроете.


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




ВЫ тоже не сразу же научились на велосипеде ездить.
Vofka
Цитата(MihaSerb @ 08.02.13, 16:57) необходимо зарегистрироваться для просмотра ссылки
Я ее уже прочитал, перелапатил кучу форумов и статей, в книге есть похожее задание я в нем разобрался, но мое сделать не получается.

Ну так что, по быстренькому стелепатировать что вам надо и чем ваше задание отличается от того, что в книге и написать готовое решение? Короче, из вашего вопроса непонятно нифига. Я могу сейчас написать готовый код, но вопросов станет ещё больше, а ещё в результате окажется, что код не правильный, т.к. у вас там какие-то приколы свои.
MihaSerb
Ну и какой у меня тогда выход, может тогда подскажите что мне еще можно почитать чтобы более тщательней ознакомиться с 1С.
Vofka
Я вам рекомендую описать проблему человеческим языком. Если затрудняетесь - вставьте сюда участок из Радченко и скажите чем он вам не подходит. Вообще у нас в разделе для программистов, в большинстве случаев общаются с использованием кода. Вы хоть одну строчку написали? Нет? В чем конкретно проблема?
Zaval
Хм...
1. Если у Вас в регистре по товару есть ОстатокКво и ОстатокСумма, а Вам нужно списать КвоСписания(которое < ОстатокКво), то ничего, кроме КвоСписания и
СуммаСписания = ОстатокСумма/ОстатокКво*КвоСписания

списывать нельзя.
2. А себестоимостью это будет в том случае, если в этом же регистре учтены все затраты, связанные с покупкой, транспортировкой, предпродажной подготовкой, хранением, ..., ..., ... этого товара.

Не замечаете, что связь между 1 и 2 отсутствует как таковая?

ЗЫ. Извините, но столь вольное обращение с терминами не вяжется с "кучей прочитанного" smile.gif
Домовик
это лабораторная какая-то? в инете они должны быть уже. ищите по ключевым "оперативный учет". есть такие методички по подготовке к сертифицированию программистов 1С, ищите по тому же оперативному учету. и введение в конфигурирование. там объяснения до картинок
MihaSerb
Цитата(Vofka @ 08.02.13, 18:20) необходимо зарегистрироваться для просмотра ссылки
Я вам рекомендую описать проблему человеческим языком. Если затрудняетесь - вставьте сюда участок из Радченко и скажите чем он вам не подходит. Вообще у нас в разделе для программистов, в большинстве случаев общаются с использованием кода. Вы хоть одну строчку написали? Нет? В чем конкретно проблема?





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

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

    Результат = Запрос2.Выполнить();
    
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
             Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

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

      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

      Движение.Период = Дата;

      Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;

      Движение.Склад = ВыборкаДетальныеЗаписи.Склад;

      Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
      
      Движение.Сумма = ВыборкаДетальныеЗаписи.Сумма;


   КонецЦикла;

   Движения.Записать();




У Радченко отдельный регистр стоимость, а как у меня в задании вывести стоимость я не предполагаю.
Домовик
у вас цена в запросе - это цена продажи в расходной. вы ей присваиваете себестоимость(путаете) . в запросе нужно сразу добавить поле Себестоимость и формулу(в запросе) СуммаОстаток поделить на Количество остаток.


когда обходите результат выполненного запроса. используете готовое значение Себестоимости. ваш расход равен Себестоимость умножить на Количество(поле из дока).


Но это не все. Есть ньюанс с копейками. Когда количество списываемого равно количеству на остатке, нужно списать просто весь остаток.


если все же без поля себестоимость в запросе
Если ВыборкаДетальныеЗаписи.Количество<ВыборкаДетальныеЗаписи.КоличествоОСтаток Тогда
     Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОСтаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.Количество
Иначе
     Движение.Сумма=ВыборкаДетальныеЗаписи.СуммаОстаток
КонецЕсли;
Zaval
Еще и я попробую smile.gif
Цена для РТиУ(Реализации...) устанавливается либо произвольно либо посредством пересчета из другой цены. Можно даже поставить "от фонаря" в самом документе.
Сумма в документе рассчитыватеся из этой цены.
Эта сумма - для учета взаиморасчетов с Контрагентом.
Ни цена, ни сумма документа никак не влияют на себестоимость. Со склада списывается именно себестоимость - остаток по регистру, пересчитанный на проданное количество.
MihaSerb
Что то все равно нечего не получается, может у мменя есть еще какие-нибудь недачеты.
Движения.ТоварыНаСкладе.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    
    // Укажем, какой менеджер временных таблиц использует этот запрос
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;


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

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

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


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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

    Движение = Движения.ТоварыНаСкладе.Добавить();

    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    
    Движение.Период = Дата;
    
    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    
    Движение.Склад = ВыборкаДетальныеЗаписи.Склад;
    
    Движение.Количество = ВыборкаДетальныеЗаписи.Количество;

    Если ВыборкаДетальныеЗаписи.Количество<ВыборкаДетальныеЗаписи.КоличествоОСтаток Тогда
        
        Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаОСтаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.Количество;
  
    Иначе
        
        Движение.Сумма = ВыборкаДетальныеЗаписи.Сумма;
        
    КонецЕсли;

    Движения.Записать();

    КонецЦикла;



Домовик
это вопрос уже не по формуле себестоимости, а по самому запросу.

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

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

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


если в расходной вы вводите товара больше, чем есть на остатке, то что задача требует? уточняйте, бо тут код по расчету Сумма упрощен.



ничего не получается, это что? вы заходили в отладчик , в цикл вообще заходите? вообще, ставьте на этапах кода "флажки", на какие знаний хватает. или в отладчике точки останова, или использовать сообщить(), или ..
MihaSerb
Контроль остатков у меня чуть дальше в процедуре описан, Я сейчас должен как я понимаю себестоимость из временной таблици привязать к табличной части документа цена, но как не могу сообразить.
Моя попытка.
Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
          
ОбъектДок = Ссылка.Товары.ПолучитьОбъект();
СтрТабЧасти = ОбъектДок.Товары.Добавить();
СтрТабЧасти.Цена = ВыборкаДетальныеЗаписи.Себестоимость;
      
КонецЦикла;


Пользоваться точками остановы у меня не получается, делаю все методом тыка(((.
Домовик
как точно задание звучит? мало понятно, что вам нужно.

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