Почему слетают настройки РМК в 1С:Розница 2.3 и как это исправить раз и навсегда?

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

Каждый администратор или разработчик 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 может перезаписываться или теряться:

  1. Очистка кэша 1С. Это самая распространенная причина. Когда техническая поддержка или системный администратор вручную удаляют папки из каталогов Local\1C\1cv8\ и Roaming\1C\1cv8\ для устранения мелких сбоев, они зачастую очищают и служебные файлы профиля, включая файл с GUID рабочего места. К аналогичным последствиям приводит использование утилит автоматической очистки диска (например, CCleaner).
  2. Обновление платформы 1С. При переходе на новую версию платформы пути к каталогам кэша могут измениться, либо платформа может создать новую структуру папок, проигнорировав старые конфигурационные файлы.
  3. Работа в терминальном режиме (RDP) и особенности Active Directory. Если на одном терминальном сервере кассиры заходят под разными учетными записями Windows, для каждого пользователя операционной системы создается своя ветка папки AppData. Соответственно, у каждого кассира будет свой уникальный файл настроек со своим GUID, что приводит к созданию множества дублирующих рабочих мест в 1С. Ситуация усугубляется, если в домене используются "временные" или "перемещаемые" профили Windows, которые сбрасываются или очищаются при каждом выходе пользователя из системы.
  4. Некорректное завершение работы ПК. Внезапное отключение электроэнергии, сбои операционной системы ("синий экран") или агрессивное поведение антивирусного ПО в момент закрытия 1С могут привести к тому, что файл 1cv8u.pfl запишется некорректно (заполнится "мусором"). При следующем запуске платформа сочтет файл поврежденным и просто перезапишет его дефолтным значением с новым GUID.

Теперь, когда мы детально разобрали физику процесса, давайте перейдем к методам решения этой проблемы. Мы рассмотрим три различных подхода: от оперативного ручного восстановления до полной автоматизации на уровне программного кода.


Способ 1. Ручное восстановление идентификатора (Быстрое решение)

Если сбой уже произошел, настройки "слетели", а кассиру нужно срочно работать, можно быстро вернуть старый идентификатор рабочему месту. Для этого выполним следующие действия:

  1. Откроем справочник РабочиеМеста в режиме 1С:Предприятие (через администрирование или функции для технического специалиста). Нам нужно найти то "старое" рабочее место, к которому было привязано всё оборудование и настройки РМК.
  2. Откроем карточку этого рабочего места. Нам необходимо скопировать его уникальный идентификатор (GUID). В некоторых конфигурациях он выведен на форму, в других его можно получить через просмотр реквизитов или специальную обработку. Идентификатор имеет вид строки: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
  3. Перейдем в папку на компьютере кассира: C:\Users\<Имя_Пользователя_ОС>\AppData\Local\1C\1cv8\.
  4. Найдем файл 1cv8u.pfl и откроем его с помощью любого текстового редактора (например, Блокнота).
  5. Найдем в файле строку, содержащую текущий (новый) идентификатор рабочего места, и заменим его на скопированный нами ранее "старый" GUID.
  6. Сохраним файл и запустим 1С. Рабочее место восстановится вместе со всеми настройками и торговым оборудованием — для этого подойдёт управление подключением касс ККМ в РМК.

Этот способ хорош как экстренная мера, но он не решает проблему системно. При следующей очистке кэша процедуру придется повторять.


Способ 2. Автоматическое восстановление файла настроек через BAT-скрипт

Если мы не хотим вносить изменения в конфигурацию 1С или писать расширения, мы можем автоматизировать запуск программы с помощью простого скрипта командной строки Windows. Идея заключается в том, чтобы хранить "эталонную" версию файла настроек в надежном месте и принудительно копировать её перед каждым запуском 1С.

Рассмотрим этот алгоритм по шагам:

  1. Один раз настроим рабочее место кассира в 1С.
  2. Скопируем настроенный файл 1cv8u.pfl из папки AppData в безопасное место на диске, где он точно не сотрется (например, создадим папку C:\1C_Backup\).
  3. Создадим текстовый файл и переименуем его в run_1c.bat.
  4. Пропишем в этом файле следующий сценарий автоматического копирования и последующего запуска платформы 1С:

