В практической работе с торговым оборудованием в среде «1С:Предприятие» системные администраторы и пользователи часто сталкиваются с крайне неприятной ситуацией. После каждой перезагрузки персонального компьютера или терминального сервера программа «забывает» подключенное оборудование. При этом торговая точка не может пробить чек, так как контрольно-кассовая техника (ККТ) оказывается непривязанной. Заглянув в справочник «Рабочие места», мы обнаруживаем там десятки, а иногда и сотни созданных дублей рабочих мест с одинаковыми наименованиями, из которых ни одно не помечено как текущее.
В рамках этой статьи мы подробно разберем техническую суть данного сбоя, выясним, почему платформа ведет себя подобным образом, проанализируем основные причины возникновения неполадки в операционной системе Windows и рассмотрим три практических способа решения проблемы раз и навсегда.
Для того чтобы понять природу этой ошибки, углубимся в архитектуру взаимодействия платформы 1С с подключаемым оборудованием. При использовании Библиотеки стандартных подсистем (БСП) или Библиотеки подключаемого оборудования (БПО) программа должна точно знать, к какому именно физическому компьютеру привязана конкретная касса, сканер штрихкодов или эквайринговый терминал.
Для уникальной идентификации физического устройства платформа использует специальный Уникальный идентификатор клиента (GUID). Этот идентификатор генерируется платформой автоматически при первом запуске базы данных на конкретном компьютере под конкретным пользователем операционной системы. Сгенерированный GUID сохраняется локально на жестком диске в специальном файле конфигурации с расширением .pfl.
В зависимости от версии платформы, разрядности и режима работы (тонкий или толстый клиент) этот файл может иметь следующие имена:
1cv8u.pfl — наиболее распространенный вариант для управляемого приложения (юникод-версия).1cv8c.pfl — файл настроек тонкого клиента.1cv8.pfl — файл настроек в старых версиях платформы или в толстом клиенте.Стандартный путь размещения этого конфигурационного файла в операционной системе Windows выглядит следующим образом:
%LocalAppData%\1C\1cv8\ (что эквивалентно полному пути C:\Users\ИмяПользователя\AppData\Local\1C\1cv8\).
Каждый раз при запуске программы 1С обращается к этому каталогу, считывает GUID из файла настроек и ищет в справочнике «Рабочие места» элемент, у которого в реквизите «Идентификатор устройства» прописано точно такое же значение. Если файл конфигурации удален, поврежден или очищен, платформа считает, что запуск происходит на абсолютно новом, ранее не известном компьютере. В этот момент происходят следующие действия:
1cv8u.pfl.Рассмотрим подробнее причины, по которым этот механизм дает сбой, и способы их устранения.
Выделим основные негативные факторы в операционной системе и сетевой инфраструктуре, которые приводят к регулярному удалению или перезаписи файла 1cv8u.pfl:
C:\Users\TEMP). При перезагрузке компьютера или выходе из системы этот профиль со всеми настройками, включая папку AppData и файлы .pfl, безвозвратно удаляется.AppData\Local как мусор и удаляют их..pfl.%LocalAppData%\1C\1cv8\, платформа 1С не сможет корректно завершить запись файла при выходе из программы. В результате файл повреждается (записывается нулевой размер) или вообще не создается.Рассмотрим подробно по шагам три различных варианта решения этой проблемы — от простого ручного восстановления до автоматизации и программного изменения алгоритмов 1С.
Если у вас уже настроена касса на конкретном рабочем месте, но после перезагрузки создался дубль, вам не нужно заново выполнять сложную интеграцию с драйверами торгового оборудования. Мы можем вручную прописать старый, корректный GUID в файл настроек платформы. Выполним следующие действия:
d3b07384-d113-11e7-80c5-00155d030507).%LocalAppData%\1C\1cv8\.1cv8u.pfl (или создадим его, если его там нет), кликнем по нему правой кнопкой мыши и выберем пункт «Открыть с помощью» -> «Блокнот».
{
{"SystemID",
{"u","d3b07384-d113-11e7-80c5-00155d030507"}
}
}
Если на компьютере регулярно происходят сбои профиля или очистка временных папок, ручная правка файлов быстро надоест. Мы можем автоматизировать этот процесс с помощью простого командного файла Windows (BAT-скрипта), который будет восстанавливать верный идентификатор непосредственно перед каждым запуском 1С.
Проанализируем алгоритм настройки автоматизации:
%LocalAppData%\1C\1cv8\ и скопируем работающий эталонный файл 1cv8u.pfl в безопасное место на диске, где не происходит автоматическая очистка (например, в созданную папку C:\1C_Etalon\).Start1C.bat (убедитесь, что расширение изменилось с .txt на .bat).
@echo off
chcp 1251 > nul
:: Задаем пути к эталонному файлу и целевой папке профиля пользователя
set "EtalonFile=C:\1C_Etalon\1cv8u.pfl"
set "TargetFolder=%LocalAppData%\1C\1cv8"
:: Проверяем, существует ли целевая директория в AppData, и если нет - создаем ее
if not exist "%TargetFolder%" (
mkdir "%TargetFolder%"
)
:: Копируем эталонный файл настроек с принудительной заменой существующего
copy /Y "%EtalonFile%" "%TargetFolder%\1cv8u.pfl"
:: Запускаем платформу 1С (укажите ваш путь к стартеру 1cestart.exe)
start "" "C:\Program Files\1cv8\common\1cestart.exe"
exit
Если у вас есть доступ к изменению конфигурации (напрямую или через механизм расширений), мы можем радикально решить проблему на уровне исходного кода 1С. Вместо ненадежной привязки к текстовому файлу в локальном кэше пользователя, мы можем переопределить алгоритм получения идентификатора компьютера.
В Библиотеке подключаемого оборудования за генерацию и получение GUID отвечает функция ПолучитьИдентификаторКлиента() общего модуля МенеджерОборудованияКлиент. Мы можем использовать механизм расширения конфигурации с аннотацией &Вместо, чтобы возвращать стабильный идентификатор, привязанный к неизменяемым параметрам компьютера — например, к сетевому имени ПК.
Рассмотрим пример программной реализации такого решения:
&Вместо("ПолучитьИдентификаторКлиента")
Функция Расш_ПолучитьИдентификаторКлиента()
// Получаем сетевое имя текущего компьютера
ИмяКомпьютераСети = ВРег(ИмяКомпьютера());
// Пытаемся найти в справочнике "Рабочие места" элемент с соответствующим наименованием
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| РабочиеМеста.Ссылка КАК Ссылка,
| РабочиеМеста.ИдентификаторПО КАК ИдентификаторПО
|ИЗ
| Справочник.РабочиеМеста КАК РабочиеМеста
|ГДЕ
| РабочиеМеста.Наименование ПОДОБНО &ИмяКомпьютера";
Запрос.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютераСети + "%");
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Возвращаем GUID уже существующего в базе рабочего места по имени компьютера
Возврат Выборка.ИдентификаторПО;
Иначе
// Если рабочее место еще не создано, вызываем стандартный механизм генерации
Возврат ПродолжитьВызов();
КонецЕсли;
КонецФункции
Применение этого программного метода гарантирует, что рабочее место в 1С будет жестко связано с сетевым именем компьютера. Поскольку имя компьютера не меняется при перезагрузках операционной системы, дублирование рабочих мест полностью прекратится, а торговое оборудование всегда будет оставаться в активном и работоспособном состоянии.