Почему я пишу лучше рандомного 1с-ника
Потому что опытный, а опыт — сын ошибок трудных.
Сделал одному клиенту доработку по раскраске подбора номенклатуру в продажу, там нужно было выделять строки, где значение дополнительного реквизита «Распродажный товар» равно «Истина».
Текст списка подменял расширяя процедуру УстановитьТекстыЗапросовСписковФормыПодбора модуля ПодборТоваровСервер:
Использовал специальную функцию, чтобы добавлять условное оформление:
Функция ДобавитьРаскраскуНоменклатуры(Форма, Список) Экспорт //2021-02-24 Осипов https://infostart.ru/1c/articles/181336/ //Поле РаспродажныйТовар ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить(); ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПВыгодно"); // имя поля ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПРаспродажныйТовар"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 1; ЭлементОтбора.Использование = Истина; Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона"); //Элемент.Значение = WebЦвета.Роса; //Бледно-бирюзовый (175 / 238 / 238) Элемент.Значение = Новый Цвет(175, 238, 238); Элемент.Использование = Истина; Для Каждого Поле из Список.УсловноеОформление.ДоступныеПоляПолей.Элементы Цикл ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Поле.Поле; ПолеОформления.Использование = Истина; КонецЦикла; //ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Наименование"); //ПолеОформления.Использование = Истина; КонецФункции
Обновление делал я, после обновления клиент обратился с проблемой, что не работает подбор в поступлении.
Открыв место ошибки, я увидел странное:
&НаСервере Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) ТекстЗапроса = "ВЫБРАТЬ | НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка, | НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство, | ВЫБОР | КОГДА НоменклатураДополнительныеРеквизиты.Значение = ИСТИНА | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК Значение, | НоменклатураДополнительныеРеквизиты.ТекстоваяСтрока КАК ТекстоваяСтрока, | НоменклатураДополнительныеРеквизиты.Свойство.ИдентификаторДляФормул КАК СвойствоИдентификаторДляФормул |ПОМЕСТИТЬ ВТРаспродажныйТовар |ИЗ | Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты |ГДЕ | НоменклатураДополнительныеРеквизиты.Свойство.ИдентификаторДляФормул = ""РаспродажныйТовар"" |; | | |ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Ссылка, | ... | ЕСТЬNULL(ВТРаспродажныйТовар.Значение, 0) КАК ПРаспродажныйТовар |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура | ... | ЛЕВОЕ СОЕДИНЕНИЕ ВТРаспродажныйТовар КАК ВТРаспродажныйТовар | ПО СправочникНоменклатура.Ссылка = ВТРаспродажныйТовар.Ссылка |ГДЕ | ..."; дор_С.ДобавитьРаскраскуНоменклатуры(ЭтаФорма,СписокНоменклатура); КонецПроцедуры
Увидел вызов своей функции и сначала даже подумал, что я мог написать такой код. Но потом понял, что нет.
Скорее всего, программист пытался скопировать мой код.
Но он просто скопировал текст запроса и подменил его целиком. Что и умерло через несколько обновлений.
В отличии от него я подменял текст запроса вставкой и заменой:
//+++ Осипов 26.05.18 поправил код анонимного программиста, который подменял запрос целиком. ТекстЗапроса = СписокНоменклатура.ТекстЗапроса; Маркер = "СправочникНоменклатура.Ссылка КАК Ссылка"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Маркер, Маркер + ", " + "ЕСТЬNULL(ВТРаспродажныйТовар.Значение, 0) КАК ПРаспродажныйТовар" ); Маркер = "Справочник.Номенклатура КАК СправочникНоменклатура"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Маркер, Маркер + " ЛЕВОЕ СОЕДИНЕНИЕ (" + "ВЫБРАТЬ | НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка, | МАКСИМУМ(ВЫБОР | КОГДА НоменклатураДополнительныеРеквизиты.Значение = ИСТИНА | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ) КАК Значение |ИЗ | Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты |ГДЕ | НоменклатураДополнительныеРеквизиты.Свойство.ИдентификаторДляФормул = ""РаспродажныйТовар"" | |СГРУППИРОВАТЬ ПО | НоменклатураДополнительныеРеквизиты.Ссылка" + ") КАК ВТРаспродажныйТовар ПО СправочникНоменклатура.Ссылка = ВТРаспродажныйТовар.Ссылка" ); СписокНоменклатура.ТекстЗапроса = ТекстЗапроса; //---
Вот когда я в тексте увидел использование временных таблиц для получения доп. реквизитов, я окончательно уверился, что это мой код.
К тому же, я всегда группирую по ссылке на случай дубликатов.
Ну и конечно, я не спроста размещаю замены в модуле Текст списка подменял расширяя процедуру УстановитьТекстыЗапросовСписковФормыПодбора, а не в процедуре ПриСоздании. Текст запроса может меняться и 1С в процессе изменения параметров подбора. Это можно только знать из опыта.
Плохо, что программисты не подписывают свой код, провоцируя шизофрению у других программистов. Я реально некоторое время потратил, чтобы понять, мой это код или нет.
Среда: 11.5.26.118 Объем: 0.8 час.




Свежие комментарии