ВведениеLink to Введение

В статье описана ситуация поломки базы, когда в ней появляется блюдо с нулевым кодом.

Пример подобного поведения в кубическом отчете:

Возможные причины:

  1. Потеря связи и рассинхронизация между сервером справочников/отчетов и базой данных SQL
  2. Откат базы сервера справочников/отчетов на состояние, когда проданных блюд еще не было в меню менеджерской станции

Поиск причины ошибкиLink to Поиск причины ошибки

Первым делом необходимо выяснить причину ошибки. 

  1. Откройте SQL Server Management Studio и выполните запрос вашей базе данных:

    select distinct sifr from SESSIONDISHES where SIFR not in(select sifr from MENUITEMS)
    SQL
  2. Запрос показывает проданные блюда, которых нет в меню. В моем случае нашлось одно блюдо.
  3. Далее поиском в менеджерской станции проверьте, есть ли блюда с такими идентификаторами

 Если блюда есть, значит у нас случай №1. Решить проблему можно выгрузив справочники в базу данных SQL. Об этом читайте ниже.

Также, чтобы понять потеряны записи в SessionDishes или в MENUITEMS можно выполнить следующий запрос:

SELECT
PayBindings.visit as pb_visit,
SessionDishes00.visit as sd0_visit,
SessionDishes00.sifr as sd0_sifr,
MENUITEMS00."SIFR" as MENUITEMS00_SIFR,
SessionDishes01.visit as sd1_visit,
SessionDishes01.sifr as sd1_sifr,
MENUITEMS01."SIFR" as MENUITEMS01_SIFR,
  EMPLOYEES00."NAME" AS "WAITER",
  MENUITEMS00."CODE" AS "CODE",
  MENUITEMS00."NAME" AS "DISH",
  PayBindings."QUANTITY" AS "QUANTITY",
  PayBindings."PAYSUM" AS "PAYSUM",
  PayBindings."PRICESUM" AS "PRLISTSUM",
  CLASSIFICATORGROUPS0000.NAME AS "CATEGORY",
  DishDiscounts00."EXCLUDEFROMEARNINGS" AS "EXCLUDEFROMEARNINGS",
  UNCHANGEABLEORDERTYPES00."NAME" AS "ORDERCATEGORY",
  PrintChecks00."CHECKNUM" AS "CHECKNUM",
  GLOBALSHIFTS00."SHIFTNUM" AS "SHIFTNUM",
  OrderSessions00."PRINTAT" AS "PRINTAT___13",
  GLOBALSHIFTS00."SHIFTDATE" AS "SHIFTDATE",
  dbo.propCategPath(MENUITEMS00.SIFR) AS "CATEGPATH",
  CASHES00."NAME" AS "CLOSESTATION",
  CASHGROUPS00."NETNAME" AS "NETNAME",
  CURRENCYTYPES00."NAME" AS "CURRENCYTYPE",
  CURRENCIES00."NAME" AS "CURRENCY",
  CURRENCIES00."CODE" AS "CURRENCYCODE",
  CLASSIFICATORGROUPS0000.SORTORDER AS "SORTORDER",
  Shifts00."PRINTSHIFTNUM" AS "CASHSHIFTNUM",
  TABLES00."NAME" AS "TABLE",
  Orders00."ORDERNAME" AS "ORDERNAME",
  PaymentsExtra00."CARDNUM" AS "CARDNUM",
  (0) AS "OBJKIND",
  PayBindings."TAXESADDED" AS "TAXESADDED",
  RESTAURANTS00."NAME" AS "RESTAURANTNAME",
  EMPLOYEES01."NAME" AS "DISHCREATOR",
  CurrLines00."DBKURS" AS "DBKURS",
  MENUITEMS02."NAME" AS "COMBODISH",
  PrintChecks00."CLOSEDATETIME" AS "CLOSEDATETIME___37",
  trk7EnumsValues3600.UserMName AS "STATUS",
  CATEGLIST00."NAME" AS "NAME1",
  CATEGLIST00."CODE" AS "CODE1",
  CLASSIFICATORGROUPS0001.NAME AS "F00000040",
  CURRENCIES01."NAME" AS "ORIGCURRENCY",
  GLOBALSHIFTS00."IRESTAURANT" AS "RESTAURANTID"
FROM "PayBindings"
JOIN "CURRLINES" CurrLines00
  ON (CurrLines00."VISIT" = PayBindings."VISIT") AND (CurrLines00."MIDSERVER" = PayBindings."MIDSERVER") AND (CurrLines00."UNI" = PayBindings."CURRUNI")
