При автоматизации документооборота часто возникает задача не просто промаркировать документ ссылкой на базу данных, а физически «зашить» в него всю информацию. Это необходимо для защиты от подделок (изменение печатной формы после печати) и для максимально быстрого ввода данных в другую базу, которая может не иметь прямой связи с основной. Рассмотрим подробно, как реализовать размещение шапки и всей табличной части документа в одном двухмерном штрихкоде.
Для решения задачи нам подходят только двухмерные (2D) штрихкоды, так как обычные линейные коды (EAN-13, Code128) ограничены парой десятков символов. Проанализируем основные варианты, доступные в экосистеме 1С:
DataMatrix будет на 30–60% компактнее QR-кода. Он лучше считывается при частичном повреждении (до 30% поверхности). Максимальная емкость — около 2335 буквенно-цифровых символов.Проанализируем цифры: если ваш документ содержит 5–10 строк в табличной части, вам хватит любой из этих символик. Если же документ объемный, следует смотреть в сторону DataMatrix или QR-кода с обязательным сжатием данных.
Главная ошибка при попытке «запихнуть» таблицу в код — использование чистого текста с разделителями. Разберем по шагам, как правильно подготовить данные в 1С. Простое кодирование в Base64, которое часто упоминается на форумах, на самом деле увеличивает объем данных на 33%, что нам крайне невыгодно.
Рассмотрим более эффективный метод — использование встроенного объекта СжатиеДанных. Платформа 1С позволяет сжимать строки алгоритмом Deflate, что сокращает размер данных в 3–5 раз, особенно если в таблице много повторяющихся наименований или артикулов.
Пример кода для упаковки данных документа:
// 1. Формируем структуру данных (например, через JSON)
ДанныеДляКода = Новый Структура;
ДанныеДляКода.Вставить("Номер", Объект.Номер);
ДанныеДляКода.Вставить("Дата", Объект.Дата);
ДанныеДляКода.Вставить("Товары", Объект.Товары.Выгрузить());
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляКода);
СтрокаJSON = ЗаписьJSON.Закрыть();
// 2. Сжимаем данные
ДвоичныеДанныеJSON = ПолучитьДвоичныеДанныеИзСтроки(СтрокаJSON);
СжатыеДанные = СжатиеДанных.Сжать(ДвоичныеДанныеJSON, СпособСжатияДанных.Deflate);
// 3. Преобразуем в Base64 для передачи в генератор штрихкода
ИтоговаяСтрокаДляКода = Base64Строка(СжатыеДанные);
Использование JSON предпочтительнее простых разделителей (типа «;»), так как JSON легко парсится на стороне приемника стандартными средствами 1С и сохраняет типизацию данных.
Выясним причину, по которой штрихкоды часто не читаются. Даже если символика позволяет хранить 4000 знаков, физический размер кода ограничен шириной листа. Если мы попытаемся напечатать очень плотный DataMatrix на обычном офисном принтере с разрешением 203 dpi, размер одной точки (модуля) кода станет меньше физической возможности принтера напечатать четкий квадрат. В итоге границы «замылятся», и сканер не сможет распознать код.
Проанализируем рекомендации по печати емких кодов:
При работе с кодами, содержащими сотни и тысячи символов, стандартный режим работы сканера «в разрыв клавиатуры» (Keyboard Wedge) становится ненадежным. Символы могут «проглатываться» из-за высокой скорости передачи или зависеть от текущей раскладки клавиатуры на компьютере пользователя.
Разберем, как правильно подключить сканер для этой задачи:
Переведите сканер в режим эмуляции COM-порта (USB-Serial). В этом случае данные передаются напрямую в 1С через событие ВнешнееСобытие в виде единого массива байтов. Это исключает влияние раскладки и гарантирует целостность данных. В драйвере оборудования 1С выберите соответствующий порт и настройте обработку оповещения.
Если ваша цель — защитить документ от правок (например, чтобы кладовщик не мог вручную исправить количество в накладной и скрыть недостачу), простого кодирования недостаточно. Любой бесплатный сканер в смартфоне покажет содержимое кода.
Рассмотрим метод внедрения «контрольной суммы» или цифровой подписи (HMAC). Перед кодированием данных в штрихкод вычислите хеш-сумму от значимых полей документа (Номер, Дата, Сумма, Артикулы) с использованием секретного ключа, известного только вашей системе. Добавьте эту хеш-сумму в конец данных штрихкода.
При сканировании документа в приемной базе программа заново вычислит хеш от полученных данных и сравнит его с тем, что записан в коде. Если хоть одна цифра в тексте или штрихкоде была изменена, подписи не совпадут, и система выдаст предупреждение о подделке.
Подводя итог, можно сказать, что наиболее сбалансированным выбором для 1С сегодня является QR-код (из-за простоты внедрения) или DataMatrix (из-за компактности). Обязательно используйте СжатиеДанных и режим COM-порта для сканера. Это позволит вам размещать даже объемные спецификации на обычном листе А4, обеспечивая при этом высокую скорость и надежность обмена данными.