Каждый администратор или разработчик 1С, работающий с розничной торговлей, рано или поздно сталкивается с неприятной ситуацией: кассир открывает смену, запускает Рабочее место кассира (РМК), но привычный интерфейс выглядит иначе. Программа перестает контролировать отрицательные остатки, "отваливается" подключенное торговое оборудование (фискальный регистратор, терминал эквайринга, сканер штрихкодов), а основные настройки РМК просто сбросились до значений по умолчанию — от такой потери данных защитит паспорт настроек для контроля изменений системы.
В этой статье мы подробно разберем, почему возникает эта проблема с точки зрения платформы 1С и Библиотеки стандартных подсистем (БСП), выясним истинные причины "слета" настроек и рассмотрим несколько эффективных способов решения проблемы — от простых административных скриптов до полноценного расширения конфигурации.
Для того чтобы понять, как бороться с этой проблемой, проанализируем внутренний механизм работы 1С с рабочими местами. В конфигурациях на базе БСП (к которым относится и 1С:Розница 2.3) каждое физическое рабочее место жестко привязано к конкретному элементу справочника РабочиеМеста — для этой задачи есть централизованное администрирование рабочих мест и касс. Эта привязка осуществляется посредством Уникального идентификатора клиента (GUID).
Этот идентификатор генерируется платформой 1С при первом запуске программы на конкретном компьютере под конкретным пользователем операционной системы. Платформа записывает этот GUID в специальный локальный файл настроек пользователя Windows. Обычно это файл с именем 1cv8u.pfl (в некоторых случаях — 1cv8.pfl), который располагается по следующему пути:
C:\Users\<Имя_Пользователя_ОС>\AppData\Local\1C\1cv8\
При каждом последующем запуске система обращается к этому файлу, считывает сохраненный GUID, сопоставляет его со справочником РабочиеМеста и понимает, какое именно оборудование и какие настройки РМК нужно применить для данного сеанса. Если этот файл по какой-то причине повреждается, удаляется или перезаписывается, платформа генерирует новый GUID. С точки зрения 1С, база запущена на абсолютно новом, неизвестном ранее компьютере. Программа автоматически создает новый элемент в справочнике РабочиеМеста, который, разумеется, оказывается "пустым" — без привязанного оборудования, касс ККМ и настроек РМК.
Давайте выясним основные причины, из-за которых файл настроек 1cv8u.pfl может перезаписываться или теряться:
Local\1C\1cv8\ и Roaming\1C\1cv8\ для устранения мелких сбоев, они зачастую очищают и служебные файлы профиля, включая файл с GUID рабочего места. К аналогичным последствиям приводит использование утилит автоматической очистки диска (например, CCleaner).AppData. Соответственно, у каждого кассира будет свой уникальный файл настроек со своим GUID, что приводит к созданию множества дублирующих рабочих мест в 1С. Ситуация усугубляется, если в домене используются "временные" или "перемещаемые" профили Windows, которые сбрасываются или очищаются при каждом выходе пользователя из системы.1cv8u.pfl запишется некорректно (заполнится "мусором"). При следующем запуске платформа сочтет файл поврежденным и просто перезапишет его дефолтным значением с новым GUID.Теперь, когда мы детально разобрали физику процесса, давайте перейдем к методам решения этой проблемы. Мы рассмотрим три различных подхода: от оперативного ручного восстановления до полной автоматизации на уровне программного кода.
Если сбой уже произошел, настройки "слетели", а кассиру нужно срочно работать, можно быстро вернуть старый идентификатор рабочему месту. Для этого выполним следующие действия:
РабочиеМеста в режиме 1С:Предприятие (через администрирование или функции для технического специалиста). Нам нужно найти то "старое" рабочее место, к которому было привязано всё оборудование и настройки РМК.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.C:\Users\<Имя_Пользователя_ОС>\AppData\Local\1C\1cv8\.1cv8u.pfl и откроем его с помощью любого текстового редактора (например, Блокнота).Этот способ хорош как экстренная мера, но он не решает проблему системно. При следующей очистке кэша процедуру придется повторять.
Если мы не хотим вносить изменения в конфигурацию 1С или писать расширения, мы можем автоматизировать запуск программы с помощью простого скрипта командной строки Windows. Идея заключается в том, чтобы хранить "эталонную" версию файла настроек в надежном месте и принудительно копировать её перед каждым запуском 1С.
Рассмотрим этот алгоритм по шагам:
1cv8u.pfl из папки AppData в безопасное место на диске, где он точно не сотрется (например, создадим папку C:\1C_Backup\).run_1c.bat.
@echo off
:: Указываем пути к источнику и назначению
set "source_dir=C:\1C_Backup"
set "dest_dir=%LocalAppData%\1C\1cv8"
:: Создаем целевую директорию, если она вдруг была удалена при очистке кэша
if not exist "%dest_dir%" mkdir "%dest_dir%"
:: Копируем эталонный файл настроек с перезаписью существующего
copy /y "%source_dir%\1cv8u.pfl" "%dest_dir%\1cv8u.pfl"
:: Запускаем 1С:Предприятие
start "" "C:\Program Files\1cv8\common\1cestart.exe"
Теперь заменим ярлык запуска 1С на рабочем столе кассира на созданный нами файл run_1c.bat (можно изменить ему иконку на стандартную иконку 1С). При каждом клике по этому ярлыку скрипт сначала вернет правильный файл настроек с нужным GUID на место, а затем откроет окно запуска 1С. Даже если ночью кэш компьютера был полностью очищен, рабочее место кассира запустится в штатном режиме.
Наиболее надежный, профессиональный и современный подход — отказаться от привязки рабочего места к нестабильному файлу настроек на диске пользователя и реализовать определение рабочего места по сетевому имени компьютера. Компьютер в магазине имеет постоянное имя в локальной сети, которое не меняется при очистке кэша, переустановке платформы 1С или смене пользователя Windows.
Для реализации этого метода напишем небольшое расширение конфигурации. Наша задача — перехватить функцию определения текущего рабочего места клиента в общем модуле МенеджерОборудованияКлиентПереопределяемый (или аналогичном модуле получения рабочего места в используемой версии БСП).
Рассмотрим пример реализации кода в расширении. Мы будем переопределять функцию ПолучитьРабочееМестоКлиента. Напишем следующий код:
&Вместо("ПолучитьРабочееМестоКлиента")
Функция Икс_ПолучитьРабочееМестоКлиента(ИдентификаторКлиента)
// Получаем сетевое имя текущего компьютера в верхнем регистре
ИмяКомпьютераСети = ВРег(ИмяКомпьютера());
// Выполняем запрос к справочнику РабочиеМеста для поиска по имени компьютера
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РабочиеМеста.Ссылка КАК Ссылка
|ИЗ
| Справочник.РабочиеМеста КАК РабочиеМеста
|ГДЕ
| ВЫРАЗИТЬ(РабочиеМеста.ИмяКомпьютера КАК СТРОКА(100)) ПОДОБНО &ИмяКомпьютера
| И НЕ РабочиеМеста.ПометкаУдаления";
Запрос.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютераСети);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Возвращаем найденное рабочее место, соответствующее имени ПК
Возврат Выборка.Ссылка;
КонецЕсли;
// Если в справочнике нет рабочего места с таким именем компьютера,
// возвращаем стандартное поведение платформы
Возврат ПродолжитьВызов(ИдентификаторКлиента);
КонецФункции
При использовании этого расширения логика работы системы меняется кардинально. Нам достаточно один раз прописать сетевое имя компьютера в карточке рабочего места в справочнике РабочиеМеста. После этого, даже если папка AppData будет стерта дочиста, программа при старте определит имя компьютера, найдет его в базе данных и мгновенно вернет кассиру его настроенное рабочее место.
Идея автора исходного обсуждения о блокировке запуска программы, если к рабочему месту не привязаны основные настройки РМК, очень полезна для предотвращения ошибок учета — для этого подойдёт блокировка работы пользователя при критических условиях. Если настройки слетают, программа перестает контролировать отрицательные остатки, что позволяет кассирам продавать товар "в минус", создавая хаос в складском учете — задача решается через контроль ключевых ошибок учета и остатков.
Реализуем проверку в модуле управляемого приложения (или через расширение в процедуре ПередНачаломРаботыСистемы). Нам нужно проверить, определено ли рабочее место и привязана ли к нему основная настройка РМК. Напишем программный код:
Процедура ПередНачаломРаботыСистемы(Отказ)
// Получаем текущее рабочее место клиента
ТекущееРабочееМесто = МенеджерОборудованияКлиент.ПолучитьРабочееМестоКлиента();
Если Не ЗначениеЗаполнено(ТекущееРабочееМесто) Тогда
Предупреждение("Внимание! Не удалось определить рабочее место для данного компьютера.
|Запуск программы заблокирован. Обратитесь к системному администратору.");
Отказ = Истина;
Возврат;
КонецЕсли;
// Проверяем, заполнена ли основная настройка РМК для этого рабочего места.
// В Рознице 2.3 настройки РМК обычно хранятся в соответствующем регистре сведений или справочнике.
// Напишем функцию проверки наличия настроек (запрос к регистру настроек РМК).
НастройкаРМКЗаполнена = ПроверитьНаличиеНастроекРМК(ТекущееРабочееМесто);
Если Не НастройкаРМКЗаполнена Тогда
Предупреждение("Ошибка! Для текущего рабочего места (" + СокрЛП(ТекущееРабочееМесто) + ")
|не заданы основные настройки РМК (контроль остатков, кассы ККМ).
|Работа в режиме кассира невозможна.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Функция ПроверитьНаличиеНастроекРМК(РабочееМесто) Экспорт
// Здесь должна быть логика запроса к вашей конфигурации.
// Например, для Розницы 2.3 проверяем заполнение регистра сведений "НастройкиРМК"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НастройкиРМК.РабочееМесто КАК РабочееМесто
|ИЗ
| РегистрСведений.НастройкиРМК КАК НастройкиРМК
|ГДЕ
| НастройкиРМК.РабочееМесто = &РабочееМесто";
Запрос.УстановитьПараметр("РабочееМесто", РабочееМесто);
Возврат Не Запрос.Выполнить().Пустой();
КонецФункции
Благодаря интеграции этого кода программа просто не позволит кассиру открыть смену и начать торговлю в режиме "сбитых" настроек. Это убережет базу данных от пересортицы, некорректных остатков и избавит бухгалтера от необходимости исправлять ошибки задним числом.
Резюмируем: Проблема слетающих настроек РМК обусловлена архитектурной привязкой рабочего места к GUID в локальном файле Windows. Использование расширения для сопоставления рабочих мест по сетевому имени компьютера (Способ 3) в сочетании с проверкой заполнения настроек при старте (Способ 4) является наиболее надежным и рекомендуемым решением, которое раз и навсегда закроет этот вопрос на вашем предприятии.