При автоматизации складского учета алкогольной продукции в конфигурациях 1С (таких как «1С:Комплексная автоматизация», «1С:Управление торговлей», «1С:ERP» или «1С:Розница») разработчики и администраторы часто сталкиваются с системной обработкой «Проверка и подбор алкогольной продукции ЕГАИС». Основная сложность при попытке организовать автоматическую загрузку отсканированных штрихкодов или акцизных марок из текстового файла (или напрямую с ТСД) заключается в наличии сложной иерархической структуры — дерева упаковок (палеты, короба, блоки, бутылки).
Когда мы пытаемся загрузить плоский список марок, полученный от кладовщика, стандартный механизм сопоставления спотыкается об упаковки. Программа ожидает пошагового сканирования вложенности, из-за чего процесс автоматического импорта останавливается. В этой статье мы подробно разберем, как решить данную проблему как стандартными средствами настройки интерфейса, так и с помощью программной доработки дерева значений.
---
Прежде чем приступать к написанию программного кода и модификации типовых конфигураций, рассмотрим штатный функционал платформы 1С. Разработчики фирмы 1С предусмотрели возможность управления уровнем вложенности непосредственно из пользовательского интерфейса формы проверки.
Проанализируем, как скрыть дерево упаковок и перевести форму в режим работы с плоским списком бутылок:
Палеты с коробами и бутылками или Короба с бутылками.Результат: Теперь, когда дерево упаковок отсутствует, стандартный механизм загрузки штрихкодов из текстового файла или терминала сбора данных (ТСД) сможет сопоставить марки без системных ошибок вложенности. Данный способ идеально подходит для розничных магазинов, которым нет необходимости вести поштучный учет самих коробов и палет при приемке.
---
Если вам все же необходимо сохранить информацию об упаковках, но вы хотите избежать ручного сканирования каждого короба, можно воспользоваться быстрым приемом групповой обработки строк на форме:
Этот простой интерактивный прием позволяет мгновенно перевести все упаковки в статус подтвержденных, что исключает необходимость их индивидуального сканирования и позволяет сосредоточиться только на сверке содержимого.
---
Если перед вами стоит задача реализовать полностью автоматическую загрузку данных из внешнего файла (например, CSV или TXT с ТСД) в форму, где дерево упаковок должно быть сохранено и корректно заполнено, потребуется программная доработка формы.
Выясним причину, почему обычное добавление строк в таблицу не работает. Данные в форме проверки и подбора ЕГАИС жестко структурированы. Результаты проверки не хранятся в простых табличных частях документа ТТН. Они сериализуются в XML-структуру и записываются в реквизит объекта ДанныеПроверкиИПодбора, имеющий тип ХранилищеЗначений.
Для реализации корректного алгоритма нам необходимо программно обойти существующее на форме дерево значений, найти строки с соответствующими марками, изменить их статус, а затем пересчитать статусы их «родителей» (коробов и палет) снизу вверх.
Рассмотрим пример реализации рекурсивного поиска марки в дереве значений формы:
// Функция производит рекурсивный поиск строки с маркой в дереве значений формы
Функция НайтиСтрокуПоМарке(СтрокиДерева, ИскомыйШтрихкод) Экспорт
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
// Проверяем, совпадает ли штрихкод акцизной марки
Если СтрокаДерева.Штрихкод = ИскомыйШтрихкод Тогда
Возврат СтрокаДерева;
КонецЕсли;
// Если у строки есть подчиненные элементы (упаковки/бутылки), ищем в них
НайденнаяСтрока = НайтиСтрокуПоМарке(СтрокаДерева.Строки, ИскомыйШтрихкод);
Если НайденнаяСтрока <> Неопределено Тогда
Возврат НайденнаяСтрока;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
После того как строка с конкретной маркой бутылки найдена, нам нужно не просто поменять ее статус, но и скорректировать данные вышестоящих упаковок. Если этого не сделать, дерево вложенности станет невалидным, и форма выдаст ошибку при сохранении. Нам нужно пройти вверх по цепочке родительских узлов и увеличить счетчик фактически найденного количества вложений.
Разберем по шагам процедуру обновления родительских элементов:
// Процедура обновляет состояние родительских упаковок при успешной проверке вложенного элемента
Процедура ОбновитьРодительскиеУпаковки(СтрокаЭлемента)
Перем ТекущийРодитель;
ТекущийРодитель = СтрокаЭлемента.Родитель;
Пока ТекущийРодитель <> Неопределено Цикл
// Увеличиваем количество фактически проверенной продукции внутри упаковки
ТекущийРодитель.КоличествоВНаличии = ТекущийРодитель.КоличествоВНаличии + 1;
// Если количество совпало с плановым, автоматически меняем статус упаковки
Если ТекущийРодитель.КоличествоВНаличии >= ТекущийРодитель.КоличествоПлан Тогда
ТекущийРодитель.СтатусПроверки = Перечисления.СтатусыПроверкиАлкогольнойПродукции.ВНаличии;
КонецЕсли;
// Переходим к родителю более высокого уровня (например, от коробки к палете)
ТекущийРодитель = ТекущийРодитель.Родитель;
КонецЦикла;
КонецПроцедуры
Проанализируем общий алгоритм обработки файла загрузки:
НайтиСтрокуПоМарке, передавая в нее коллекцию строк дерева формы Объект.ДеревоПроверки.Строки.СтрокаМарки.СтатусПроверки = Перечисления.СтатусыПроверкиАлкогольнойПродукции.ВНаличии.ОбновитьРодительскиеУпаковки(СтрокаМарки) для корректного пересчета агрегированных данных по коробкам и палетам.При таком подходе иерархическая структура ЕГАИС полностью сохраняет свою целостность, а рутинный процесс проверки сводится к одной кнопке импорта файла.
---
Для наиболее опытных разработчиков 1С существует еще один альтернативный путь. Вместо того чтобы интерактивно работать с элементами экранного дерева на форме, можно заполнять данные напрямую в объект документа до момента открытия формы проверки.
Для работы со структурой упаковок, присланной поставщиком, в модуле интеграции ЕГАИС предусмотрена специальная функция:
Документы.ТТНВходящаяЕГАИС.ВходящееДеревоУпаковок(СсылкаНаДокумент)
Данный метод возвращает исходное дерево значений, содержащее полную информацию о вложенности алкогольной продукции. Вы можете программно сопоставить его со списком из вашего файла, заполнить результаты в структуру данных и сериализовать обратно в реквизит ДанныеПроверкиИПодбора (используя объект ХранилищеЗначений). При открытии формы подбора система автоматически считает уже готовые и проверенные данные из этого хранилища.
---
Мы рассмотрели различные пути решения проблемы с деревом упаковок ЕГАИС при интеграции с внешними файлами и ТСД. Выбор конкретного метода зависит от специфики вашего бизнеса: