Как реализовать подбор номенклатуры в документе «Пересчёт товаров» в 1С:УТ 11.4

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

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

Методология работы документа «Пересчёт товаров»

Прежде чем приступать к программным изменениям, проанализируем, почему типовой функционал может казаться неудобным. В документе ПересчетТоваров предполагается, что табличная часть уже содержит перечень товаров, которые подлежат проверке. Если мы просто добавим стандартную команду Подбор, система по умолчанию будет добавлять новую строку при каждом выборе товара. Это приведет к дублированию позиций, что критично для инвентаризации, где одна позиция номенклатуры (с учетом характеристики и серии) должна занимать ровно одну строку.

Решение 1: Использование встроенного функционала отборов

Малоизвестный, но эффективный способ вызвать окно подбора без доработки кода — это использование расширенного фильтра. Разберем этот алгоритм:

  1. В документе «Пересчёт товаров» перейдем к кнопке Заполнить — Подобрать товары (или настроить отбор).
  2. Если в настройках отбора выбрать поле Номенклатура и установить вид сравнения В списке, в форме выбора появится заветная кнопка Подбор.
  3. Через это окно можно выбрать нужные позиции, и они будут добавлены в список для заполнения документа.

Этот метод помогает сформировать список, но не решает задачу оперативного изменения поля Факт в уже заполненном документе.

Решение 2: Имитация работы сканера штрихкодов

Проанализируем ситуацию: когда мы используем сканер, система не плодит строки, а находит существующую и увеличивает фактическое количество на единицу. Если штрихкода нет, мы можем использовать встроенное поле поиска (обычно это поиск по артикулу или текстовый поиск в верхней части ТЧ). В типовых решениях УТ 11 за это отвечает механизм, вызываемый при вводе данных в поле поиска. Если ввести артикул вручную и нажать Enter, система отработает поиск аналогично сканированию. Это позволяет «подбирать» товар, не открывая дополнительных окон.

Решение 3: Программная реализация подбора через расширение

Для реализации полноценного подбора, как в Заказе клиента, нам потребуется внести изменения в форму документа. Рассмотрим, как это сделать правильно, используя механизм расширений, чтобы сохранить конфигурацию на поддержке.

Шаг 1. Добавление команды подбора

Создадим в расширении команду формы ПодобратьТовары и разместим её на командной панели табличной части Товары. В обработчике команды вызовем стандартную обработку подбора товаров:


&НаКлиенте
Процедура ПодобратьТовары(Команда)
    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("Склад", Объект.Склад);
    ПараметрыПодбора.Вставить("Дата", Объект.Дата);
    // Дополнительные параметры в зависимости от версии УТ
    ПродажиКлиент.ОткрытьФормуПодбораТоваров(ЭтаФорма, ПараметрыПодбора);
КонецПроцедуры

Шаг 2. Обработка выбора (ChoiceProcessing)

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


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    // Проверяем, что данные пришли из формы подбора
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") И ВыбранноеЗначение.Свойство("МассивВыбранныхТоваров") Тогда
        Для Каждого СтрокаПодбора Из ВыбранноеЗначение.МассивВыбранныхТоваров Цикл
            ПараметрыПоиска = Новый Структура;
            ПараметрыПоиска.Вставить("Номенклатура", СтрокаПодбора.Номенклатура);
            ПараметрыПоиска.Вставить("Характеристика", СтрокаПодбора.Характеристика);
            
            НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыПоиска);
            
            Если НайденныеСтроки.Количество() > 0 Тогда
                // Если товар найден, увеличиваем количество Факт
                ТекущаяСтрока = НайденныеСтроки[0];
                ТекущаяСтрока.КоличествоФакт = ТекущаяСтрока.КоличествоФакт + СтрокаПодбора.Количество;
            Иначе
                // Если товара нет в документе, добавляем новую строку
                НоваяСтрока = Объект.Товары.Добавить();
                ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПодбора);
                НоваяСтрока.КоличествоФакт = СтрокаПодбора.Количество;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Нюансы работы с сериями и упаковками

Выясним причину, по которой обычный поиск может не сработать. В документе ПересчетТоваров уникальность строки определяется связкой: Номенклатура + Характеристика + Назначение + Серия + Упаковка. Если ваша организация использует складской учет по сериям или статусы номенклатуры (например, "В наличии" или "Зарезервировано"), обязательно включайте эти поля в ПараметрыПоиска функции НайтиСтроки().

Разберем ситуацию с сериями. Если в настройках склада включена политика учета серий, то при подборе система должна запрашивать серию. Если серия не заполнена в подборе, а в документе она обязательна, возникнет ошибка проведения. Рассмотрим пример корректного поиска с учетом серий:


// Внутри цикла обработки выбора
ПараметрыПоиска = Новый Структура("Номенклатура, Характеристика, Серия");
ЗаполнитьЗначенияСвойств(ПараметрыПоиска, СтрокаПодбора);
НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыПоиска);

Оптимизация: Использование динамических списков

Если штатный подбор кажется слишком тяжеловесным для инвентаризации, можно реализовать свою упрощенную форму выбора. Выбросим на форму динамический список с запросом к справочнику Номенклатура, добавим туда колонку с текущими остатками из регистра ТоварыНаСкладах. Это позволит кладовщику сразу видеть, сколько товара должно быть на полках, прямо в момент подбора.

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

Таким образом, мы выяснили, что отсутствие прямой кнопки подбора в УТ 11.4 — это не ограничение платформы, а методологическая позиция разработчиков. Однако, используя расширения и переопределяя процедуру ОбработкаВыбора, мы можем вернуть привычный и удобный функционал, объединяя преимущества быстрого поиска и корректного суммирования фактических остатков.

← На главную