При разработке системы учета для предприятий общественного питания одной из центральных задач является автоматизация списания ингредиентов. В этой статье мы разберем, как связать процесс продажи блюда с фактическим уменьшением остатков продуктов на складе, опираясь на архитектурные принципы 1С.
Прежде чем приступать к написанию кода, важно четко определить структуру данных. У нас есть три ключевых элемента:
Блюда — содержит номенклатуру готовой продукции.Продукты — содержит номенклатуру сырья, которое хранится на складе.Калькуляция (Технологическая карта) — определяет состав блюда. Именно этот документ связывает одно блюдо с перечнем входящих в него продуктов и их количеством.СчетКлиентуКогда официант или администратор проводит документ СчетКлиенту, система должна автоматически «раскрыть» состав каждого блюда и списать соответствующие продукты с регистра ОстаткиПродуктов. Рассмотрим пошаговый алгоритм реализации этой задачи.
Шаг 1: Получение состава блюда
При проведении документа СчетКлиенту необходимо организовать цикл по строкам табличной части. Внутри цикла для каждого Блюда мы должны найти актуальную Калькуляцию. Для этого можно использовать метод поиска документа по дате (от текущей даты документа к более ранним периодам):
// Пример логики поиска калькуляции
Для Каждого СтрокаСчета Из СчетКлиенту.СписокБлюд Цикл
ТекущееБлюдо = СтрокаСчета.Блюдо;
КоличествоБлюд = СтрокаСчета.Количество;
// Ищем последнюю калькуляцию для этого блюда
ДокКалькуляция = НайтиПоследнююКалькуляцию(ТекущееБлюдо, ДатаДокумента);
Если ДокКалькуляция <> Пусто Тогда
// Переходим к расчету продуктов
КонецЕсли;
КонецЦикла;
Шаг 2: Расчет расхода ингредиентов
После того как нужная Калькуляция найдена, мы проходим по её табличной части. Каждый ингредиент в этой таблице — это Продукт с определенной нормой расхода на одну порцию. Умножаем норму на количество проданных блюд и формируем движение по регистру.
Для Каждого СтрокаКалькуляции Из ДокКалькуляция.СоставБлюда Цикл
Продукт = СтрокаКалькуляции.Продукт;
КоличествоКСписанию = СтрокаКалькуляции.Норма * КоличествоБлюд;
// Формируем движение по регистру остатков
Движение = Движения.ОстаткиПродуктов.ДобавитьРасход();
Движение.Период = ДатаДокумента;
Движение.Продукт = Продукт;
Движение.Количество = КоличествоКСписанию;
КонецЦикла;
Хотя реализация через Документ кажется простой и логичной для начала, опытные разработчики рекомендуют обратить внимание на следующие нюансы:
РегистраСведений для хранения состава блюд. Это позволит системе автоматически подставлять актуальную рецептуру на нужную дату без перебора документов.Инвентаризация для корректировки реальных данных.КоличествоКСписанию превышает текущий остаток, документ должен выдавать предупреждение и прерывать проведение.Этот подход позволит вам выстроить надежную систему учета. Постепенно развивая структуру справочников и механизмы проведения, вы сможете добиться автоматизации даже самых сложных технологических процессов кухни вашего заведения.