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