В складских системах управления (WMS) вопрос оперативной и гибкой печати этикеток стоит особенно остро. Кладовщики работают на разных участках, используют разные принтеры (стационарные или переносные), и система должна четко понимать, на какое устройство отправить задание. Разберем подробно, как реализовать программный выбор принтера и настроить автоматическую печать при выполнении операций на ТСД (терминале сбора данных).
Рассмотрим стандартную ситуацию: пользователь хочет выбрать принтер из списка в интерфейсе 1С, и программа должна применить этот выбор без вывода диалогового окна настроек печати Windows. Для этого в платформе 1С предусмотрено специальное свойство объекта ТабличныйДокумент.
Проанализируем алгоритм реализации этого механизма:
Напечатать(), мы должны передать строку с именем принтера в свойство ИмяПринтера.Посмотрим на пример кода, который реализует эту логику:
// Предположим, ВыбранныйПринтер — это строковая переменная с точным сетевым именем принтера
ТабДок = Новый ТабличныйДокумент;
// Заполняем ТабДок данными этикетки...
ТабДок.ИмяПринтера = ВыбранныйПринтер;
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Выясним важный нюанс: если указанное имя принтера не будет найдено в системе, 1С отправит документ на принтер по умолчанию. Поэтому крайне важно обеспечить идентичность имен принтеров на всех рабочих станциях.
Ситуация с мобильными терминалами (ТСД) сложнее. ТСД работает через мобильный клиент или веб-интерфейс, и он не имеет прямого доступа к драйверам принтеров, установленным на сервере или локальных ПК. Разберем, как решается эта задача в современных редакциях 1С:WMS.
Вместо прямой отправки на печать используется механизм очереди печати. Процесс выглядит следующим образом:
Проанализируем, как программно создать такое задание из модуля ТСД:
// Код выполняется на стороне ТСД (Сервер)
Процедура СоздатьЗаданиеНаПечать(ДанныеЭтикетки, ПринтерНазначения)
НоваяЗапись = РегистрыСведений.ОчередьПечати.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.ИдентификаторПринтера = ПринтерНазначения;
НоваяЗапись.ДанныеПечати = Новый ХранилищеЗначения(ДанныеЭтикетки);
НоваяЗапись.Статус = Перечисления.СтатусыПечати.ВТрабте;
НоваяЗапись.Записать();
КонецПроцедуры
Часто возникает задача: как только кладовщик ввел (отсканировал) номер ячейки при отборе, должна сразу вылезти этикетка. Разберем, куда именно нужно интегрировать код для реализации этой функции.
В конфигурации 1С:WMS работа ТСД обычно строится на обработках, реализующих логику шагов бизнес-процесса. Вам необходимо найти процедуру, отвечающую за обработку завершения ввода данных. Чаще всего это ОбработкаСобытияТСД или специализированный метод в модуле формы мобильного клиента.
Рассмотрим пример логики в обработчике события:
// В обработчике события ввода данных на ТСД
Если ИмяСобытия = "ПодтверждениеЯчейки" Тогда
// Проверяем, что ввод успешен
Если ЗначениеЗаполнено(ТекущаяЯчейка) Тогда
// Формируем параметры этикетки
ПараметрыПечати = Новый Структура("Товар, Количество, Ячейка", ТекущийТовар, КолВо, ТекущаяЯчейка);
// Вызываем функцию отправки в очередь, описанную в Методе 2
ОтправитьВОчередьПечати(ПараметрыПечати);
// Продолжаем выполнение процесса на ТСД
КонецЕсли;
КонецЕсли;
Для высоконагруженных складов формирование графического ТабличногоДокумента может быть слишком медленным. В таких случаях мы используем прямую отправку команд на языке принтера (например, ZPL для принтеров Zebra).
Этот способ позволяет отправлять текстовые пакеты данных напрямую на IP-адрес принтера через сокеты или HTTP-запросы. Посмотрим, как может выглядеть формирование такой команды:
ТекстКомандыZPL = "^XA^FO50,50^A0N,36,36^FD" + АртикулТовара + "^FS^XZ";
// Далее используем объект НТТРЗапрос или внешнюю компоненту для отправки на IP принтера
Важные преимущества этого метода:
Проанализируем ситуацию, когда кладовщики постоянно меняются местами. Привязывать принтер к конкретному пользователю — неэффективно. Лучше всего использовать привязку "Рабочее место (ТСД) -> Принтер" или "Складской участок -> Принтер".
В коде 1С мы можем определить текущее рабочее место через параметры сеанса или идентификатор устройства. Таким образом, программа автоматически определит, что если сотрудник работает в зоне "А", то печать этикеток должна идти на принтер, находящийся физически в этой же зоне.
Рассмотрим, как это реализовать через БСП (Библиотеку стандартных подсистем), используя функцию УправлениеПечатьюКлиент.ПечатьДокументов(). Она позволяет передавать настройки печати в параметрах, что дает возможность гибко управлять выводом без вмешательства в типовые механизмы формирования макетов.
Подведем итог: для реализации качественной печати в 1С:WMS мы должны сочетать удобный интерфейс выбора принтера для офисных сотрудников и автоматизированную очередь печати для мобильных сотрудников. Использование свойства ИмяПринтера в сочетании с регистром очереди печати позволит закрыть 99% потребностей склада.