Один неуловимый глюк обмена с сайтом

Клиент начал жаловаться, что расчетные свойства товара не обновляются на сайте. Но, если открыть карточку, перезаписать, то все получается.

Я показал ему, как перезаписать всю номенклатуру — выделить все позиции, нажать изменить выделенные, ничего не отмечать и номенклатура перерегистрируется на сайт.

Но странное дело — не помогло. Сделали эксперимент. Нашли позицию, где на сайте отмечалось «Под заказ», зарегистрировали изменения, сделали обмен. На сайте ничего не поменялось.

Открыли карточку, записали, сделали обмен. На сайте сбросилось свойство «Под заказ».

И тут меня осенило.

Свойство «Под заказ» я устанавливал программно перед выгрузкой на сайт.

И там было условие, что если в таблице дополнительных реквизитов номенклатуры значение «Под заказ» отсутствует, оно принимается как Ложь.

Но если свойства нет в таблице дополнительных реквизитов, оно не будет выгружаться на сайт.

Когда же пользователь открывал карточку товара, все свойства, заданные для вида номенклатуры, добавлялись, в том числе и свойство «Под заказ» со значением Ложь по умолчанию.

Поэтому пришлось изменить запрос и в случае наличия остатка явно прописывать это свойство.

В итоге код получился таким:

СвойствоОстатков = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«ИдентификаторДляФормул», «ПодЗаказ»);
З = Новый Запрос();

З.Текст =
«ВЫБРАТЬ РАЗЛИЧНЫЕ
|   Т.Ссылка КАК Номенклатура,
|   ЕСТЬNULL(ТО.ВНаличииОстаток, 0) КАК Остаток,
|   ТД.Значение КАК Значение
|ИЗ
|   Справочник.Номенклатура КАК Т
|       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТО
|       ПО (ТО.Номенклатура = Т.Ссылка)
|       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТД
|       ПО (ТД.Ссылка = Т.Ссылка)
|           И (ТД.Свойство = &Свойство)
|ГДЕ
|   НЕ Т.ЭтоГруппа
|   И (ЕСТЬNULL(ТО.ВНаличииОстаток, 0) = 0
|               И ЕСТЬNULL(ТД.Значение, НЕОПРЕДЕЛЕНО) <> ИСТИНА
|           ИЛИ ЕСТЬNULL(ТО.ВНаличииОстаток, 0) <> 0
|               И ЕСТЬNULL(ТД.Значение, НЕОПРЕДЕЛЕНО) <> ЛОЖЬ)»
;
З.УстановитьПараметр(«Свойство», СвойствоОстатков);

Выборка = З.Выполнить().Выбрать();
Пока
Выборка.Следующий() Цикл

   
ТекОбъект = Выборка.Номенклатура.ПолучитьОбъект();
   
Значение = Выборка.Остаток = 0; //Если остаток = 0, тогда под заказ = истина
   
УстановитьДополнительныйРеквизит(ТекОбъект, СвойствоОстатков, Значение);
   
ТекОбъект.ОбменДанными.Загрузка = истина;
   
ТекОбъект.Записать();

КонецЦикла;

А как было раньше? А вот как:

|   И (ЕСТЬNULL(ТО.ВНаличииОстаток, 0) = 0
|               И ЕСТЬNULL(ТД.Значение, ЛОЖЬ) = ЛОЖЬ
|           ИЛИ ЕСТЬNULL(ТО.ВНаличииОстаток, 0) <> 0
|               И ЕСТЬNULL(ТД.Значение, ЛОЖЬ) = ИСТИНА)

Тройственная логика — она не простая.

А ведь из-за этого глюка приходилось долго спорить с разработчиками сайта кто прав, кто виноват. Хорошо, что случился «инсайт«.

Пришлось по аналогии поменять выгрузку еще 3-4 других свойств, потому что там тоже присутствовало это нарушение логики.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 17

  1. Zuko:

    ГДЕ
    НЕ Т.ЭтоГруппа
    И ТД.Значение = (ЕСТЬNULL(ТО.ВНаличииОстаток, 0) 0)

  2. fajij28770:

    >ЕСТЬNULL(ТД.Значение, НЕОПРЕДЕЛЕНО)
    что это за тарабарщина? если у вас там у була тристейт (ЛОЖЬ, ИСТИНА, НЕОПРЕДЕЛЕНО), то зачем тогда еще разрешать в таком поле NULL? если НЕОПРЕДЕЛЕНО — это и есть NULL, то зачем тогда вызов ЕСТЬNULL?

    >Хорошо, что случился «инсайт«.
    звучит так, что скорее случилась рекламация от клиента?

    • Павел:

      Тарабарщина из-за leftjoin. Но зачем менять проверку на null на проверку на неопределено — это только гении знают.
      Вместо того чтобы свести поля к однозначным простым сврйствам да/нет, а потом накладывать условия, Гений усложняет

      • можно сравнивать с NULL, не спорю. Мне проще получать да/нет/неопределено чем да/нет/NULL, это как то больше соответствует третичной логике.

        • Павел:

          Какая такая третичная логика?? Код должен быть понятным, надежно работающим и просто модифицируемым

          • В контексте чего сказано последнее утверждение? Кстати, помните про треугольник Качество — Сроки — Деньги?

          • Павел:

            Качество у тебя нулевое, сроки ты пролюбил, деньги не получил. Чтотты нам шнуруешь какую-то дичь?

          • Павел:

            По теме треугольников лучше почитать Фаулера.

        • fajij28770:

          Мне кажется в 1С даже при нормальном финансировании сложно писать нормальный код, тем более на каких-то сложных проектах.

          • Это Вы по ERP судите? Мне кажется, просто у 1С плохие методисты.

          • Павел:

            Да, там быстро наступает критическая точка, после которой проект превращается в адское месиво. Очень узкая объектная модель под задачи из 90-х.

    • Павел:

      1ц такое 1ц.
      По типу поле bool, но так как оно формируется через соединение с таблицей и значения может не быть — оно становится nullable.
      А дальше брейнденс — как бы написать условие, чтобы не ошибиться

    • нет, я сам нашел при анализе причин ошибок выгрузки на сайт.
      С клиента за свою ошибку денег не взял.

Добавить комментарий для fixin Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *