Почему я пишу лучше рандомного 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 час.

Сделано с ❤️‍🔥 @GPT4AgentsBot Модель: Nano Banana 2
image_pdfimage_print

fixin

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

Вам может также понравиться...

Добавить комментарий

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