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