Один неуловимый глюк обмена с сайтом
Клиент начал жаловаться, что расчетные свойства товара не обновляются на сайте. Но, если открыть карточку, перезаписать, то все получается.
Я показал ему, как перезаписать всю номенклатуру — выделить все позиции, нажать изменить выделенные, ничего не отмечать и номенклатура перерегистрируется на сайт.
Но странное дело — не помогло. Сделали эксперимент. Нашли позицию, где на сайте отмечалось «Под заказ», зарегистрировали изменения, сделали обмен. На сайте ничего не поменялось.
Открыли карточку, записали, сделали обмен. На сайте сбросилось свойство «Под заказ».
И тут меня осенило.
Свойство «Под заказ» я устанавливал программно перед выгрузкой на сайт.
И там было условие, что если в таблице дополнительных реквизитов номенклатуры значение «Под заказ» отсутствует, оно принимается как Ложь.
Но если свойства нет в таблице дополнительных реквизитов, оно не будет выгружаться на сайт.
Когда же пользователь открывал карточку товара, все свойства, заданные для вида номенклатуры, добавлялись, в том числе и свойство «Под заказ» со значением Ложь по умолчанию.
Поэтому пришлось изменить запрос и в случае наличия остатка явно прописывать это свойство.
В итоге код получился таким:
СвойствоОстатков = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«ИдентификаторДляФормул», «ПодЗаказ»);
З = Новый Запрос();
З.Текст =
«ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.Ссылка КАК Номенклатура,
| ЕСТЬNULL(ТО.ВНаличииОстаток, 0) КАК Остаток,
| ТД.Значение КАК Значение
|ИЗ
| Справочник.Номенклатура КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТО
| ПО (ТО.Номенклатура = Т.Ссылка)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТД
| ПО (ТД.Ссылка = Т.Ссылка)
| И (ТД.Свойство = &Свойство)
|ГДЕ
| НЕ Т.ЭтоГруппа
| И (ЕСТЬNULL(ТО.ВНаличииОстаток, 0) = 0
| И ЕСТЬNULL(ТД.Значение, НЕОПРЕДЕЛЕНО) <> ИСТИНА
| ИЛИ ЕСТЬNULL(ТО.ВНаличииОстаток, 0) <> 0
| И ЕСТЬNULL(ТД.Значение, НЕОПРЕДЕЛЕНО) <> ЛОЖЬ)»;
З.УстановитьПараметр(«Свойство», СвойствоОстатков);
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекОбъект = Выборка.Номенклатура.ПолучитьОбъект();
Значение = Выборка.Остаток = 0; //Если остаток = 0, тогда под заказ = истина
УстановитьДополнительныйРеквизит(ТекОбъект, СвойствоОстатков, Значение);
ТекОбъект.ОбменДанными.Загрузка = истина;
ТекОбъект.Записать();
КонецЦикла;
А как было раньше? А вот как:
| И (ЕСТЬNULL(ТО.ВНаличииОстаток, 0) = 0
| И ЕСТЬNULL(ТД.Значение, ЛОЖЬ) = ЛОЖЬ
| ИЛИ ЕСТЬNULL(ТО.ВНаличииОстаток, 0) <> 0
| И ЕСТЬNULL(ТД.Значение, ЛОЖЬ) = ИСТИНА)
Тройственная логика — она не простая.
А ведь из-за этого глюка приходилось долго спорить с разработчиками сайта кто прав, кто виноват. Хорошо, что случился «инсайт«.
Пришлось по аналогии поменять выгрузку еще 3-4 других свойств, потому что там тоже присутствовало это нарушение логики.