JOIN "PRINTCHECKS" PrintChecks00
  ON (PrintChecks00."VISIT" = CurrLines00."VISIT") AND (PrintChecks00."MIDSERVER" = CurrLines00."MIDSERVER") AND (PrintChecks00."UNI" = CurrLines00."CHECKUNI")
JOIN "ORDERS" Orders00
  ON (Orders00."VISIT" = PayBindings."VISIT") AND (Orders00."MIDSERVER" = PayBindings."MIDSERVER") AND (Orders00."IDENTINVISIT" = PayBindings."ORDERIDENT")
LEFT JOIN "EMPLOYEES" EMPLOYEES00
  ON (EMPLOYEES00."SIFR" = Orders00."MAINWAITER")
LEFT JOIN "SESSIONDISHES" SessionDishes00
  ON (SessionDishes00."VISIT" = PayBindings."VISIT") AND (SessionDishes00."MIDSERVER" = PayBindings."MIDSERVER") AND (SessionDishes00."UNI" = PayBindings."DISHUNI")
LEFT JOIN "MENUITEMS" MENUITEMS00
  ON (MENUITEMS00."SIFR" = SessionDishes00."SIFR")
LEFT JOIN "SALEOBJECTS" SaleObjects00
  ON (SaleObjects00."VISIT" = PayBindings."VISIT") AND (SaleObjects00."MIDSERVER" = PayBindings."MIDSERVER") AND (SaleObjects00."DISHUNI" = PayBindings."DISHUNI")
LEFT JOIN "SESSIONDISHES" SessionDishes01
  ON (SessionDishes01."VISIT" = SaleObjects00."VISIT") AND (SessionDishes01."MIDSERVER" = SaleObjects00."MIDSERVER") AND (SessionDishes01."UNI" = SaleObjects00."DISHUNI")
LEFT JOIN "MENUITEMS" MENUITEMS01
  ON (MENUITEMS01."SIFR" = SessionDishes01."SIFR")
LEFT JOIN DISHGROUPS DISHGROUPS0000
  ON (DISHGROUPS0000.CHILD = MENUITEMS01.SIFR) AND (DISHGROUPS0000.CLASSIFICATION = 4194304)
LEFT JOIN CLASSIFICATORGROUPS CLASSIFICATORGROUPS0000
  ON CLASSIFICATORGROUPS0000.IDENT = DISHGROUPS0000.PARENT  
LEFT JOIN "DISHDISCOUNTS" DishDiscounts00
  ON (DishDiscounts00."VISIT" = SessionDishes00."VISIT") AND (DishDiscounts00."MIDSERVER" = SessionDishes00."MIDSERVER") AND (DishDiscounts00."UNI" = SessionDishes00."CHARGEUNI")
LEFT JOIN "UNCHANGEABLEORDERTYPES" UNCHANGEABLEORDERTYPES00
  ON (UNCHANGEABLEORDERTYPES00."SIFR" = Orders00."UOT")
JOIN "GLOBALSHIFTS" GLOBALSHIFTS00
  ON (GLOBALSHIFTS00."MIDSERVER" = Orders00."MIDSERVER") AND (GLOBALSHIFTS00."SHIFTNUM" = Orders00."ICOMMONSHIFT")
LEFT JOIN "ORDERSESSIONS" OrderSessions00
  ON (OrderSessions00."VISIT" = SessionDishes00."VISIT") AND (OrderSessions00."MIDSERVER" = SessionDishes00."MIDSERVER") AND (OrderSessions00."UNI" = SessionDishes00."SESSIONUNI")
LEFT JOIN "CASHES" CASHES00
  ON (CASHES00."SIFR" = PrintChecks00."ICLOSESTATION")
LEFT JOIN "CASHGROUPS" CASHGROUPS00
  ON (CASHGROUPS00."SIFR" = PayBindings."MIDSERVER")
LEFT JOIN "CURRENCYTYPES" CURRENCYTYPES00
  ON (CURRENCYTYPES00."SIFR" = CurrLines00."IHIGHLEVELTYPE")
LEFT JOIN "CURRENCIES" CURRENCIES00
  ON (CURRENCIES00."SIFR" = CurrLines00."SIFR")
LEFT JOIN "SHIFTS" Shifts00
  ON (Shifts00."MIDSERVER" = PrintChecks00."MIDSERVER") AND (Shifts00."ISTATION" = PrintChecks00."ICLOSESTATION") AND (Shifts00."SHIFTNUM" = PrintChecks00."ISHIFT")
