Как правильно переносить фискальные операции через Конвертацию данных 2 (КД2) без дублирования записей?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При настройке обмена данными между конфигурациями часто возникает необходимость переноса информации о пробитых чеках. Например, когда чеки физически пробиваются в одной программе (например, «Альфа-Авто»), а бухгалтерский и управленческий учет ведется в другой — «1С:Комплексная автоматизация» (КА) или «1С:ERP Управление предприятием». В современных конфигурациях статус чека в документе (отображение гиперссылки «Чек пробит» или «Чек не пробит») напрямую зависит от наличия записей в регистрах фискальных операций.

В этой статье мы подробно разберем, как решить технические сложности при переносе фискальных данных с помощью конфигурации «Конвертация данных 2.1» (КД2). Мы выясним причину дублирования записей, разберемся с назначением регистров и настроим правильную выгрузку данных «прицепом» к документам без использования лишних правил выгрузки данных (ПВД).

Шаг 1. Разбираемся с регистрами: «ЖурналФискальныхОпераций» против «ФискальныеОперации»

Сначала проанализируем ситуацию с дублированием регистров в типовых конфигурациях 1С. В процессе развития Библиотеки подключаемого оборудования (БПО) фирма 1С изменила архитектуру хранения фискальных чеков:

  1. ЖурналФискальныхОпераций — устаревший регистр. Он активно использовался в старых версиях БПО (до перехода на форматы фискальных данных ФФД 1.05 и 1.2, ориентировочно до весны 2019 года). В современных конфигурациях он оставлен исключительно для обратной совместимости, чтобы при обновлении не потерялись старые данные.
  2. ФискальныеОперации — актуальный рабочий регистр сведений. Именно на его основе современные документы КА 2, ERP 2 и УТ 11 определяют статус фискализации (пробит чек или нет).

Вывод: При настройке правил обмена в КД2 переносить данные необходимо только в регистр сведений ФискальныеОперации. Наполнение старого регистра ЖурналФискальныхОпераций больше не требуется.

Шаг 2. Решаем проблему ИдентификатораЗаписи и дублирования при повторном обмене

Регистр сведений ФискальныеОперации имеет два ключевых измерения: ДокументОснование (документ, по которому пробит чек) и ИдентификаторЗаписи (уникальный GUID попытки фискализации).

Если при выгрузке генерировать ИдентификаторЗаписи динамически через создание нового GUID:


Если Не ОбъектНайден Тогда
    Объект.ИдентификаторЗаписи = Строка(Новый УникальныйИдентификатор());
КонецЕсли;

То при каждом повторном обмене данными для одного и того же документа будет создаваться новая запись в регистре, так как КД2 не сможет сопоставить существующую запись. Для решения этой проблемы мы должны использовать детерминированный идентификатор — уникальную строку, которая всегда будет одинаковой для одного и того же документа-источника при любых повторных выгрузках.

Рассмотрим два варианта формирования такого идентификатора:

Вариант А. На один документ в источнике всегда приходится только один чек.
В этом случае идеальным решением будет использование уникального идентификатора (GUID) самого документа-источника. Нам нужно получить GUID документа и передать его в качестве измерения ИдентификаторЗаписи.

Вариант Б. У одного документа может быть несколько чеков (например, предоплата и доплата).
В этом случае к GUID документа-источника необходимо добавить уникализирующий суффикс, например, номер чека или номер смены. Пример формирования строки:

Строка(Источник.Ссылка.УникальныйИдентификатор()) + "_" + Строка(Выборка.НомерЧекаККМ)

Шаг 3. Реализация выгрузки регистра без создания ПВД (по стандарту КД2)

Многие разработчики совершают ошибку, создавая отдельные Правила выгрузки данных (ПВД) для регистра сведений и пытаясь настроить там сложные отборы. На самом деле, регистр сведений ФискальныеОперации жестко подчинен документам-основаниям. По стандарту КД2 такие данные должны выгружаться автоматически вместе с самим документом.

Рассмотрим по шагам, как это реализовать:

  1. Создадим ПКО для регистра сведений ФискальныеОперации. Источник оставляем пустым, Приемник выбираем РегистрСведенийСсылка.ФискальныеОперации.
  2. Для свойств регистра (ресурсов и измерений) создаем ПКС. Для всех ПКС устанавливаем флаг «Получать из входящих данных».
  3. В качестве полей поиска (по которым КД2 будет определять уникальность записи в приемнике) отмечаем измерения: ДокументОснование и ИдентификаторЗаписи.
  4. В ПКО документа (например, ПриходныйКассовыйОрдер) переходим в обработчик события После выгрузки и пишем программный код выгрузки записей регистра.

Проанализируем пример кода для обработчика После выгрузки в ПКО документа:


// Запрос для получения фискальных реквизитов из базы-источника.
// В зависимости от конфигурации источника (например, Альфа-Авто), 
// данные могут храниться в реквизитах самого документа или связанных регистрах.
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Док.Ссылка КАК ДокументОснование,
    |	Док.Организация КАК Организация,
    |	Док.СуммаДокумента КАК Сумма,
    |	Док.НомерЧека КАК НомерЧекаККМ,
    |	Док.НомерСмены КАК НомерСменыККМ,
    |	Док.КассаККМ.ЗаводскойНомер КАК РегистрационныйНомерККТ
    |ИЗ
    |	Документ.ПриходныйКассовыйОрдер КАК Док
    |ГДЕ
    |	Док.Ссылка = &ТекущийДокумент";

Запрос.УстановитьПараметр("ТекущийДокумент", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Создаем структуру для передачи параметров в ПКО регистра
    ПараметрыЗаписи = Новый Структура;
    ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, Выборка);
    
    // Формируем детерминированный ИдентификаторЗаписи на основе GUID документа
    ИдентификаторСвязи = Строка(Источник.Ссылка.УникальныйИдентификатор());
    ПараметрыЗаписи.Вставить("ИдентификаторЗаписи", ИдентификаторСвязи);
    
    // Выгружаем запись регистра сведений по правилу конвертации
    ВыгрузитьПоПравилу(,, ПараметрыЗаписи,, "ФискальныеОперации");
КонецЦикла;

Преимущества описанного подхода

Использование этого метода решает сразу несколько серьезных проблем интеграции:

← На главную