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