Подготовка таблицы для списания партий по ФИФО/ЛИФО

19.04.23

Разработка - Универсальные функции

Базис-функция для списания партий по ФИФО/ЛИФО. Возвращает "подготовленную" таблицу значений с товарами, партией и количеством для списания по партии.

Для упрощения использовалось только "Количество".

Нашел похожее в статье //infostart.ru/1c/articles/68225/

Но у меня немного другое - конечная таблица соединяется не сама с собой, а с товарами из ТЧ документа списания, "Выбор Когда" без вложенного "Выбор Когда", условия связи другие. Думаю, тут там немного другая задача решалась.

Теперь о теоретической задаче:

У нас проводится документ, например, Реализация товаров и услуг. При проведении мы должны сделать необходимые контроли остатков, списания партий. Для этого мы должны подготовить сначала таблицы, которые будут использоваться под эти задачи. Одна из таких таблиц - "Товары" с Номенклатурой и Количеством - нужна для списания партий.

Считаем, что партия в регистре состоит из одного типа документов (поэтому не используем "Выразить")

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

Итак, сама функция:

//Функция возвращает Таблицу значений, подготовленную для формирования движений по расходу для ФИФО, либо ЛИФО
//МоментВремени - момент времени документа
//МенеджерВТ - Менеджер временных таблиц, в котором есть подготовленная ВТ "Товары"
//ИмяРегистраПартУчета - Имя регистра, по которому нужно найти партии
//ФИФО - булево. Если Истина, то списание по ФИФО, если Ложь, то по ЛИФО.

Функция ПолучитьТаблицуДляСписанияПартий(МоментВремени, МенеджерВТ, ИмяРегистраПартУчета, ФИФО = Истина) Экспорт
    Если ФИФО Тогда
        ФИФО_ЛИФО = ">=";
    Иначе
        ФИФО_ЛИФО = "<="; //ЛИФО
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст = 
    //"ВЫБРАТЬ
    //|    внешТовары.Номенклатура КАК Номенклатура,
    //|    внешТовары.Количество КАК Количество
    //|ПОМЕСТИТЬ внешТовары
    //|ИЗ
    //|    &Товары КАК внешТовары
    //|;
    //|
    //|////////////////////////////////////////////////////////////////////////////////
    //|ВЫБРАТЬ
    //|    Товары.Номенклатура КАК Номенклатура,
    //|    СУММА(Товары.Количество) КАК Количество
    //|ПОМЕСТИТЬ Товары
    //|ИЗ
    //|    внешТовары КАК Товары
    //|
    //|СГРУППИРОВАТЬ ПО
    //|    Товары.Номенклатура
    //|
    //|ИМЕЮЩИЕ
    //|    СУММА(Товары.Количество) > 0
    //|
    //|ИНДЕКСИРОВАТЬ ПО
    //|    Номенклатура
    //|;
    //|
    //|////////////////////////////////////////////////////////////////////////////////
    "ВЫБРАТЬ
    |    РегистрПартУчетаОстатки.Номенклатура КАК Номенклатура,
    |    РегистрПартУчетаОстатки.КоличествоОстаток КАК КоличествоОстаток,
    |    РегистрПартУчетаОстатки.Партия КАК Партия,
    |    РегистрПартУчетаОстатки.Партия.МоментВремени КАК ПартияМоментВремени
    |ПОМЕСТИТЬ ПартииВНаличии
    |ИЗ
    |    ТоварыБезСклада КАК Товары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления." + ИмяРегистраПартУчета + ".Остатки(&МоментВремени, ) КАК РегистрПартУчетаОстатки
    |        ПО Товары.Номенклатура = РегистрПартУчетаОстатки.Номенклатура
    |ГДЕ
    |    Товары.Количество > 0
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ПартииВНаличии.Номенклатура КАК Номенклатура,
    |    ПартииВНаличии.КоличествоОстаток КАК КоличествоОстаток,
    |    ПартииВНаличии.Партия КАК Партия,
    |    СУММА(ПартииВНаличииКопия.КоличествоОстаток) - ПартииВНаличии.КоличествоОстаток КАК КоличествоДо
    |ПОМЕСТИТЬ ПартииСОстаткомДоПосле
    |ИЗ
    |    ПартииВНаличии КАК ПартииВНаличии
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииВНаличии КАК ПартииВНаличииКопия
    |        ПО ПартииВНаличии.Номенклатура = ПартииВНаличииКопия.Номенклатура
    |            И ПартииВНаличии.ПартияМоментВремени " + ФИФО_ЛИФО + " ПартииВНаличииКопия.ПартияМоментВремени
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииВНаличии.Партия,
    |    ПартииВНаличии.Номенклатура,
    |    ПартииВНаличии.КоличествоОстаток,
    |    ПартииВНаличии.ПартияМоментВремени
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ПартииСОстаткомДоПосле.Номенклатура КАК Номенклатура,
    |    ПартииСОстаткомДоПосле.Партия КАК Партия,
    |    ВЫБОР
    |        КОГДА ПартииСОстаткомДоПосле.КоличествоОстаток <= Товары.Количество - ПартииСОстаткомДоПосле.КоличествоДо
    |            ТОГДА ПартииСОстаткомДоПосле.КоличествоОстаток
    |        ИНАЧЕ Товары.Количество - ПартииСОстаткомДоПосле.КоличествоДо
    |    КОНЕЦ КАК Количество
    |ИЗ
    |    Товары КАК Товары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииСОстаткомДоПосле КАК ПартииСОстаткомДоПосле
    |        ПО Товары.Номенклатура = ПартииСОстаткомДоПосле.Номенклатура
    |            И Товары.Количество > ПартииСОстаткомДоПосле.КоличествоДо";
    Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени, ВидГраницы.Исключая));
    
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Закомментированная часть запроса - это для того, чтобы было понятно, что за состав в таблице "Товары" (которая в моем примере уже хранится в Менеджере временных таблиц)

