Пошаговая инструкция
Transfer нужен, когда товар физически перемещается с одного склада на другой. Это не поставка от поставщика, не продажа, не списание и не финансовая операция. Правильный transfer уменьшает исходный склад, показывает склад назначения и сохраняет понятную причину.
Сначала пройдите walkthrough. Точки показывают, куда нажимать; видео показывают раскрытие списков, ввод комментария, поиск продукта, ввод Gross и Net, добавление строки и сохранение.
Что заполнять на этом экране
Список Transfer
Как заполнять: Откройте Transfer и проверьте существующие перемещения перед созданием нового.
Зачем: Дубликаты могут второй раз переместить остаток и сломать складскую сверку.
Форма Product transfer
Как заполнять: Открывайте форму после загрузки списка Transfer.
Зачем: Форма использует загруженные склады, причины и товары из состояния приложения.
Дата перемещения
Как заполнять: Проверьте дату и время движения.
Зачем: История склада и аудит должны показывать фактическое время перемещения.
Причина перемещения
Как заполнять: Выберите понятную причину, например Internal transfer.
Зачем: Причина объясняет, почему остаток движется между складами.
From warehouse
Как заполнять: Выберите склад, где товар находится сейчас.
Зачем: Этот склад уменьшится после сохранения.
To warehouse
Как заполнять: Выберите склад, куда товар должен прийти.
Зачем: Этот склад получит остаток после перемещения.
Comment
Как заполнять: Введите короткий комментарий с операционным контекстом.
Зачем: Комментарий помогает понять перемещение без просмотра каждой строки.
Select product
Как заполнять: Откройте Select product, найдите продукт или ингредиент и выберите точную строку.
Зачем: Только реальный продукт может корректно изменить складской остаток.
Specification / variant
Как заполнять: Используйте поле только если у товара есть варианты или спецификации.
Зачем: Для простого ингредиента поле можно оставить пустым.
Order type
Как заполнять: Открывайте Order type только если перемещение связано с конкретным заказом или типом списания.
Зачем: Случайный order type делает отчеты и объяснения неверными.
Gross
Как заполнять: Введите физическое количество, которое уходит со склада-источника.
Зачем: Gross показывает исходное количество до потерь или корректировок.
Net
Как заполнять: Введите количество, которое должно прийти на склад назначения.
Зачем: При обычном внутреннем перемещении Net обычно равен Gross.
Add
Как заполнять: Нажмите Add после выбора продукта и количества.
Зачем: Пока строка не добавлена, она не входит в документ перемещения.
Save
Как заполнять: Сохраняйте только после проверки причины, складов, комментария и строк товаров.
Зачем: Только сохраненный transfer становится надежной складской историей.
Проверка строки
Как заполнять: Вернитесь в список Transfer и проверьте дату, тип, склад, причину, содержимое и комментарий.
Зачем: Это подтверждает, что запись создана и загружена обратно из базы.
Частые ошибки
- Создавать transfer до загрузки списка Transfer и связанных данных.
- Выбирать один и тот же склад как источник и назначение.
- Путать From warehouse и To warehouse.
- Сохранять документ без добавленных строк товаров.
- Выбирать похожий продукт без поиска и проверки точной строки.
- Вводить количество в другой единице, чем указано у продукта.
- Делать Gross и Net разными без реальной потери или корректировки.
- Выбирать Order type случайно, когда перемещение не связано с заказом.
- Считать transfer поставкой, продажей, списанием или финансовой оплатой.
- Редактировать write_offs напрямую и не обновлять loadwriteoff, loadstorage и loadproduct.
Техническая таблица для AI-агентов
Этот блок расположен ниже пользовательской инструкции. Он нужен поддержке, автоматизациям и будущим AI-агентам, которые будут объяснять складские движения и проверять данные Transfer.
| Поле | Хранится как | Назначение | Почему важно |
|---|---|---|---|
| ID перемещения | write_offs.id / WriteOffStruct.ID | Уникальный идентификатор документа перемещения. | Нужен для истории склада, поддержки, отчетов, аудита и AI-агентов. |
| Тип документа | write_offs.type = "=" | Маркер, по которому список Transfer отличает перемещения от списаний. | Transfer хранится в write_offs, поэтому тип "=" критически важен. |
| Компания | write_offs.company | Компания, которой принадлежит перемещение. | Не дает складским движениям смешиваться между компаниями. |
| Дата перемещения | write_offs.date / WriteOffStruct.Date | Дата и время складского движения. | Используется в истории склада, аудите, отчетах и сменной сверке. |
| Причина | write_offs.reasons / WriteOffStruct.Reasons | Объект причины из справочника write_off_reasons. | Объясняет, зачем товар перемещался. |
| Комментарий | write_offs.comment | Короткая операционная заметка. | Поясняет полку, задачу менеджера, исключение или причину движения. |
| From warehouse | write_offs.storage | ID склада-источника. | Этот склад должен уменьшиться. |
| To warehouse | write_offs.to_storage | Текстовая ссылка на склад назначения и ID назначения. | Показывает, куда должен прийти остаток. |
| Строки товаров | write_offs.items[] / WriteOffStruct.Items[] | Список товарных движений внутри transfer. | Без строк документ не перемещает конкретный товар. |
| ID строки | write_offs.items[].ID | Уникальный ID строки движения. | Позволяет ссылаться на конкретный товар в аудите и объяснениях. |
| Дата строки | write_offs.items[].date | Дата движения внутри товарной строки. | Синхронизирует строку с датой документа. |
| Тип движения строки | write_offs.items[].Type = - | Направление движения для исходного склада. | Функция transfer записывает исходящее движение и склад назначения. |
| Продукт | write_offs.items[].Product | ID продукта или ингредиента. | Это конкретная номенклатура, чей остаток перемещается. |
| Спецификации | write_offs.items[].specifications | Опциональные ID спецификаций или вариантов. | Заполняется только для товаров с контролируемыми вариантами. |
| Gross | write_offs.items[].Gross | Количество до потерь или корректировок. | При чистом перемещении обычно равно Net. |
| Net | write_offs.items[].Net | Количество, которое должно прийти на склад назначения. | Именно это количество ожидают увидеть на принимающем складе. |
| Единица | products.unit_of_measurement | Единица выбранного товара: kg, pcs, l и другие. | Без единицы число невозможно правильно интерпретировать. |
| Order type | write_offs.items[].typeorders | Опциональный контекст заказа или списания. | Заполняется только когда transfer связан с конкретным операционным сценарием. |
| Storage в строке | write_offs.items[].Storage | ID склада назначения внутри товарной строки. | Связывает строку товара с принимающим складом. |
| Reason в строке | write_offs.items[].Reasion | ID причины на уровне строки. | Сохраняет причину при отдельном анализе товарных строк. |
| Comment в строке | write_offs.items[].Comment | Сгенерированная или введенная заметка по строке. | Поясняет направление или особую обработку товара. |
| Суммы и цена | write_offs.amount / items[].Price / items[].amount | Для обычного transfer обычно равны 0. | Перемещение двигает склад, а не создает закупку, продажу или оплату. |
| Создано | write_offs.created_at | Время записи строки. | Полезно для диагностики и аудита. |
| Пользователь | write_offs.user | Пользователь, который создал документ, если поле заполнено. | Поддерживает ответственность и аудит. |
| Кэш Transfer | FFAppState().Writeoff filtered by type "=" | Локальный список перемещений в приложении. | После backend-правок приложение должно перезагрузить write_offs. |
| Маркеры обновления | company.loadwriteoff / loadstorage / loadproduct | Timestamp-маркеры для перезагрузки перемещений, складов и товаров. | После нативных изменений формы и списки должны увидеть актуальные данные. |