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

19.04.23

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3837    Abysswalker    9    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7216    DeerCven    15    

60

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    51280    dimanich70    83    

172

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7522    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    64989    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9407    ke.92@mail.ru    17    

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