Почему изменяется количество товара в 1С:УТ 11.4 и как исправить ошибки целостности базы данных?

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

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

Часть 1. Разбор причин «плавающего» количества товара в РМК

Сценарий проблемы выглядит следующим образом: на начало дня остаток товара в магазине составляет 2 штуки, оформляется приход еще на 2 штуки, однако кассир при подборе видит доступный остаток в количестве 5 штук. Выясним, почему файловый режим работы, сетевые терминалы и особенности проведения документов в последних версиях УТ 11 приводят к такому результату.

Причина 1: Механизм транзакционных блокировок в файловой базе данных

В файловом варианте работы платформы 1С (база данных в формате 1Cv8.1CD) при выполнении транзакции записи или проведения документа блокировка накладывается не на отдельные строки таблиц, а на таблицы базы данных целиком. Когда в магазине одновременно работают три кассира в терминальном режиме и пытаются пробить чеки на одной ККТ (или через виртуальный фискальный регистратор), возникает следующая цепочка событий:

  1. Первая касса начинает транзакцию проведения чека ККМ, монопольно блокируя регистры накопления, отвечающие за остатки товаров и продажи.
  2. Вторая и третья кассы отправляют свои транзакции в очередь ожидания.
  3. Если время ожидания блокировки превышает стандартный лимит (по умолчанию около 20–40 секунд), транзакции на других кассах аварийно отменяются платформой.
  4. При этом физический фискальный регистратор может успеть напечатать бумажный чек, так как команда на печать ушла на COM-порт драйвера ККТ до отката транзакции СУБД. В результате в 1С документ зависает, не списывая остатки по регистрам накопления, хотя кассиры уверены, что продажа прошла успешно. Это вызывает хаос в учете и рассинхронизацию физического наличия с учетным.

Причина 2: Архитектура хранения остатков («Распределение запасов»)

В современных редакциях 1С:Управление торговлей данные для отчетов (например, «Ведомость по товарам на складах») и данные для подбора товаров в РМК берутся из разных регистров:

В условиях постоянных взаимных блокировок файловой СУБД фоновое задание по обновлению регистра РаспределениеЗапасов не может своевременно записать данные или завершается с ошибкой. Из-за этого регистры рассинхронизируются: отчет по складу показывает корректный остаток (например, 3 шт.), а в РМК кассир видит устаревшие или поврежденные данные (5 шт.).

Часть 2. Пошаговое устранение проблем с остатками

Для исправления рассинхронизации остатков и предотвращения сбоев транзакций выполним следующие действия:

Шаг 1. Восстановление распределения запасов

В конфигурации УТ 11 встроен штатный инструмент для исправления ошибок в регистре распределения. Выполним его запуск:

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

Шаг 2. Разделение кассового оборудования

Использование одного виртуального или физического фискального регистратора на три терминальные кассы в рамках файловой базы — грубая архитектурная ошибка. Драйвер ККТ монопольно захватывает сетевой порт или виртуальный COM-порт во время печати чека. Это приводит к зависаниям сеансов 1С и некорректным откатам транзакций. Настоятельно рекомендуем:

Часть 3. Исправление ошибок логической целостности базы данных

При тестировании и исправлении поврежденной базы данных часто выводится протокол со следующими ошибками:

Проанализируем причину. Эти ошибки возникают из-за некорректного использования внешних обработок загрузки данных (например, популярной обработки ЗагрузкаДанныхИзТабличногоДокумента_УФ_v2.epf). При импорте товаров из файлов Excel пользователи загружают справочник напрямую, минуя стандартные бизнес-логики и проверки платформы. Справочник НоменклатураПоставщиков является подчиненным справочнику Партнеры. Если при загрузке поле Владелец не было заполнено или было заполнено битой ссылкой, в базе появляются «сиротские» записи без владельца. Отключение функционала использования номенклатуры поставщиков в настройках программы не решает проблему — поврежденные записи физически остаются в таблицах СУБД.

Проанализируем, как локализовать и исправить эти ошибки с помощью консоли запросов и программного кода.

Шаг 1. Поиск поврежденных записей без владельца

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


ВЫБРАТЬ
    НоменклатураПоставщиков.Ссылка КАК Ссылка,
    НоменклатураПоставщиков.Код КАК Код,
    НоменклатураПоставщиков.Наименование КАК Наименование,
    НоменклатураПоставщиков.Владелец КАК Владелец
ИЗ
    Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
ГДЕ
    (НоменклатураПоставщиков.Владелец = ЗНАЧЕНИЕ(Справочник.Партнеры.PutayaСсылка)
        ИЛИ НоменклатураПоставщиков.Владелец.Ссылка ЕСТЬ NULL)

Данный запрос вернет список всех элементов, которые были загружены некорректно и вызывают сбои при проверке логической целостности.

Шаг 2. Программное удаление «битых» элементов

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


Выборка = Справочники.НоменклатураПоставщиков.Выбрать();
ЗаписейУдалено = 0;

Пока Выборка.Следующий() Цикл
    // Проверяем заполненность реквизита "Владелец"
    Если Не ЗначениеЗаполнено(Выборка.Владелец) Или Выборка.Владелец.ПолучитьОбъект() = Неопределено Тогда
        Попытка
            ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
            // Выполняем непосредственное удаление из базы данных
            ОбъектНоменклатуры.Удалить();
            ЗаписейУдалено = ЗаписейУдалено + 1;
        Исключение
            Сообщить("Не удалось удалить элемент: " + Выборка.Наименование + " Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Сообщить("Успешно удалено поврежденных записей: " + ЗаписейУдалено);

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

Шаг 3. Устранение неуникальности кодов

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

  1. Откроем базу 1С в режиме Конфигуратор (предварительно сделав резервную копию!).
  2. Перейдем в меню Администрирование — Тестирование и исправление...
  3. Установим флаг напротив пункта «Проверка логической целостности».
  4. В нижней части окна в группе настроек «При нарушении уникальности кодов и номеров» выберем переключатель в положение «Создавать новые коды / Перенумеровать».
  5. Нажмем кнопку «Выполнить» и дождемся завершения процесса. Система автоматически присвоит уникальные коды всем элементам справочника, исправив ошибки коллизий.

Часть 4. Переход на клиент-серверный вариант работы

Если после выполнения всех регламентных процедур в файловой базе при пиковых нагрузках на кассах продолжают возникать ошибки блокировок и «плавать» остатки, единственным надежным и системным решением является переход на клиент-серверный вариант работы (SQL).

Для малых предприятий с небольшим количеством рабочих мест покупка полноценной лицензии на сервер 1С:Предприятие экономически нецелесообразна. Однако у фирмы 1С существует специальное предложение — «1С:Предприятие 8.3. Сервер МИНИ на 5 пользователей». Данная лицензия стоит значительно дешевле стандартного сервера и позволяет запустить полноценный клиент-серверный вариант работы на СУБД PostgreSQL (которая является бесплатной и поставляется с открытым исходным кодом).

Переход на СУБД PostgreSQL с использованием Сервера МИНИ гарантирует:

← На главную