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