При работе с программными продуктами 1С, особенно в сфере торговли, автоматизация ввода данных является ключевым фактором эффективности. Одной из наиболее востребованных функций является заполнение табличных частей документов путём сканирования штрихкодов. Рассмотрим подробно, какие процедуры отвечают за этот процесс в 1С:Управление торговлей 11 (УТ 11) и как мы можем с ними работать.
В процессе нашей работы с 1С мы часто сталкиваемся с необходимостью понять, как именно система выполняет те или иные действия. В данном случае, мы хотим выяснить, какая процедура в УТ 11 отвечает за автоматическое заполнение табличной части документа, например, "Реализация товаров и услуг" или "Поступление товаров и услуг", при считывании штрихкода товара. Разберем по шагам механизмы, используемые в конфигурации, и проанализируем ключевые процедуры.
ОбработатьШтрихкодыЦентральной процедурой, отвечающей за обработку данных, полученных со сканера штрихкодов и последующее заполнение табличной части документа, является ОбработатьШтрихкоды. Мы найдем её в модуле формы документа. Эта процедура помечена директивой &НаКлиенте, что означает её выполнение на стороне клиентского приложения.
Рассмотрим её структуру и логику работы. При вызове процедура принимает один параметр — ДанныеШтрихкодов, который содержит информацию о считанных штрихкодах.
ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(). Если штрихкоды не валидны, процедура завершается. Также происходит очистка предыдущих сообщений с помощью вызова ОчиститьСообщений(), чтобы не отвлекать пользователя устаревшей информацией.Структура, который называется СтруктураДействийСДобавленнымиСтроками. Эта структура играет ключевую роль, так как она определяет, какие реквизиты новой строки табличной части должны быть автоматически заполнены после того, как номенклатура будет найдена по штрихкоду. В неё мы "вставляем" (добавляем) пары "ключ-значение", где ключ – это название действия или реквизита, а значение – параметры для его заполнения.
Вот некоторые примеры того, что может быть определено в этой структуре:
ЗаполнитьПризнакТипНоменклатуры: Указывает, что нужно заполнить тип номенклатуры (товар, услуга и т.д.).ЗаполнитьПризнакХарактеристикиИспользуются: Определяет, используются ли характеристики для данной номенклатуры.ЗаполнитьПризнакАртикул: Заполняет артикул номенклатуры.ПроверитьЗаполнитьСклад: Отвечает за проверку и заполнение склада в строке табличной части. Параметры для этого действия мы получаем через функцию ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияСкладаВСтрокеТЧ().ЗаполнитьСтавкуНДС: Заполнение ставки НДС. Параметры для этого получаем через ОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС().ЗаполнитьКодТНВЭД: Заполняет код ТНВЭД, используя значение из объекта документа (Объект.НалогообложениеНДС).ЗаполнитьЦенуПродажи или ЗаполнитьУсловияПродаж: В зависимости от настроек использования соглашений с клиентами и ценообразования, мы определяем, будем ли заполнять конкретную цену продажи или более общие условия продаж. Это важно для корректного расчета стоимости товаров.ЗаполнитьПодразделениеВСтрокеТЧ: Заполняет подразделение в строке табличной части, используя значение из шапки документа.Дополнительно могут быть вызваны функции для дополнения этой структуры из других подсистем, например, ОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента() или НаправленияДеятельностиКлиентСервер.СтруктураДействийВставитьПриДобавленииСтроки(), что делает механизм заполнения очень гибким и расширяемым.
СтруктураДействийСИзмененнымиСтроками, которая пригодится, если существующая строка должна быть обновлена (например, увеличено количество при повторном сканировании).СтруктураДействий, в которую мы помещаем все собранные данные:
Штрихкоды: Массив считанных штрихкодов.СтруктураДействийСДобавленнымиСтроками: Наша заранее подготовленная структура.СтруктураДействийСИзмененнымиСтроками: Структура для изменений.ПараметрыУказанияСерий: Параметры для работы с сериями товаров.РассчитыватьНаборы: Флаг необходимости расчета наборов номенклатуры.ДобавлятьТолькоТоварСверхЗаказа: Флаг для специфических сценариев добавления.ТолькоТовары: Флаг, указывающий на работу только с товарами (например, при передаче на комиссию).ОбработатьШтрихкодыСервер(), передавая ей созданную СтруктуруДействий и КэшированныеЗначения. Именно в этой серверной процедуре происходит основная логика: поиск номенклатуры по штрихкоду в базе данных, добавление новой строки в табличную часть документа (или обновление существующей, если товар уже был найден), и заполнение реквизитов строки в соответствии с переданной СтруктуройДействийСДобавленнымиСтроками.ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды() для информирования пользователя о штрихкодах, по которым не удалось найти номенклатуру.ОткрытьПодборСерийПриСканированииШтрихкодаНоменклатуры().РассчитатьИтоговыеПоказатели()) и устанавливаем текущую строку в табличной части на только что добавленную (Элементы.Товары.ТекущаяСтрока = СтруктураДействий.ТекущаяСтрока;). Также может быть вызван УстановитьПризнакЗаполненияСклада().Для наглядности приведем фрагмент кода из процедуры ОбработатьШтрихкоды:
&НаКлиенте
Процедура ОбработатьШтрихкоды(ДанныеШтрихкодов)
Если Не ШтрихкодированиеНоменклатурыКлиент.ШтрихкодыВалидны(ДанныеШтрихкодов) Тогда
Возврат;
КонецЕсли;
ОчиститьСообщения();
ПрименитьОплатуБонуснымиБаллами(, Истина);
СтруктураДействийСДобавленнымиСтроками = Новый Структура;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
СтруктураДействийСДобавленнымиСтроками.Вставить("ПроверитьЗаполнитьСклад", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияСкладаВСтрокеТЧ(Объект, СкладГруппа));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДС", ОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияСтавкиНДС(Объект));
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьКодТНВЭД", Объект.НалогообложениеНДС);
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьСтавкуНДСВозвратнойТары", Объект.ВернутьМногооборотнуюТару);
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПризнакБезВозвратнойТары", Объект.ВернутьМногооборотнуюТару);
СтруктураДействийСДобавленнымиСтроками.Вставить("ПриИзмененииТипаНоменклатуры", Новый Структура("ЕстьРаботы, ЕстьОтменено", Истина, Ложь));
Если (ИспользоватьСоглашенияСКлиентами И ЗначениеЗаполнено(Объект.Соглашение)) Или (Не ИспользоватьСоглашенияСКлиентами И ИспользуетсяЦенообразование25) Тогда
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьУсловияПродаж", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийПродажВСтрокеТЧ(Объект));
Иначе
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьЦенуПродажи", ОбработкаТабличнойЧастиКлиентСервер.ПараметрыЗаполненияЦеныВСтрокеТЧ(Объект));
КонецЕсли;
СтруктураДействийСДобавленнымиСтроками.Вставить("ЗаполнитьПодразделениеВСтрокеТЧ", Новый Структура("Подразделение", Объект.Подразделение));
ОбработкаТабличнойЧастиКлиентСерверЛокализация.ДополнитьСтруктуруДействийПриИзмененииЭлемента(ЭтотОбъект, "Номенклатура", СтруктураДействийСДобавленнымиСтроками);
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСДобавленнымиСтроками, Объект);
СтруктураДействийСИзмененнымиСтроками = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками, Объект);
НаправленияДеятельностиКлиентСервер.СтруктураДействийВставитьПриДобавленииСтроки(ЭтаФорма, СтруктураДействийСДобавленнымиСтроками);
СтруктураДействий = ШтрихкодированиеНоменклатурыКлиент.ПараметрыОбработкиШтрихкодов;
СтруктураДействий.Штрихкоды = ДанныеШтрихкодов;
СтруктураДействий.СтруктураДействийСДобавленнымиСтроками = СтруктураДействийСДобавленнымиСтроками;
СтруктураДействий.СтруктураДействийСИзмененнымиСтроками = СтруктураДействийСИзмененнымиСтроками;
СтруктураДействий.ПараметрыУказанияСерий = ПараметрыУказанияСерий;
СтруктураДействий.РассчитыватьНаборы = Истина;
СтруктураДействий.ДобавлятьТолькоТоварСверхЗаказа = Истина;
СтруктураДействий.ТолькоТовары = Объект.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ПередачаНаКомиссию");
ОбработатьШтрихкодыСервер(СтруктураДействий,КэшированныеЗначения);
ШтрихкодированиеНоменклатурыКлиент.ОбработатьНеизвестныеШтрихкоды(СтруктураДействий,КэшированныеЗначения,ЭтаФорма);
Если ШтрихкодированиеНоменклатурыКлиент.НужноОткрытьФормуУказанияСерийПослеОбработкиШтрихкодов(СтруктураДействий) Тогда
ТекущиеДанныеИдентификатор = СтруктураДействий.МассивСтрокССериями[0];
ПодключитьОбработчикОжидания("ОткрытьПодборСерийПриСканированииШтрихкодаНоменклатуры",0.1,Истина);
КонецЕсли;
РассчитатьИтоговыеПоказатели;
Если СтруктураДействий.ТекущаяСтрока <> Неопределено Тогда
Элементы.Товары.ТекущаяСтрока = СтруктураДействий.ТекущаяСтрока;
КонецЕсли;
УстановитьПризнакЗаполненияСклада;
КонецПроцедуры
Таким образом, мы видим, что процедура ОбработатьШтрихкоды является оркестратором процесса. Она собирает все необходимые данные и параметры на клиенте, а затем передает их на сервер для выполнения основной логики поиска и заполнения.
ОбработкаОповещения и ОбработкаВнешнегоСобытияВ некоторых случаях, особенно когда сканеры штрихкодов подключены через COM-порт или другие внешние интерфейсы, событие сканирования может быть перехвачено не напрямую процедурой ОбработатьШтрихкоды, а через общие обработчики внешних событий формы. Две такие процедуры, которые мы должны знать, это ОбработкаОповещения и ОбработкаВнешнегоСобытия.
ОбработкаОповещения: Эта процедура предназначена для приема оповещений от других форм или объектов системы. Она может быть использована, когда, например, специализированная внешняя обработка или компонент драйвера сканера формирует оповещение о считанном штрихкоде. В такой процедуре может содержаться логика, которая в конечном итоге вызывает уже рассмотренную нами ОбработатьШтрихкоды, передавая ей полученные данные. Это часто встречается в более старых или кастомных интеграциях.ОбработкаВнешнегоСобытия: Эта процедура напрямую связана с обработкой событий от подключаемого оборудования. Например, если сканер штрихкодов настроен как "сканер в разрыв клавиатуры" или подключается через специальный драйвер, который генерирует внешние события 1С, то именно ОбработкаВнешнегоСобытия будет первой точкой входа. Она получает информацию о событии (источник, событие, данные) и уже внутри себя может разобрать штрихкод и передать его для дальнейшей обработки, опять же, чаще всего в процедуру ОбработатьШтрихкоды.Важный момент: Для корректной работы со сканером штрихкодов через эти механизмы крайне важна правильная настройка подключаемого оборудования в 1С. Мы можем найти эти настройки в разделе "Администрирование" -> "Подключаемое оборудование". Здесь мы указываем тип оборудования (сканер штрихкода), модель, порт подключения (COM, USB и т.д.) и другие параметры обмена данными. Без этих настроек система не сможет правильно перехватывать и интерпретировать события от сканера.
Таким образом, ОбработкаОповещения и ОбработкаВнешнегоСобытия служат своеобразными "воротами" для данных от внешних устройств, которые затем направляются в специализированные процедуры, такие как ОбработатьШтрихкоды, для выполнения основной бизнес-логики.
Когда мы сталкиваемся с необходимостью понять, как работает тот или иной механизм в 1С, особенно в сложной конфигурации, такой как УТ 11, наиболее эффективным инструментом является отладка. Давайте рассмотрим шаги, которые помогут нам в этом процессе:
ТвояТЧ.Количество, ТвояТЧ.Номенклатура) или весь объект табличной части (Объект.Товары). Затем мы можем пошагово проходить код, наблюдая, как меняются значения этих переменных. Это позволяет нам точно определить момент, когда данные добавляются или изменяются.Номенклатура или Количество) в цикле добавления строк, мы можем попробовать найти в модулях формы или менеджера объекта конструкцию типа Объект.Товары.Добавить() или присвоение значений вроде НоваяСтрока.Номенклатура = .... Хотя прямой поиск Объект.Товары.Номенклатура в цикле может не дать результатов, как это было в обсуждаемой теме, потому что заполнение происходит через структуры и серверные вызовы, поиск по Добавить() или по конкретным служебным процедурам (как ОбработатьШтрихкодыСервер) будет более продуктивным.Мы всегда должны помнить, что в управляемых формах 1С УТ 11 существует разделение на клиентский и серверный контекст. Основная работа с объектом базы данных (добавление строк, изменение реквизитов) всегда происходит на сервере. Клиентские процедуры лишь подготавливают данные и вызывают серверные для выполнения фактических операций.
Чтобы полностью понимать процесс заполнения табличной части при сканировании штрихкода, давайте обобщим несколько важных аспектов:
СтруктураДействийСДобавленнымиСтроками. Это позволяет системе автоматически применять правила ценообразования, налогообложения и другие параметры, заданные в настройках пользователя или документа.Понимание этих механизмов позволяет нам не только эффективно использовать функционал 1С:УТ 11, но и самостоятельно диагностировать проблемы, а также разрабатывать необходимые доработки для оптимизации торговых процессов. Главное – не бояться "проваливаться" в код и использовать отладчик, чтобы проследить весь путь данных от сканера до табличной части документа.