Как в «Помощнике продаж» 1С:УТ отобразить документы поступления товаров и выбирать конкретную партию для списания?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В торговых компаниях часто возникает ситуация, когда один и тот же товар закупается разными партиями. Из-за колебаний курсов валют, изменения цен поставщиков или логистических затрат себестоимость единицы товара в разных поставках может существенно отличаться. Менеджеры по продажам, стремясь предоставить клиенту индивидуальную скидку или максимизировать прибыль, хотят видеть в интерфейсе подбора («Помощнике продаж») конкретные документы поступления, остатки по ним и точную себестоимость, чтобы вручную выбирать, из какого именно прихода списать товар.

В этой статье мы подробно разберем, как решить эту задачу в современных конфигурациях на платформе «1С:Предприятие 8.3» (таких как «1С:Управление торговлей 11», «1С:ERP» или «BAS Управление торговлей»). Мы проанализируем архитектурные ограничения системы, рассмотрим штатные (безпрограммные) альтернативы и детально опишем алгоритм программной доработки, если без изменения кода не обойтись.

Архитектурное ограничение УТ 11: почему старые методы не работают

Если вы ранее работали с конфигурациями старого поколения (например, «Управление торговлей 10.3» или решениями на платформе «1С:Предприятие 7.7»), то наверняка помните простой рецепт: добавить реквизит Партия (документ поступления) в табличную часть документа продажи, вывести его в подбор, а при проведении подставить этот документ в движения регистра партий. К сожалению, в современных редакциях «1С:Управление торговлей 11» (и родственных конфигурациях) этот подход не сработает.

В современной архитектуре ERP-систем 1С партионный учет работает по принципу отложенного расчета. В момент проведения документа продажи («Реализация товаров и услуг») система списывает товар только в количественном выражении по складским регистрам. Окончательное распределение партий (по методу FIFO или средней стоимости) и расчет финансового результата происходят в конце отчетного периода при запуске регламентной операции «Расчет себестоимости» в рамках закрытия месяца.

Если вы просто принудительно запишете партию в движения документа реализации при его проведении, процедура закрытия месяца и распределения затрат сотрет ваши ручные корректировки и пересчитает все движения по типовым алгоритмам FIFO. Поэтому стандартную логику распределения партий переписать «на лету» чрезвычайно сложно и крайне не рекомендуется.

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

Решение №1: Штатный учет себестоимости по сериям (без программирования)

Для индивидуального учета каждой закупаемой партии товаров в системе предусмотрен мощный встроенный инструмент — серийный учет с контролем себестоимости. В данном сценарии «серия» используется не как серийный номер конкретного изделия, а как уникальный идентификатор партии закупки.

Рассмотрим по шагам, как настроить и использовать этот механизм:

  1. Настройка номенклатуры: В карточке номенклатуры (или общего вида номенклатуры) необходимо включить флаг использования серий.
  2. Создание политики учета серий: Создаем новую политику учета серий и выбираем тип политики «Учет себестоимости по сериям». В настройках указываем, что серия идентифицирует «партию товаров, имеющих одинаковый номер серии...».
  3. Оприходование товара: При оформлении документа «Приобретение товаров и услуг» система потребует заполнить серии. При создании новой серии в поле наименования менеджер по закупкам может вводить номер и дату входящего документа поставщика (например, «Поступление №145 от 12.10.2023»).
  4. Продажа товара через «Помощник продаж»: При подборе товара менеджер видит остатки в разрезе серий (каждая из которых является конкретным приходом). Он выбирает нужную серию с известной ему ценой и себестоимостью.
  5. Расчет себестоимости: При закрытии месяца система спишет себестоимость именно по выбранной менеджером серии. Никакого перераспределения по FIFO для этого товара происходить не будет, так как серия выступает в качестве жесткого аналитического разреза учета затрат.

Этот метод является наиболее рекомендуемым, поскольку он полностью штатный, не требует изменения типового кода конфигурации и гарантирует 100% корректность ведения партионного и финансового учета.

Решение №2: Использование механизмов обособленного учета

Если менеджеру требуется зафиксировать цену закупки под конкретную сделку, можно использовать обособленный учет себестоимости:

Решение №3: Программная доработка «Помощника продаж»

Если бизнес-процессы компании категорически не позволяют использовать серии (например, из-за нежелания закупщиков тратить время на ввод серий), и требуется именно программирование, рассмотрим, как правильно спроектировать такое решение.

Шаг 1. Проектирование интерфейса подбора

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

Как сделать правильно:

Оставляем основной динамический список номенклатуры без изменений. На форму подбора добавляем подчиненную (ведомую) таблицу «Остатки по партиям». При активизации строки в основном списке товаров мы будем программно отправлять быстрый запрос к базе данных и заполнять подчиненную таблицу остатками партий исключительно по текущему выбранному товару. Это обеспечит мгновенный отклик интерфейса.

Шаг 2. Запрос для получения документов-регистраторов и остатков

Для получения актуальных остатков по партиям и документов оприходования нам понадобится обратиться к виртуальной таблице остатков регистра накопления ПартииТоваровОрганизаций. Напишем пример запроса:


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

Запрос.УстановитьПараметр("Период", Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Номенклатура", ВыбранныйТовар);

РезультатЗапроса = Запрос.Выполнить();

Этот запрос вернет нам список документов поступления (поле ДокументПоступления), количество доступного товара по этой партии и его стоимость, которую менеджер сможет увидеть на экране.

Шаг 3. Реализация алгоритма переноса и "резки" строк

После того как менеджер выбрал партии в «Помощнике продаж», данные необходимо перенести в документ реализации. Допустим, клиенту требуется 10 единиц товара. На складе есть две подходящие партии: по первой осталось 3 штуки, по второй — 7 штук.

Проанализируем алгоритм заполнения документа:

  1. В табличную часть «Товары» документа «Реализация товаров и услуг» необходимо предварительно добавить реквизит ДокументПоступления (или Партия) с типом ссылки на документы поступления.
  2. При переносе из помощника программа должна автоматически разбить строку на несколько позиций. В нашем примере в документ запишутся две строки:
    • Строка 1: Товар, Количество = 3, Партия = «Приобретение №1».
    • Строка 2: Товар, Количество = 7, Партия = «Приобретение №2».
  3. Важный нюанс для печатных форм: Клиенту не нужно видеть внутреннее разделение нашего склада по партиям в расходной накладной. Поэтому при печати документов (УПД, ТОРГ-12) необходимо обязательно доработать алгоритм печати, чтобы строки с одинаковым товаром и ценой автоматически сворачивались в одну строку (в нашем случае — 10 штук).

Шаг 4. Обеспечение проведения по выбранным партиям

Чтобы система списала именно выбранные партии, и закрытие месяца не пересчитало их по ФИФО, вам придется вмешаться в процедуру проведения документа. Для этого можно пойти двумя путями:

Путь А (Сложнее): Изменить логику формирования движений по регистру ПартииТоваровОрганизаций в модуле проведения документа. Если в строке табличной части заполнено поле Партия, система должна формировать движение расхода по партии принудительно, игнорируя стандартный механизм ФИФО.

Путь Б (Проще и чище): Программно использовать встроенный механизм назначения (обособления). При переносе строки с партией в документ можно автоматически создавать или подбирать служебное «Назначение», привязанное к этой партии закупки. Система на уровне платформы отработает обособленное списание и сохранит себестоимость без вмешательства в алгоритмы закрытия месяца.

Резюме и рекомендации

Мы подробно проанализировали задачу вывода документов-регистраторов в помощнике подбора товаров. Прежде чем приступать к масштабному кодингу и изменять логику проведения документов, мы рекомендуем:

← На главную