В процессе эксплуатации распределенных информационных баз (РИБ) в конфигурации 1С:Розница 2.2 администраторы часто сталкиваются с человеческим фактором: кассиры закрывают смену и мгновенно выключают компьютер. В результате регламентное задание по синхронизации, настроенное по расписанию, не успевает запуститься или обрывается, и данные о продажах не попадают в центральный офис вовремя. Поскольку штатный механизм автоматического обмена при завершении работы, знакомый пользователям по версии 1.2, в версии 2.2 отсутствует, нам необходимо реализовать это решение самостоятельно.
В данной статье мы подробно разберем, как автоматизировать процесс синхронизации, используя программные средства и механизмы расширений, чтобы обмен данными происходил гарантированно после печати Z-отчета.
Проанализируем ситуацию: стандартное регламентное задание запускается по жесткому расписанию (например, каждые 30 минут). Если смена закрыта в 20:05, а следующее задание по плану в 20:30, компьютер с большой вероятностью будет выключен в 20:06. Использование административных мер (штрафы, инструкции) часто оказывается неэффективным из-за текучки кадров. Поэтому наилучшим выходом будет программная привязка процесса обмена к событию закрытия смены.
Мы рассмотрим три основных пути решения задачи:
Выясним, где именно в коде происходит завершение процесса закрытия смены. В конфигурации 1С:Розница 2.2 основным объектом является обработка ЗакрытиеСмены. Нам необходимо найти процедуру, которая вызывается после успешной печати фискального отчета (Z-отчета) и изменения статуса кассовой смены на "Закрыта".
Как правило, это процедура в модуле формы или модуле менеджера обработки ЗакрытиеСмены. Нам нужно вставить вызов нашего кода в самый конец процесса, когда все транзакции по закрытию смены в текущей базе уже успешно завершены.
Посмотрим на пример кода, который необходимо выполнить для запуска синхронизации. Мы будем использовать штатные функции БСП, так как они наиболее корректно обрабатывают параметры узлов обмена. Нам потребуется найти узел обмена, соответствующий нашей связи с центральной базой, и запустить для него процедуру выполнения обмена.
Рассмотрим пример реализации функции запуска обмена:
&НаСервере
Процедура ВыполнитьОбменПослеЗакрытияСмены()
// Получаем узел обмена (РИБ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка КАК Узел
|ИЗ
| ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
|ГДЕ
| НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел
| И НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ПометкаУдаления";
// Примечание: Имя плана обмена может отличаться в зависимости от настроек (РИБ по магазину и т.д.)
// В Рознице 2.2 часто используется ПоМагазину
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
УзелОбмена = Выборка.Узел;
// Выполняем обмен программно
ПараметрыОбмена = ОбменДаннымиСервер.СтруктураПараметровДляВыполненияОбменаДанными();
ПараметрыОбмена.УзелИнформационнойБазы = УзелОбмена;
ПараметрыОбмена.ДанныеДляОтправки = Истина;
ПараметрыОбмена.ДанныеДляПолучения = Истина;
// Запуск обмена через стандартный механизм БСП
ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзла(ПараметрыОбмена);
КонецЕсли;
КонецПроцедуры
Чтобы не снимать конфигурацию с поддержки и облегчить будущие обновления, крайне желательно использовать расширение. Создадим новое расширение и добавим в него обработку ЗакрытиеСмены. Нам нужно перехватить процедуру, завершающую процесс закрытия. Обычно это обработчик, следующий за вызовом метода печати чека на ККТ.
Проанализируем процедуру ПечатьОтчетаОРозничныхПродажах или аналогичную. Используем аннотацию &После, чтобы наш код выполнился сразу после штатного закрытия смены.
&После("ВыполнитьЗакрытиеСменыНаСервере")
Процедура Расш1_ВыполнитьЗакрытиеСменыНаСервереПосле(ПараметрыЗакрытия)
// Проверяем, что смена действительно закрыта успешно
Если ПараметрыЗакрытия.СменаЗакрыта Тогда
// Вызываем нашу процедуру обмена
ЗапуститьСинхронизациюВФоне();
КонецЕсли;
КонецПроцедуры
Важный нюанс: если выполнять обмен непосредственно в основном потоке, интерфейс кассира "замрет" на время передачи данных. Если интернет медленный или база большая, это может занять несколько минут. Кассир может подумать, что программа "зависла", и принудительно завершить работу процесса через диспетчер задач, что приведет к ошибкам в базе.
Разберем, как запустить процесс в фоне. Это позволит 1С завершить работу формы закрытия смены, а сам процесс обмена будет дорабатывать "невидимо" для пользователя.
Процедура ЗапуститьСинхронизациюВФоне()
НаименованиеЗадания = "Автоматический обмен после закрытия смены";
ПараметрыЗадания = Новый Массив;
// Передаем параметры, если необходимо
// Запуск фонового задания
ФоновыеЗадания.Выполнить("ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзла", ПараметрыЗадания, , НаименованиеЗадания);
КонецПроцедуры
Внимание: При использовании фонового задания важно помнить, что если пользователь выключит компьютер через меню "Пуск" сразу после закрытия 1С, фоновое задание не успеет доработать. Поэтому в дополнение к коду рекомендуется провести инструктаж персонала о необходимости дождаться автоматического выключения компьютера (если настроены соответствующие скрипты).
Если программная доработка по каким-то причинам невозможна, проанализируем ситуацию с точки зрения системного администрирования. Можно использовать связку 1С + BAT-файл.
Создадим на рабочем столе ярлык "Завершить работу", который запускает пакетный файл следующего содержания:
/Execute, указывающим на внешнюю обработку, которая только делает обмен и закрывается.shutdown /s /t 0 для выключения компьютера.Этот метод гарантирует, что компьютер не выключится до тех пор, пока 1С не закончит выполнение обработки обмена.
Мы выяснили, что наиболее надежным и современным способом автоматизации синхронизации в 1С:Розница 2.2 является использование расширения конфигурации с перехватом процедуры закрытия смены и последующим запуском фонового задания обмена. Это решение минимизирует влияние человеческого фактора и обеспечивает актуальность данных в центральном офисе.
Основные моменты, которые мы разобрали:
ПланыОбмена и методам ОбменДаннымиСервер.ФоновыеЗадания для комфортной работы пользователя.Внедрение данного функционала позволит значительно снизить нагрузку на администраторов системы и обеспечит оперативное получение управленческой информации.