@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С. Даже если ночью кэш компьютера был полностью очищен, рабочее место кассира запустится в штатном режиме.


Способ 3. Создание расширения с привязкой к имени компьютера (Рекомендуемый способ)

Наиболее надежный, профессиональный и современный подход — отказаться от привязки рабочего места к нестабильному файлу настроек на диске пользователя и реализовать определение рабочего места по сетевому имени компьютера. Компьютер в магазине имеет постоянное имя в локальной сети, которое не меняется при очистке кэша, переустановке платформы 1С или смене пользователя Windows.

Для реализации этого метода напишем небольшое расширение конфигурации. Наша задача — перехватить функцию определения текущего рабочего места клиента в общем модуле МенеджерОборудованияКлиентПереопределяемый (или аналогичном модуле получения рабочего места в используемой версии БСП).

Рассмотрим пример реализации кода в расширении. Мы будем переопределять функцию ПолучитьРабочееМестоКлиента. Напишем следующий код:


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

При использовании этого расширения логика работы системы меняется кардинально. Нам достаточно один раз прописать сетевое имя компьютера в карточке рабочего места в справочнике РабочиеМеста. После этого, даже если папка AppData будет стерта дочиста, программа при старте определит имя компьютера, найдет его в базе данных и мгновенно вернет кассиру его настроенное рабочее место.


Способ 4. Контроль заполнения настроек РМК при запуске (Защита от ошибок)

Идея автора исходного обсуждения о блокировке запуска программы, если к рабочему месту не привязаны основные настройки РМК, очень полезна для предотвращения ошибок учета — для этого подойдёт блокировка работы пользователя при критических условиях. Если настройки слетают, программа перестает контролировать отрицательные остатки, что позволяет кассирам продавать товар "в минус", создавая хаос в складском учете — задача решается через контроль ключевых ошибок учета и остатков.

Реализуем проверку в модуле управляемого приложения (или через расширение в процедуре ПередНачаломРаботыСистемы). Нам нужно проверить, определено ли рабочее место и привязана ли к нему основная настройка РМК. Напишем программный код:


Процедура ПередНачаломРаботыСистемы(Отказ)
    
    // Получаем текущее рабочее место клиента
    ТекущееРабочееМесто = МенеджерОборудованияКлиент.ПолучитьРабочееМестоКлиента();
    
    Если Не ЗначениеЗаполнено(ТекущееРабочееМесто) Тогда
        Предупреждение("Внимание! Не удалось определить рабочее место для данного компьютера. 
                       |Запуск программы заблокирован. Обратитесь к системному администратору.");
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    // Проверяем, заполнена ли основная настройка РМК для этого рабочего места.
    // В Рознице 2.3 настройки РМК обычно хранятся в соответствующем регистре сведений или справочнике.
    // Напишем функцию проверки наличия настроек (запрос к регистру настроек РМК).
    НастройкаРМКЗаполнена = ПроверитьНаличиеНастроекРМК(ТекущееРабочееМесто);
    
    Если Не НастройкаРМКЗаполнена Тогда
        Предупреждение("Ошибка! Для текущего рабочего места (" + СокрЛП(ТекущееРабочееМесто) + ") 
                       |не заданы основные настройки РМК (контроль остатков, кассы ККМ). 
                       |Работа в режиме кассира невозможна.");
        Отказ = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Благодаря интеграции этого кода программа просто не позволит кассиру открыть смену и начать торговлю в режиме "сбитых" настроек. Это убережет базу данных от пересортицы, некорректных остатков и избавит бухгалтера от необходимости исправлять ошибки задним числом.

Резюмируем: Проблема слетающих настроек РМК обусловлена архитектурной привязкой рабочего места к GUID в локальном файле Windows. Использование расширения для сопоставления рабочих мест по сетевому имени компьютера (Способ 3) в сочетании с проверкой заполнения настроек при старте (Способ 4) является наиболее надежным и рекомендуемым решением, которое раз и навсегда закроет этот вопрос на вашем предприятии.

← На главную