Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 мая 2024, 10:08

Учёт ФИФО

Автор Алексей Корольков, 06 июн 2023, 14:06

0 Пользователей и 1 гость просматривают эту тему.

Алексей Корольков

Всем Привет!

У меня стандартное условие с нестандартной задачкой.

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

//====  Модуль объекта =============================================
#Область Проведение

Процедура ОтразитьДвиженияТоварыНаСкладах(Отказ)

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

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

Выборка = Запрос.Выполнить().Выбрать();

Движения.ТоварыНаСкладах.Записывать = Истина;

Пока Выборка.Следующий() Цикл
Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;

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

#КонецОбласти

//====  Модуль регистра  =============================================

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ, Замещение)

Если НЕ ВыполнятьПроверку() Тогда
Возврат;
КонецЕсли;

БлокироватьДляИзменения = Истина;

МенеджерВТ = Новый МенеджерВременныхТаблиц;

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

Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
РезультатЗапроса = Запрос.Выполнить();

ДополнительныеСвойства.Вставить("МенеджерВТ", МенеджерВТ);

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

Процедура ПриЗаписи(Отказ, Замещение)

Если НЕ ВыполнятьПроверку() Тогда
Возврат;
КонецЕсли;

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

Регистратор = Отбор.Регистратор.Значение;
Запрос.УстановитьПараметр("Регистратор", Регистратор);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
ТекстОшибки = СтрШаблон("На складе %1 недостаточно номенклатуры %2 в количестве %3",
Выборка.СкладПредставление,
Выборка.НоменклатураПредставление,
Выборка.Количество);
ОбщегоНазначения.СообщитьПользователю(ТекстОшибки, Регистратор,,, Отказ);
КонецЦикла;

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

#КонецОбласти

#КонецЕсли

#Область СлужебныеПроцедурыИФункции

Функция ВыполнятьПроверку()
Возврат НЕ ОбменДанными.Загрузка;
КонецФункции

#КонецОбласти
//=========================================================================


LexaK

Алексей Корольков,
Цитироватьчто бы туда можно было впихнуть условие списание партий.
так для учета движений по Партиям их надо добавить и учитывать в измерениях регистра накопления.
В вашем коде ни чего похожего нет!
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск