Как правильно проверить значение реквизита товара при продаже в 1С:Предприятие 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При автоматизации торговых операций часто возникает задача проверки дополнительных признаков товара. Например, нужно определить, подлежит ли товар маркировке, чтобы при печати фискального чека на ККМ выводить дополнительный QR-код. Разберем, почему попытки использовать метод НайтиПоРеквизиту для проверки конкретной позиции в чеке ведут к ошибкам и как реализовать это правильно.

Разбираем типичную ошибку

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

Если в вашей функции написано следующее:


Номен = СоздатьОбъект("Справочник.Номенклатура");
Если Номен.НайтиПоРеквизиту("Маркер", 1, 1) = 1 Тогда
    // Действия с ККМ
КонецЕсли;

Программа просто найдет любой товар в базе, у которого Маркер равен 1, и начнет печатать QR-код для этого найденного товара, независимо от того, что именно вы продаете в текущем чеке. Это приводит к логическим ошибкам в работе торгового оборудования.

Реализуем корректную проверку

Для того чтобы проверить реквизит конкретного товара, нам не нужно искать его в справочнике. Если товар уже выбран в строке табличной части документа (например, в «Чеке ККМ»), ссылка на него у нас уже есть. Мы можем обратиться к его реквизитам напрямую через точку.

Шаг 1: Получение ссылки на товар

Рассмотрим структуру обработки табличной части документа. Нам необходимо перебрать все строки документа и для каждой из них выполнить проверку. Используем методы ВыбратьСтроки() и ПолучитьСтроку().


ОбъектККМ.ВыбратьСтроки();
Пока ОбъектККМ.ПолучитьСтроку() = 1 Цикл
    // Предположим, колонка с товаром называется "Товар"
    ТекущийТовар = ОбъектККМ.Товар;
    
    // Проверяем реквизит "Маркер" у полученного объекта
    Если ТекущийТовар.Маркер = 1 Тогда
        // Здесь размещаем код для печати QR-кода
    КонецЕсли;
КонецЦикла;

Шаг 2: Учет особенностей реквизита

Важно учитывать тип реквизита. Если в конфигураторе реквизит Маркер имеет тип «Число» (длина 1), то сравнение с единицей будет работать корректно. Однако, если реквизит случайно был создан как «Строка», условие ТекущийТовар.Маркер = 1 работать не будет из-за несовпадения типов данных. В таком случае рекомендуем использовать приведение типов:


Если Число(ТекущийТовар.Маркер) = 1 Тогда
    // Выполняем действия
КонецЕсли;

Почему стоит использовать прямое обращение?

  1. Производительность: Прямое обращение Товар.Маркер происходит мгновенно, так как вы уже работаете с загруженным объектом. Поиск по всему справочнику через НайтиПоРеквизиту — это «тяжелая» операция, которая при большом количестве номенклатуры будет замедлять работу программы.
  2. Точность: Прямое обращение гарантирует, что вы проверяете именно тот товар, который продаете в данный момент, а не случайный элемент, удовлетворяющий условию поиска.
  3. Читаемость кода: Код становится чище и короче. Вам не нужно создавать лишние объекты Справочник.Номенклатура внутри цикла, что снижает потребление памяти.

Заключение

Для решения задачи маркировки товаров в 1С:Предприятие 7.7 откажитесь от поиска по справочнику в пользу прямого доступа к атрибутам объекта. Проанализируйте свою табличную часть, получите ссылку на товар из нужной колонки и через точечную нотацию проверьте значение реквизита. Этот метод является стандартом разработки в 1С и позволяет избежать большинства ошибок при работе с номенклатурой.

Помните, что при интеграции с торговым оборудованием важно также проверять, чтобы объект ККМ корректно инициализировался. Если после внедрения кода печать QR-кода не происходит, проверьте, заполнено ли значение реквизита Маркер в самой карточке товара в справочнике Номенклатура.

← На главную