Ну и как пример последующего использования:

//Подготовка таблицы товаров
МенеджерВТ = ВашОбщийМодуль.ПодготовитьМенеджерВТ_Товары(ЭтотОбъект, "Товары");

//Получение таблицы значений, подготовленной для списания Партий товаров по методу ФИФО/ЛИФО
ТаблицаДляСписания = ОМ_РаботаСПартиями.ПолучитьТаблицуДляСписанияПартий(МоментВремени(), МенеджерВТ, "ПартииТоваров"); //ФИФО, для ЛИФО - добавить ЛОЖЬ в конце
    
// регистр ПартииТоваров Расход
Движения.ПартииТоваров.Записывать = Истина;
ВидДвижения     = ВидДвиженияНакопления.Расход;
Для Каждого ТекСтрокаТовары Из ТаблицаДляСписания Цикл
        Движение = Движения.ПартииТоваров.Добавить();
        Движение.ВидДвижения = ВидДвижения;
        Движение.Период = Дата;
        Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
        Движение.Партия = ТекСтрокаТовары.Партия;
        Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;

Бонусом подготовка Менеджера ВТ:

Функция ПодготовитьМенеджерВТ_Товары(Источник, ИмяТЧ) Экспорт
    
    Запрос = Новый Запрос;
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    
    Запрос.Текст = 
        "ВЫБРАТЬ 
        |    внешТовары.Номенклатура КАК Номенклатура,
        |    внешТовары.Склад КАК Склад,
        |    внешТовары.Количество КАК Количество
        |ПОМЕСТИТЬ внешТовары
        |ИЗ
        |    &Товары КАК внешТовары
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    внешТовары.Номенклатура КАК Номенклатура,
        |    внешТовары.Склад КАК Склад,
        |    СУММА(внешТовары.Количество) КАК Количество
        |ПОМЕСТИТЬ Товары
        |ИЗ
        |    внешТовары КАК внешТовары
        |ГДЕ
        |    внешТовары.Номенклатура.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
        |    И внешТовары.Количество > 0
        |
        |СГРУППИРОВАТЬ ПО
        |    внешТовары.Номенклатура, внешТовары.Склад
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура, Склад
        |;
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Товары.Номенклатура КАК Номенклатура,
        |    СУММА(Товары.Количество) КАК Количество
        |ПОМЕСТИТЬ ТоварыБезСклада
        |ИЗ
        |    Товары КАК Товары
        |
        |СГРУППИРОВАТЬ ПО
        |    Товары.Номенклатура
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура";
    Запрос.УстановитьПараметр("Товары", Источник[ИмяТЧ].Выгрузить());
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Выполнить(); //Получили отформатированную таблицу товаров
    Возврат МенеджерВТ;
КонецФункции

 

Партии ФИФО ЛИФО Запрос Движения

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    20113    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4090    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    18039    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5501    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    14728    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3578    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18476    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aleximus 10 19.04.23 16:18 Сейчас в теме
Аналогичным образом (я про запрос) можно реализовать распределение заказанных товаров по складам с приоритетами (складов). На выходе будет ТЗ с заказанными товарами, складами и количеством. Этот механизм распределения по складам даже чаще будет использоваться.
Оставьте свое сообщение