При программном создании и открытии формы рабочего места кассира (РМК) для оформления продажи разработчики часто сталкиваются с ситуацией: в документ ЧекККМ передаются необходимые реквизиты, включая Подразделение, однако при фискализации и записи документа реквизит сбрасывается к значению по умолчанию. Разберем, почему типовые механизмы конфигурации «Управление торговлей» редакции 11.5 переопределяют этот реквизит, к каким последствиям это может привести в учете и как корректно решить задачу.
Проанализируем поведение типовой конфигурации. Когда мы пытаемся передать подразделение в форму чека при создании или изменяем его в обработчиках формы (например, в процедурах ПриСозданииНаСервере или ПередЗаписьюНаСервере), в отладчике реквизит действительно принимает нужное нам значение. Однако после нажатия кнопки пробития и фактической записи документа в базе оказывается подразделение, привязанное к текущему рабочему месту или кассе ККМ.
Выясним причину такого поведения архитектуры:
КассыККМ.Записать().Прежде чем вмешиваться в алгоритмы заполнения подразделения в чеке, важно понимать, как эти данные используются в дальнейшем учете:
ЧекККМ является оперативным фиксатором факта продажи. Окончательные финансовые движения, списание себестоимости и учет валовой прибыли формируются документом ОтчетОРозничныхПродажах при закрытии кассовой смены. Типовой механизм закрытия смены группирует чеки по кассе ККМ и подставляет в шапку отчета подразделение кассы. Если изменить подразделение только в чеке, при закрытии смены вся выручка все равно отразится на основном подразделении кассы.Посмотрим на практический вариант, который можно применить, если форма РМК вызывается из внешнего или нестандартного документа и чек требуется модифицировать уже после его успешной фискализации и записи. В этом случае мы перехватываем результат закрытия формы в обработчике оповещения или выбора.
Разберем реализацию: при закрытии чека вызывающий документ получает ссылку на созданный объект ЧекККМ в процедуре ОбработкаВыбора и вносит необходимые корректировки.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("ДокументСсылка.ЧекККМ") Тогда
// Вызываем серверную процедуру для изменения подразделения
СкорректироватьПодразделениеВЧеке(ВыбранноеЗначение, НужноеПодразделение);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СкорректироватьПодразделениеВЧеке(СсылкаНаЧек, НовоеПодразделение)
ОбъектЧека = СсылкаНаЧек.ПолучитьОбъект();
Если ОбъектЧека <> Неопределено Тогда
ОбъектЧека.Подразделение = НовоеПодразделение;
// Записываем документ в режиме проведения или записи
ОбъектЧека.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
Важный момент: Такой подход гарантирует, что типовой механизм пробития не перетрет реквизит, так как чек уже фискализирован и записан в базу данных.
Если требуется, чтобы подразделение подставлялось автоматически при любой записи конкретного типа чеков без ручного перехвата в вызывающей форме, перенесем логику на уровень модуля объекта.
Рассмотрим порядок действий:
ПередЗаписью для документа ЧекККМ или используем аннотацию &Перед("ПередЗаписью") в расширении конфигурации для модуля объекта.
// В модуле расширения документа ЧекККМ
&Перед("ПередЗаписью")
Процедура Расш_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем признак специального формирования чека
Если ЗначениеЗаполнено(ЭтотОбъект.ДокументОснование) Тогда
// Подставляем подразделение непосредственно перед фиксацией в базе
ЭтотОбъект.Подразделение = ЭтотОбъект.ДокументОснование.Подразделение;
КонецЕсли;
КонецПроцедуры
При таком подходе значение будет перезаписано в самый последний момент перед сохранением в базу данных, игнорируя инициализацию из настроек кассы ККМ на уровне формы.
Если изменение реквизита Подразделение требуется исключительно для фильтрации, отчетов или отличия документов друг от друга, безопаснее использовать альтернативные типовые механизмы, не ломая цепочку регламентированного и кассового учета:
ЧекККМ дополнительный реквизит (например, Подразделение-инициатор или Канал продаж). Он заполняется программно, выводится в любые стандартные списки и отчеты через настройку полей и группировок, не вызывая конфликтов с закрытием смены.ДокументОснование ссылкой на документ, вызвавший пробитие чека. По этой связи легко построить аналитические отчеты.КассыККМ отдельные элементы для каждого подразделения и настройте их привязку к рабочему месту.