В процессе работы с конфигурацией 1С:Управление торговлей 11 (релиз 11.4.13.180) пользователи часто сталкиваются с досадной проблемой: при попытке распечатать ценники или этикетки напрямую из документа «Приобретение товаров и услуг», колонка со штрихкодом в обработке печати остается пустой. При этом, если добавлять те же самые позиции в обработку вручную, штрихкоды подтягиваются корректно. В этой статье мы подробно разберем причины такого поведения системы и рассмотрим способы решения этой технической коллизии.
Ситуация выглядит следующим образом: в базе данных для номенклатуры зарегистрированы штрихкоды, они успешно считываются сканером в документах, однако при вызове команды «Печать этикеток и ценников» из формы документа поступления, табличная часть обработки заполняется товарами, но поле Штрихкод остается незаполненным. Если в этой же открытой форме обработки нажать на выбор номенклатуры в строке и перевыбрать ту же самую позицию, штрихкод магическим образом появляется. Это явно указывает на то, что данные в базе есть, но алгоритм автоматического заполнения «по документу» работает некорректно.
Проблема кроется в программном коде обработки ПечатьЭтикетокИЦенников, а именно в процедуре ЗаполнитьТаблицуТоваровПоДокументу. В релизах ветки 11.4.13 разработчиками была допущена ошибка в логике формирования SQL-запроса к регистру сведений ШтрихкодыНоменклатуры.
Когда система пытается массово получить штрихкоды для списка товаров из документа, она выполняет ЛЕВОЕ СОЕДИНЕНИЕ (Left Join) табличной части документа с регистром штрихкодов. В условии соединения участвуют не только Номенклатура и Характеристика, но и поле Упаковка. Выясним причину сбоя: в базе данных значение «пустой упаковки» может интерпретироваться либо как NULL, либо как пустая ссылка типа СправочникСсылка.УпаковкиЕдиницыИзмерения. В указанном релизе условие соединения прописано таким образом, что если упаковка в документе не указана (пустая), запрос ожидает строгое соответствие с «пустой» упаковкой в регистре, но из-за особенностей работы платформы с типами данных в сложных запросах, соединение не происходит, и результат возвращает пустое значение штрихкода.
Поскольку данная проблема является официально признанной ошибкой (багом) релиза 11.4.13.180, компания 1С выпустила специальные патчи (исправления). Это самый быстрый и безопасный способ решения проблемы без полного обновления конфигурации.
Рассмотрим более радикальный, но правильный с точки зрения эксплуатации системы метод. Ошибка была полностью устранена в последующих сборках. Если ваша текущая версия 11.4.13.180, рекомендуется выполнить обновление до релизов:
В этих версиях алгоритм подбора штрихкодов пересмотрен: система сначала пытается найти штрихкод с учетом конкретной упаковки, и если он не найден — ищет любой доступный штрихкод для данной номенклатуры и характеристики.
Если обновление невозможно, а патч по каким-то причинам не устанавливается, мы можем исправить запрос самостоятельно с помощью механизма расширений. Нам необходимо перехватить запрос в обработке ПечатьЭтикетокИЦенников. Посмотрим на пример того, как должен выглядеть фрагмент исправленного условия в запросе:
// Вместо жесткого соединения:
// И ТекстоваяТаблица.Упаковка = Штрихкоды.Упаковка
// Используем более гибкое условие в ГДЕ или через ВЫБОР:
ГДЕ
(Штрихкоды.Упаковка = ТекстоваяТаблица.Упаковка
ИЛИ (ТекстоваяТаблица.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
И Штрихкоды.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)))
Такой подход гарантирует, что система сопоставит товары без упаковок со штрихкодами, у которых упаковка также не задана.
Если этикетки нужно напечатать «здесь и сейчас», а программиста нет рядом, можно воспользоваться особенностью работы формы. Проанализируем алгоритм действий:
Иногда проблема может усугубляться некорректными настройками ведения учета. Проверим следующие моменты:
Таким образом, мы выяснили, что отсутствие штрихкода в печати из документа — это программная недоработка конкретного релиза 11.4.13.180, связанная с фильтрацией по пустой ссылке упаковки. Оптимальным решением будет установка исправляющего патча или обновление конфигурации до актуальной версии.