При работе с расширением функционала Рабочего места кассира (РМК) в конфигурации Управление торговлей 11.2 программисты часто сталкиваются с тем, что стандартные события табличной части, такие как ТоварыПриИзменении или ТоварыПриНачалеРедактирования, не срабатывают при интерактивном подборе или сканировании товаров. Это происходит из-за особенностей реализации механизма подбора и программного добавления строк. Рассмотрим подробнее, как правильно реализовать вывод остатков в ТЧ при добавлении новой позиции.
Для начала разберем, почему стандартные обработчики могут «молчать». В управляемых формах 1С добавление данных в таблицу может происходить несколькими путями:
Проанализируем ситуацию пользователя: при подборе через специализированную форму события изменения не перехватываются. Это происходит потому, что данные вносятся в коллекцию Объект.Товары напрямую в коде обработки результата выбора. Выясним, как это исправить.
Одним из самых эффективных способов поймать момент добавления товара из формы подбора является использование события формы ОбработкаВыбора. Рассмотрим, почему это работает. Когда мы открываем форму подбора, мы передаем параметр ЭтотОбъект (или ЭтаФорма) в качестве владельца. Посмотрим на типичный код открытия подбора в УТ 11.2:
ПараметрыФормы = Новый Структура;
// ... заполнение параметров ...
ОткрытьФорму("Обработка.ПодборТоваровВДокументПродажи.Форма", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);
Так как владельцем указан ЭтотОбъект, результат выбора вернется именно в процедуру ОбработкаВыбора модуля формы РМК. Если бы владельцем была указана сама таблица (Элементы.Товары), то сработало бы событие ТоварыОбработкаВыбора.
Разберем пример реализации обработчика для расчета остатка:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Стандартная логика обработки выбора в УТ 11
// После того как типовой код добавил строки, нам нужно найти их и рассчитать остаток
Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
// Здесь вызываем процедуру расчета остатков для текущей строки или всей ТЧ
РассчитатьОстаткиВТабличнойЧасти();
КонецЕсли;
КонецПроцедуры
Если товар добавляется сканером, то событие ОбработкаВыбора не сработает. В РМК сканирование обрабатывается через процедуру ОбработатьШтрихкоды. В типовых решениях после успешного поиска номенклатуры по штрихкоду вызывается процедура добавления строки в корзину (например, ДобавитьТоварВКорзину).
Рекомендуется найти в модуле формы место, где вызывается программное добавление строки, и именно там вызвать серверную функцию для получения остатка. В УТ 11.2 это часто делается в процедурах, отвечающих за заполнение данных строки по найденной номенклатуре.
Наиболее правильным и архитектурно чистым решением в УТ 11.2 является использование процедур, которые отвечают за заполнение реквизитов строки ТЧ вне зависимости от способа ввода (подбор, сканер или выбор из списка). Проанализируем модуль формы на наличие процедур типа ЗаполнитьДанныеСтрокиТабличнойЧасти или аналогичных.
Алгоритм действий программиста:
ТоварыНоменклатураПриИзменении).Пример серверного кода для получения остатка:
&НаСервере
Процедура ЗаполнитьОстатокВСтроке(ТекущаяСтрока)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад И Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки";
Запрос.УстановитьПараметр("Склад", Объект.Склад);
Запрос.УстановитьПараметр("Номенклатура", ТекущаяСтрока.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ТекущаяСтрока.Остаток = Выборка.Остаток;
Иначе
ТекущаяСтрока.Остаток = 0;
КонецЕсли;
КонецПроцедуры
Важно помнить, что РМК — это высоконагруженное рабочее место. Получение остатка по каждой строке отдельным запросом может замедлить работу кассира при большом чеке. Рассмотрите возможность пакетного получения остатков для всех товаров в табличной части, если выполняется массовый подбор (из формы подбора часто возвращается массив структур).
Также проверьте, используется ли в вашей версии УТ 11.2 механизм оповещений. Иногда форма подбора не закрывается, а отправляет оповещение ОповеститьОВыборе или использует ОписаниеОповещения. В этом случае необходимо проверить процедуру ОбработкаОповещения в модуле формы РМК. Именно там происходит финальное «приземление» данных в таблицу, и это идеальное место для однократного вызова функции расчета остатков.
Подведем итог: для вывода остатка в ТЧ при добавлении строки необходимо перехватить данные в ОбработкаВыбора (для подбора), ОбработатьШтрихкоды (для сканера) или внедрить вызов расчета в общую серверную процедуру заполнения строки ТЧ. Использование расширений с аннотацией &После для типовых процедур заполнения данных строки будет самым надежным способом решения задачи.