LEFT JOIN "TABLES" TABLES00
  ON (TABLES00."SIFR" = Orders00."TABLEID")
LEFT JOIN "PAYMENTSEXTRA" PaymentsExtra00
  ON (PaymentsExtra00."VISIT" = CurrLines00."VISIT") AND (PaymentsExtra00."MIDSERVER" = CurrLines00."MIDSERVER") AND (PaymentsExtra00."PAYUNI" = CurrLines00."PAYUNIFOROWNERINFO")
LEFT JOIN "RESTAURANTS" RESTAURANTS00
  ON (RESTAURANTS00."SIFR" = CASHGROUPS00."RESTAURANT")
LEFT JOIN "EMPLOYEES" EMPLOYEES01
  ON (EMPLOYEES01."SIFR" = SessionDishes00."IAUTHOR")
LEFT JOIN "SESSIONDISHES" SessionDishes02
  ON (SessionDishes02."VISIT" = SessionDishes00."VISIT") AND (SessionDishes02."MIDSERVER" = SessionDishes00."MIDSERVER") AND (SessionDishes02."UNI" = SessionDishes00."COMBODISHUNI")
LEFT JOIN "MENUITEMS" MENUITEMS02
  ON (MENUITEMS02."SIFR" = SessionDishes02."SIFR")
LEFT JOIN trk7EnumsValues trk7EnumsValues3600
  ON (trk7EnumsValues3600.EnumData = GLOBALSHIFTS00."STATUS") AND (trk7EnumsValues3600.EnumName = 'TRecordStatus')
LEFT JOIN "CATEGLIST" CATEGLIST00
  ON (CATEGLIST00."SIFR" = MENUITEMS00."PARENT")
LEFT JOIN DISHGROUPS DISHGROUPS0001
  ON (DISHGROUPS0001.CHILD = MENUITEMS00.SIFR) AND (DISHGROUPS0001.CLASSIFICATION = 512)
LEFT JOIN CLASSIFICATORGROUPS CLASSIFICATORGROUPS0001
  ON CLASSIFICATORGROUPS0001.IDENT = DISHGROUPS0001.PARENT  
LEFT JOIN "PAYMENTS" Payments00
  ON (Payments00."VISIT" = CurrLines00."VISIT") AND (Payments00."MIDSERVER" = CurrLines00."MIDSERVER") AND (Payments00."UNI" = CurrLines00."PAYUNIFOROWNERINFO")
LEFT JOIN "CURRENCIES" CURRENCIES01
  ON (CURRENCIES01."SIFR" = Payments00."SIFR")
WHERE
  ((PrintChecks00."STATE" = 6))
  AND (PrintChecks00."IGNOREINREP" = 0)
  AND (GLOBALSHIFTS00."SHIFTDATE" BETWEEN CONVERT(DATETIME, '2024.12.01', 102) AND CONVERT(DATETIME, '2100.01.01', 102))
  AND ((GLOBALSHIFTS00."STATUS" = 3))
  and MENUITEMS00."CODE" is null

В ответе надо проверить заполнение колонок sd0_sifr и MENUITEMS00_SIFR.

Исправление для случая №1Link to Исправление для случая №1

Для этого:

  1. Перейдите в меню Сервис > Экспорт данных > Экспорт в другую БД
  2. Укажите параметры соединения, логин и пароль
  3. Проставьте галочки по умолчанию, убрав галочку у Накопительных данных. Если галку оставить — данные о продажах перезапишутся
  4. Нажмите кнопку Проверить и затем Ok
  5. Дождитесь окончания экспорта.

Если после этих действий блюдо есть в менеджерской станции, но отсутствует в базе SQL, создайте задачу для службы поддержки.

Исправление для случая №2Link to Исправление для случая №2

Если блюд нет и в менеджерской, значит случай №2 — базу сервера справочников/отчетов откатили на состояние, когда эти блюда еще не были созданы. Для исправления:

  1. Вспомнить, что это за блюда: цену, название и прочие данные
  2. Создайте в менеджерской станции новые блюда по параметрам из предыдущего пункта
  3. Выполните к SQL-базе запрос из поля ниже. Одному блюду — один запрос. То есть, для каждого блюда сделайте строку со старым и новым идентификатором блюда

    update sessiondishes set sifr=111111 where sifr=1000979
    SQL

    где 1000979 – идентификатор старого блюда, которое отсутствует в базе rk7.udb, а 111111 — новое блюдо которое создали в менеджерской станции.

  4. Готово. Теперь в кубовых отчетах будет фигурировать созданные нами блюда вместо блюд с нулевым кодом.