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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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