7.7 Получение себестоимости материалов по методу LIFO в Бухучёте

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем Vertex, 4 фев 2013.

  1. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Всем привет.
    Бухгалтерам для отчёта нужно получать себестоимость по последним по времени закупкам, прошу совета как лучше реализовать сию выборку.
    На скорую руки видится решение выгрузить все поступления мат-лов в ТЗ с датами и закупочной ценой и искать последний приход.
    Подскажите если красивее можно реализовать?
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    А метод ЛИФО случаем не отменён?
  3. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В 7ке БУХ нет FIFO/LIFO. там все по средней считается...
    мождет не себестоимость, а цену?

    Т.е. отчет по остаткам материалов по последней закупочной цене?
  4. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Да да....закупочную цену я оговорился.
    Да верно
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда примерный алгоритм такой...
    Выгружаем материалы в ТЗ
    Колонки
    * Материал
    * Цена = 0
    * Счетчик = 0
    Выборка поступлений в обратном порядке с заполнением цены в ТЗ (проверяем на заполненность цены чтобы не взять более старую). Счетчик присваиваем 1
    Выход из выборки документов
    Код:
    ТЗ.КоличествоСтрок()=ТЗ.Итог("Счетчик")
  6. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Счетчик присваиваем один когда находим первое включение искомого элемента.?
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да... Примерно так
    Код:
    //тут нашли строку ТЗ с материалом
    Если ТЗ.Счетчик=0 Тогда
    ТЗ.Цена=ЦенаИзДокумента;
    ТЗ.Счетчик=1;
    КонецЕсли;
  8. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Материалы из документов так? Полностью пройти от текущей даты до первого поступления материалов в базе.
  9. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Немного вашу идею не пойму прошу разъяснить.
    Выгружаем материалы из всех поступлений например при открытии или же проверку делать на каждый отдельный материал, только который есть при переборе в Бух Итогах?
    Я предполагаю что вы посоветовали вначале выгрузить все материалы их поступлений и потом работать только с таблицей.

    Если не прав, поправте
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    если список материалов - большой - нужно наоборот.
    1)Делаем запрос к БИ.
    2)Получаем список материалов с оборотами
    3)Получаем цену из поступлений
    4)Выводим отчет с учетом цен поступления
  11. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Бухгалтерский угодник
    Замучал Вас наверное. Но так и не понял как Вы предлагаете доставать цену из поступления.

    3)Получаем цену из поступлений

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

    :sm_rolleyes:
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    не правильно.
    Выбираем все поступления в обратном порядке...
    Перебираем строки. По мере выборки заполняем ценами ТЗ...
    Пример приведен в посте №7 данной темы.
    Завершаем цикл по условию из поста №5.

    Теперь понятно?
  13. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Если правильно понял то так:

    Код:
    Функция F_LIFO(ТЗ)
    Док = СоздатьОбъект("Документ.ПоступлениеМатериалов"); 
    ФЛ = 0;
    Сч = 0;
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку()=1 Цикл 
    Матл=ТЗ.Материал;
    Док.ОбратныйПорядок(1);
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент()=1 Цикл   
    Если ФЛ = 1 Тогда
    ФЛ = 0;
    Прервать;
    КонецЕсли;
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    Если   Док.Материал=Матл Тогда
    Если ТЗ.Счетчик=0 Тогда
    Сч = Сч + 1;
    ТЗ.УстановитьЗначение(Сч,"Цена",Док.Цена);
    ТЗ.УстановитьЗначение(Сч,"НДС",Док.НДС);
    ТЗ.УстановитьЗначение(Сч,"Счетчик",1);
    ФЛ = 1;
    Прервать;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла; 
    КонецЦикла;
    Возврат ТЗ;
    КонецФункции
    //==============================================
    Процедура Сформировать()
    ...
    МатСОборотом.ВыбратьСчета(0);
    Пока МатСОборотом.ПолучитьСчет(0)=1 Цикл
    МатСОборотом.ВыбратьСубконто(1);
    Пока МатСОборотом.ПолучитьСубконто(1)=1 Цикл
    ТЗ_LIFO.НоваяСтрока();
    ТЗ_LIFO.Материал = МатСОборотом.Субконто(1);
    ТЗ_LIFO.Цена	 = 0;
    ТЗ_LIFO.НДС	  = 0;
    ТЗ_LIFO.Счетчик  = 0;
    КонецЦикла; 
    КонецЦикла;
    
    F_LIFO(ТЗ_LIFO);
    ...
    КонецПроцедуры
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не совсем так. Вы выбираете каждую строку отдельно. А это не удобно. + Мой алгоритм намного быстрее, т.к. требует всего 1 проход.
    Лучше "хором".
    Золотое правило: если есть возможность - избегать цикла в цикле...
    Ну и с НДС вы безусловно накосячили
    Код:
    Функция F_LIFO(ТЗ)
    Док = СоздатьОбъект("Документ.ПоступлениеМатериалов");
    Док.ОбратныйПорядок(1);
    Док.ВыбратьДокументы();
    Пока Док.ПолучитьДокумент()=1 Цикл  
    Если Док.Проведен()=0 Тогда
    Продолжить;
    КонецЕсли;
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    а=0;
    Если ТЗ.НайтиЗначение(Док.Материал,а,"Материал")=1 Тогда
    ТЗ.ПолучитьСтрокуПоНомеру(а);
    Если ТЗ.Счетчик=0 Тогда
    ТЗ.Цена=Док.Цена;
    ТЗ.НДС=?(Док.Количество=0,Док.НДС, Док.НДС/Док.Количество);
    ТЗ.Счетчик=1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Если ТЗ.Итог("Счетчик")=ТЗ.КоличествоСтрок() Тогда
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Возврат ТЗ;
    КонецФункции
    
  15. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Спасибо Бухгалтерский угодник.
    Попробовал как Вы предложили работает маленько медленновато,
    сделал так:

    Код:
    Перем used [100000],ТЗ;
    Процедура ПроверкаТЗ()   
    Длинна = ТЗ.КоличествоСтрок()-1; 
    
    Для i=1 по Длинна Цикл
    Пока (i<Длинна) и (ТЗ.ПолучитьЗначение(i,1)=ТЗ.ПолучитьЗначение(i+1,1)) Цикл
    used[i+1]=1;i=i+1;
    КонецЦикла;
    КонецЦикла;			  
    
    
    k=0;
    Для i=1 по Длинна+1 Цикл
    Если (used[i]=1) тогда
    ТЗ.УдалитьСтроку(i-k);
    k=k+1;
    КонецЕсли;
    КонецЦикла;
    ТЗ.Сортировать("Материал+");
    КонецПроцедуры
    Процедура F_LIFO()
    Док = СоздатьОбъект("Документ.ПоступлениеМатериалов"); 
    ТЗ  = СоздатьОбъект("ТаблицаЗначений"); 
    
    ТЗ.НоваяКолонка("Код","Строка");
    ТЗ.НоваяКолонка("Материал","Справочник.Материалы");
    ТЗ.НоваяКолонка("Цена","Число",,2);
    ТЗ.НоваяКолонка("НДС","Число",,2);
    ТЗ.НоваяКолонка("Счетчик","Число",1);
    ТЗ.НоваяКолонка("ДатаДок","Дата");
    
    ТЗ.УдалитьСтроки();   
    Док.ОбратныйПорядок(1);
    Док.ВыбратьДокументы();
    
    Пока Док.ПолучитьДокумент()=1 Цикл 
    Если Док.Проведен()=0 Тогда
    Продолжить;
    КонецЕсли;
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Код	  = Док.Материал.Код;
    ТЗ.Материал = Док.Материал;
    ТЗ.Цена	 = Док.Цена;
    ТЗ.НДС	  = ?(Док.Количество=0,Док.НДС, Док.НДС/Док.Количество);
    ТЗ.Счетчик  = 0;
    ТЗ.ДатаДок  = Док.ДатаДок;
    КонецЦикла;
    КонецЦикла;
    ТЗ.Сортировать("Код+,ДатаДок-");
    ПроверкаТЗ();
    КонецПроцедуры
    //______________
    При открытии 1раз заполняется большая таблица со всеми позициями документов, сортируется , удаляются ненужные. После этого таблица готова к выборке.
  16. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Для универсальности отчёта хочется добавить ещё получение цен как FIFO, но тут как понимаю проблем намного больше.
    Нужно создавать в бухгалтерии партионный учёт.
  17. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Не думаю что ваш способ быстрее. Можете замерить производительность отладчиком.
    Если действительно интересно - могу мотивировать. Хотя это и так очевидно.
    2) По FIFO - нет проблем. (без обид) Вы само понятие FIFO/LIFO для себя четко понимаете?
  18. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    FIFO -первый пришёл, первый вышел. Стоимость берётся по более ранним партиям прихода.
    LIFO - последний пришёл, первый вышел. Как стек. Стоимость берётся по более поздним партиям прихода.
    По FIFO труднее я думаю в том плане что взяв цену из первого документа поступления пример :Материал 1 цена за шт. 100руб, приход 20.01.2010 остатка по этой партии уже может не быть, а пример :Материал 1 цена за шт. 120руб, приход 20.05.2011 оценить нужно будет по цене 120 руб/шт. Как это реализовать без реализации партий? Есть идеи?
  19. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Теоретически - да.... Если перебрать все документы.
  20. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Документы как на приход так и на расход?

Поделиться этой страницей