В типовых конфигурациях 1С, таких как Управление торговлей 11, ERP 2 или Комплексная автоматизация 2, механизм подбора товаров спроектирован таким образом, что при выборе позиции в корзину по умолчанию устанавливается количество, равное единице. Для оптовой торговли, где менеджеры часто отгружают весь доступный остаток, это создает дополнительные трудозатраты: приходится вручную корректировать количество для каждой строки. В данной статье мы разберем, как программно изменить это поведение и сделать так, чтобы система автоматически предлагала максимально доступное количество товара на текущем складе.
Прежде чем приступать к правкам кода, проанализируем, как работает форма подбора. В современных редакциях УТ 11 подбор — это сложная обработка, использующая общие модули для обмена данными между списком номенклатуры и временной корзиной. Ключевым звеном здесь является структура данных, описывающая выбранную строку номенклатуры. Если в этой структуре нет данных о доступном остатке, клиентская часть формы просто не «узнает», какое число нужно подставить.
Основная логика сосредоточена в общем модуле ПодборТоваровКлиентСервер и в самой форме подбора номенклатуры. Процесс добавления товара обычно инициируется двойным кликом или перетаскиванием (drag-and-drop).
Первым делом нам необходимо убедиться, что данные об остатках передаются вместе с информацией о товаре. Для этого мы обратимся к функции, которая инициализирует структуру строки. Рассмотрим, как это сделать правильно через механизм расширений, чтобы не снимать конфигурацию с поддержки.
Нам потребуется внести изменения в общий модуль ПодборТоваровКлиентСервер в функцию СтруктураСтрокиНоменклатуры. Мы воспользуемся аннотацией &После, чтобы добавить наше поле Доступно в общую структуру:
&После("СтруктураСтрокиНоменклатуры")
Функция Расш1_СтруктураСтрокиНоменклатуры(Результат)
// Добавляем поле, в котором будет храниться информация об остатке
Результат.Вставить("Доступно", 0);
Возврат Результат;
КонецФункции
Этот шаг критически важен. Без наличия этого ключа в структуре, любые попытки обратиться к ТекущаяСтрокаНоменклатуры.Доступно на стороне клиента могут вызвать ошибку или вернуть неопределенное значение.
Теперь, когда структура подготовлена, нам нужно найти место, где количество «1» жестко прописывается в коде. Как выяснилось в ходе обсуждения проблемы, наиболее эффективным местом для правки является функция ПолучитьПараметрыТовараПередДобавлениеВКорзину или непосредственно вызов в процедуре ДобавитьВКорзинуНаКлиенте.
Рассмотрим ситуацию, когда мы хотим, чтобы при клике на товар он сразу попадал в корзину с полным остатком. Выясним причину, почему стандартная процедура ставит единицу. Обычно это выглядит так: ПараметрыТовара.КоличествоУпаковок = 1;. Мы заменим эту логику на использование данных из динамического списка.
Пример модификации кода в форме подбора:
&НаКлиенте
Процедура Расш1_ДобавитьВКорзинуНаКлиенте(ПараметрыФормы)
// Получаем текущие данные из списка номенклатуры
ТекущаяСтрока = Элементы.СписокНоменклатуры.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
// Вместо фиксированной единицы подставляем доступный остаток
// Важно: убедитесь, что колонка "Доступно" выведена в динамический список
ПараметрыТовара.КоличествоУпаковок = ТекущаяСтрока.Доступно;
КонецЕсли;
КонецПроцедуры
Важно помнить, что в УТ 11 есть настройка «Запрашивать цену и количество». Посмотрим на два варианта развития событий:
ОткрытьФормуВводаЦенаКоличество, чтобы в поле «Количество» по умолчанию передавалось значение ТекущиеДанные.Доступно.Проанализируем процедуру открытия формы ввода. Нам нужно найти строку, где заполняются ПараметрыНоменклатуры, и изменить инициализацию количества:
// В процедуре ОткрытьФормуВводаЦенаКоличество
ПараметрыНоменклатуры.Вставить("Количество", Элементы.СписокНоменклатуры.ТекущиеДанные.Доступно);
При реализации данного функционала мы можем столкнуться с несколькими техническими сложностями, которые стоит разобрать подробнее:
1. Учет упаковок. Если в системе используются упаковки, то поле Доступно в динамическом списке может отображаться в базовых единицах измерения, а подбор может осуществляться в упаковках (например, коробках). В таком случае простое копирование значения приведет к ошибке в расчетах. Проверьте, в каких единицах выводится остаток, и при необходимости выполните пересчет через коэффициент упаковки.
2. Асинхронная загрузка остатков. В последних версиях 1С остатки в форме подбора могут подгружаться асинхронно для ускорения работы интерфейса. Если пользователь кликнет по товару до того, как система успела вычислить остаток, в поле Доступно может оказаться 0. Рекомендуется добавить проверку: если остаток еще не загружен или равен нулю, оставлять количество равным единице, чтобы не блокировать работу пользователя.
3. Характеристики и серии. Если ведется учет по характеристикам, убедитесь, что вы берете остаток именно по конкретной характеристике. В динамическом списке подбора остаток обычно детализирован, но при программном обращении к ТекущиеДанные важно не перепутать общий остаток по номенклатуре с остатком по конкретному уникальному идентификатору строки.
Чтобы решение было долговечным и не вызывало проблем при обновлении системы, придерживайтесь следующих правил:
&Вместо или &После позволит вам сохранить доработки при обновлении конфигурации вендором.Доступно может содержать отрицательное значение. Обязательно добавьте проверку Макс(Остаток, 1), чтобы в корзину не попадало отрицательное количество.Таким образом, мы проанализировали механизм работы формы подбора и реализовали автоматическую подстановку максимального количества. Это небольшое изменение способно значительно ускорить процесс формирования заказов и реализаций, делая работу менеджеров более эффективной и комфортной.