Блюдо с нулевым кодом
Введение
В статье описана ситуация поломки базы, когда в ней появляется блюдо с нулевым кодом.
Пример подобного поведения в кубическом отчете:
Возможные причины:
- Потеря связи и рассинхронизация между сервером справочников/отчетов и базой данных SQL
- Откат базы сервера справочников/отчетов на состояние, когда проданных блюд еще не было в меню менеджерской станции
Поиск причины ошибки
Первым делом необходимо выяснить причину ошибки.
Откройте SQL Server Management Studio и выполните запрос вашей базе данных:
select distinct sifr from SESSIONDISHES where SIFR not in(select sifr from MENUITEMS)SQL- Запрос показывает проданные блюда, которых нет в меню. В моем случае нашлось одно блюдо.

- Далее поиском в менеджерской станции проверьте, есть ли блюда с такими идентификаторами
Если блюда есть, значит у нас случай №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.
Исправление для случая №1
Для этого:
- Перейдите в меню Сервис > Экспорт данных > Экспорт в другую БД
- Укажите параметры соединения, логин и пароль
- Проставьте галочки по умолчанию, убрав галочку у Накопительных данных. Если галку оставить — данные о продажах перезапишутся

- Нажмите кнопку Проверить и затем Ok
- Дождитесь окончания экспорта.
Если после этих действий блюдо есть в менеджерской станции, но отсутствует в базе SQL, создайте задачу для службы поддержки.
Исправление для случая №2
Если блюд нет и в менеджерской, значит случай №2 — базу сервера справочников/отчетов откатили на состояние, когда эти блюда еще не были созданы. Для исправления:
- Вспомнить, что это за блюда: цену, название и прочие данные
- Создайте в менеджерской станции новые блюда по параметрам из предыдущего пункта
Выполните к SQL-базе запрос из поля ниже. Одному блюду — один запрос. То есть, для каждого блюда сделайте строку со старым и новым идентификатором блюда
update sessiondishes set sifr=111111 where sifr=1000979SQLгде 1000979 – идентификатор старого блюда, которое отсутствует в базе rk7.udb, а 111111 — новое блюдо которое создали в менеджерской станции.
- Готово. Теперь в кубовых отчетах будет фигурировать созданные нами блюда вместо блюд с нулевым кодом.