В процессе работы с 1С:УНФ, особенно при учете комиссионного товара или продукции, находящейся на ответственном хранении, часто возникает вопрос об организации партионного учета. Стандартный функционал программы имеет свои особенности, которые не всегда в полной мере удовлетворяют потребности пользователей. Давайте рассмотрим, как настроить и реализовать партионный учет, включая возможности автоматического создания партий, и какие нюансы следует учитывать.
Прежде чем погружаться в детали реализации, важно понять архитектуру партионного учета в 1С:УНФ. Нам следует различать две основные концепции (разобраться в них поможет сравнение регистров "Запасы на складах" и "Запасы и затраты"):
Пользовательские партии подчинены номенклатуре, то есть для каждой позиции может существовать свой набор партий. Основные характеристики партии включают:
Особо хотим отметить, что для операций «Прием на комиссию», «Прием в переработку» и «Прием на ответственное хранение» заполнение колонки «Партия» является обязательным. Это критически важный момент, поскольку он гарантирует правильное отслеживание юридического владельца товара.
Для активации партионного учета в 1С:УНФ нам потребуется выполнить несколько шагов:
Основной вопрос автора темы касался того, как и когда должны создаваться партии: вручную или автоматически. В 1С:УНФ существуют оба подхода, и мы рассмотрим их подробно.
Для операций «Прием на комиссию», «Прием в переработку» и «Прием на ответственное хранение» система 1С:УНФ по умолчанию предлагает определенный механизм автоматического создания партий. Давайте разберем его работу:
Приходная накладная с видом операции «Прием на комиссию» или «Прием на ответственное хранение», если для данной номенклатуры партия еще не выбрана, система может автоматически создать новую партию.Приходной накладной на панели действий табличной части «Товары» вы можете нажать кнопку «Изменить» и выбрать пункт «Создать партии номенклатуры». Это позволяет задать осмысленное наименование партии, например, номер и дату документа поступления, что может упростить последующую идентификацию.Нюансы стандартного подхода:
Если стандартного функционала недостаточно, и вам требуется более тонкая настройка или полная автоматизация создания партий в УНФ с определенными правилами (например, привязка партии к конкретному документу поступления для всех видов товаров), мы можем реализовать это программно. Этот подход был предложен на форуме и является эффективным решением.
Основная идея заключается в том, чтобы сделать партию равной документу поступления. То есть, каждая новая приходная накладная (или другой документ поступления) будет создавать свою уникальную партию для всех позиций номенклатуры в ней.
Для реализации программного создания партий мы будем использовать подписку на событие, например, событие ОбработкаПроверкиЗаполнения или другое событие, происходящее при записи документа Приходная накладная. Это позволит нам вмешаться в процесс до сохранения документа и создать необходимые партии.
Документ.ПриходнаяНакладная, выбрав событие, подходящее для вашей логики (например, ПередЗаписью или ОбработкаПроверкиЗаполнения). В качестве обработчика укажите новую экспортную процедуру в общем модуле.Давайте рассмотрим пример кода, который можно использовать в процедуре-обработчике подписки на событие. Предположим, что подписка настроена на событие ОбработкаПроверкиЗаполнения документа ПриходнаяНакладная, и обработчик находится в общем модуле МойОбщийМодуль.
// В общем модуле "МойОбщийМодуль"
Процедура ОбработкаПроверкиЗаполненияПриходнойНакладной(Источник, Отказ, ПроверяемыеРеквизиты) Экспорт
// Проверяем, что это Приходная накладная и нам нужен партионный учет
Если Источник.Метаданные().Имя <> "ПриходнаяНакладная" Тогда
Возврат;
КонецЕсли;
Для Каждого СтрокаТовары Из Источник.Товары Цикл
Если СтрокаТовары.Номенклатура.ИспользоватьПартии Тогда // Проверяем, что для данной номенклатуры включен партионный учет
Если СтрокаТовары.Партия.Пустая() Тогда // Если партия не заполнена, пытаемся создать/найти
// Формируем наименование партии на основе документа
// Например, "Приходная накладная N123 от 01.01.2024"
Перем НаименованиеПартии;
Если ТипЗнч(Источник.Номер) = Тип("Строка") И ТипЗнч(Источник.Дата) = Тип("Дата") Тогда
НаименованиеПартии = СокрЛП("Прих. накладная №" + Источник.Номер + " от " + Формат(Источник.Дата, "ДФ=dd.MM.yyyy"));
Иначе
НаименованиеПартии = СокрЛП(Источник); // Используем стандартное представление, если номер/дата не строкового типа
КонецЕсли;
// Определяем владельца партии (контрагент из документа поступления)
Перем ВладелецПартии;
Если Источник.Контрагент.Пустая() Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не указан контрагент в документе. Невозможно создать партию.";
Сообщение.Поле = "Контрагент";
Сообщение.Сообщить();
Возврат;
Иначе
ВладелецПартии = Источник.Контрагент;
КонецЕсли;
// Ищем существующую партию для данной номенклатуры, владельца и наименования
Перем НайденнаяПартия;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПартииНоменклатуры.Ссылка
|ИЗ
| Справочник.ПартииНоменклатуры КАК ПартииНоменклатуры
|ГДЕ
| ПартииНоменклатуры.Владелец = &Номенклатура
| И ПартииНоменклатуры.ВладелецПартии = &ВладелецПартии
| И ПартииНоменклатуры.Наименование = &НаименованиеПартии";
Запрос.УстановитьПараметр("Номенклатура", СтрокаТовары.Номенклатура);
Запрос.УстановитьПараметр("ВладелецПартии", ВладелецПартии);
Запрос.УстановитьПараметр("НаименованиеПартии", НаименованиеПартии);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
НайденнаяПартия = Выборка.Ссылка;
Иначе
// Партия не найдена, создаем новую
НоваяПартия = Справочники.ПартииНоменклатуры.СоздатьЭлемент();
НоваяПартия.Владелец = СтрокаТовары.Номенклатура; // Подчинение номенклатуре
НоваяПартия.ВладелецПартии = ВладелецПартии; // Контрагент-владелец товара
НоваяПартия.Наименование = НаименованиеПартии;
Попытка
НоваяПартия.Записать();
НайденнаяПартия = НоваяПартия.Ссылка;
Исключение
Отказ = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Ошибка при создании новой партии: " + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
КонецЕсли;
// Заполняем поле "Партия" в строке документа
СтрокаТовары.Партия = НайденнаяПартия;
КонецЕсли; // Если СтрокаТовары.Партия.Пустая()
КонецЕсли; // Если СтрокаТовары.Номенклатура.ИспользоватьПартии
КонецЦикла;
КонецПроцедуры
Пояснения к коду:
Приходная накладная.Товары.ИспользоватьПартии для номенклатуры, чтобы избежать создания партий для товаров, где они не требуются.Партия в строке документа пустое, мы формируем наименование для новой партии, используя номер и дату документа поступления. Это делает наименование партии уникальным и информативным.ВладелецПартии как контрагента из документа Приходная накладная.ПартииНоменклатуры, чтобы найти уже существующую партию с таким же владельцем, наименованием и подчинением номенклатуре.ПартииНоменклатуры, заполняются его свойства (Владелец - ссылка на номенклатуру, ВладелецПартии - контрагент, Наименование - сформированное нами) и он записывается.СтрокаТовары.Партия записывается ссылка на найденную или созданную партию.Такой подход обеспечивает создание партий для каждой приходной накладной, что дает более гранулированный учет и возможность строить отчеты в разрезе конкретных поступлений.
Рассмотрим, как оформляются основные операции с использованием партионного учета для этих специфических видов запасов:
Приходная накладная с видом операции «Прием на комиссию». В табличной части обязательно указывается созданная или выбранная партия.Расходная накладная). При выборе комиссионного товара система предложит выбрать партию, с которой будет списан товар.Отчет комитенту, который отражает проданные комиссионные товары и рассчитывает вознаграждение.Приходная накладная с видом операции «Прием на ответственное хранение». Аналогично, партия является обязательным реквизитом.Расходную накладную с видом операции «Передача на ответственное хранение».Остатки по принятым запасам (комиссия, ответственное хранение) можно посмотреть в отчетах Остатки запасов принятых или Запасы принятые.
Эффективное использование партионного учета невозможно без инструментов для управления партиями и их анализа:
Партии номенклатуры могут быть неактивны. Обычно партии удаляются через удаление связанных документов (которые используют эти партии) или с помощью специализированных обработок, предназначенных для работы с неиспользуемыми объектами. Если полное удаление не требуется, можно пометить партию как «Недействительна», что уберет ее из списков выбора без полного удаления из программы.Номенклатура: В карточке номенклатуры можно увидеть, какие партии используются для данного товара.Остатки запасов или Запасы. Для этого перейдите в раздел «Склад» -> «Аналитика» -> «Запасы», выберите расширенный вид настройки отчета и добавьте поле «Партия» в структуру отчета. Это позволит нам группировать и детализировать данные по каждой партии.При внедрении и использовании партионного учета в 1С:УНФ следует помнить о некоторых важных моментах:
В целом, 1С:УНФ предоставляет базовые инструменты для партионного учета, особенно для обязательных сценариев (комиссия, ответственное хранение). Однако для глубокой автоматизации и полного соответствия специфическим требованиям бизнеса часто требуется программная доработка, которая позволяет адаптировать систему под уникальные нужды предприятия.