При автоматизации розничной торговли часто возникает задача программного формирования документов ЧекККМ. Однако разработчики нередко сталкиваются с ситуацией, когда данные в табличную часть Серии загружены, но в интерфейсе Рабочего места кассира (РМК) или в самой форме чека они «не подцепляются». Система ведет себя так, будто серии не указаны, и требует ручного вмешательства пользователя через форму подбора серий. Рассмотрим подробнее, почему это происходит и как правильно программно заполнить эти данные.
В конфигурации «1С:Управление торговлей 11.4» (а также в «Комплексной автоматизации 2» и «ERP») механизмы работы с сериями в рознице отличаются от оптовых документов, таких как ЗаказКлиента или РеализацияТоваровУслуг. Документ ЧекККМ тесно интегрирован с логикой РМК, которая выполняет жесткую валидацию данных перед пробитием чека. Простая вставка строк в таблицу серий не является достаточной, так как система опирается на служебные индикаторы состояния строк в основной таблице Товары.
Проанализируем основные механизмы, которые необходимо задействовать для корректного отображения серий:
КлючСвязи для сопоставления товара и его серий.СтатусУказанияСерий, который сообщает интерфейсу о корректности введенных данных.Связь между строкой в табличной части Товары и строками в табличной части Серии осуществляется не по номеру строки или ссылке, а через числовое поле КлючСвязи. Это позволяет одной строке товара соответствовать нескольким строкам серий (например, если вы продаете 10 единиц товара, из которых 5 относятся к одной серии, а 5 — к другой).
При заполнении документа программным способом мы должны:
Товары сгенерировать уникальное целое число и записать его в поле КлючСвязи.Серии для каждой строки, относящейся к этому товару, указать тот же самый КлючСвязи.Важно: Если ключи не совпадут или останутся нулевыми, система не сможет «увидеть» связь, и серии останутся «висеть в воздухе».
Самая частая причина, по которой серии «не подставляются» — это некорректное заполнение (или отсутствие заполнения) числового реквизита СтатусУказанияСерий в табличной части Товары. Этот реквизит управляет тем, какой значок отображается в строке товара и позволяет ли система провести документ.
В зависимости от политики учета серий на складе, этот статус может принимать различные значения:
Если ваша обработка заполняет таблицу Серии, но оставляет СтатусУказанияСерий равным 0, форма РМК будет считать, что действие по выбору серий еще не выполнено.
Вместо того чтобы вручную вычислять значения статусов (которые зависят от множества настроек: политики учета серий, склада, типа номенклатуры), рекомендуется использовать стандартные процедуры конфигурации. Посмотрим на пример вызова методов из общего модуля.
После заполнения табличных частей документа в коде обработки необходимо выполнить процедуру обновления:
// В контексте работы с объектом документа (например, ДокументОбъект)
СерииКлиентСервер.ОбновитьСтатусыУказанияСерий(Объект);
Эта процедура проходит по всем строкам документа, сопоставляет данные таблиц Товары и Серии через КлючСвязи и проставляет правильные числовые значения в СтатусУказанияСерий. После этого интерфейс документа «оживает», и иконки серий становятся зелеными.
Рассмотрим пример кода, который демонстрирует правильную последовательность действий при загрузке товара с серией в Чек ККМ:
// Создаем новую строку товара
НоваяСтрокаТовара = ЧекОбъект.Товары.Добавить();
НоваяСтрокаТовара.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрокаТовара.Количество = 1;
// Генерируем ключ связи (можно использовать текущий индекс или счетчик)
НоваяСтрокаТовара.КлючСвязи = ЧекОбъект.Товары.Количество();
// Добавляем серию
НоваяСтрокаСерии = ЧекОбъект.Серии.Добавить();
НоваяСтрокаСерии.Серия = ВыбраннаяСерия;
НоваяСтрокаСерии.Количество = 1;
НоваяСтрокаСерии.КлючСвязи = НоваяСтрокаТовара.КлючСвязи;
// Критически важный шаг: обновление статусов
// Если работаем на сервере, вызываем серверный метод заполнения
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Объект", ЧекОбъект);
// Вызываем типовой механизм пересчета статусов, который есть в модуле документа или общих модулях
СерииКлиентСервер.ОбновитьСтатусыУказанияСерий(ЧекОбъект);
Стоит учитывать, что форма РМК в УТ 11.4 очень специфична. Она часто работает с кэшированными данными или временными структурами. Если вы открываете документ, созданный внешней обработкой, и видите, что серии все равно не подтянулись, попробуйте следующее:
Записать()) после вызова всех процедур обновления статусов.Товары и ТЧ Серии приведет к сбросу статуса.РассчитатьСтатусыУказанияСерий(), который может быть определен в модуле менеджера или модуле объекта самого документа (зависит от конкретного релиза 11.4).Таким образом, для успешного программного заполнения серий в Чеке ККМ необходимо обеспечить триединство данных: правильно заполненная таблица Серии, идентичные КлючСвязи в обеих таблицах и актуализированный СтатусУказанияСерий в строках товаров.