Добавление колонки себестоимость в прайс-лист. УТ 11

Проклятием типовых конфигураций является сильная привязка логики к интерфейсу при попытке сделать красиво.

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

Решение казалось простым — я просто программно добавил колонку себестоимости в ДеревоЦен обработки ПрайсЛист:

Но вот тут и сказался недостаток подхода методистов 1С. Они удаляли все колонки и потом добавляли свои, естественно, не восстанавливая добавленную мною:

В итоге дерево значений не могло восстановиться в реквизит формы.

Пришлось делать удаление своей колонки с последующим ее добавлением:

&НаСервере
&Вместо("ПрименитьНастройки")
Процедура дор_ПрименитьНастройки(АдресВоВременномХранилище, ДанныеРедактированияПрайсЛиста)
	дор_УдалитьКолонки();
	ПродолжитьВызов(АдресВоВременномХранилище, ДанныеРедактированияПрайсЛиста);
	дор_СоздатьКолонки();
	дор_ПолучитьСебестоимость();
КонецПроцедуры


&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	дор_СоздатьКолонки();
КонецПроцедуры

При создании формы также создаю колонки, чтобы их появление после формирования прайс-листа не было для пользователя сюрпризом.

Процедуры создания и удаления колонок простые:

&НаСервере
Процедура дор_УдалитьКолонки() Экспорт
	Перем Колонки;
	
	Если Элементы.Найти("дор_Себестоимость") <> Неопределено Тогда
		Элементы.Удалить(Элементы.дор_Себестоимость);
		Колонки = Новый Массив;
		Колонки.Добавить("ДеревоЦен.дор_Себестоимость");
		ИзменитьРеквизиты(, Колонки); 
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура дор_СоздатьКолонки() Экспорт
	НовыеКолонки = Новый Массив;
	НовыеКолонки.Добавить(Новый РеквизитФормы("дор_Себестоимость", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)), "ДеревоЦен", "С-сть"));
	ИзменитьРеквизиты(НовыеКолонки); // ключевая процедура, которая добавляет ревизиты

	
	Элемент = Элементы.Вставить("дор_Себестоимость", Тип("ПолеФормы"), Элементы.ДеревоЦен, Элементы.ДеревоЦенЦеноваяГруппа);
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = "ДеревоЦен.дор_Себестоимость";
	Элемент.ТолькоПросмотр = истина;
	Элемент.Ширина = 4;
	Элемент.АвтоМаксимальнаяШирина = ложь;
	Элемент.РастягиватьПоГоризонтали = ложь;
	Элементы.дор_Себестоимость.Видимость = истина;
	
	//После вывода отчета 
	Элементы.дор_Себестоимость.Видимость = истина;


КонецПроцедуры

Код заполнения себестоимости тоже довольно простой, у клиента не использовались характеристики, поэтому достаточно перебрать строки первого уровня:

&НаСервере
Процедура дор_ПолучитьСебестоимость() Экспорт
	
	ДЗ = РеквизитФормыВЗначение("ДеревоЦен");
	М = ДЗ.Строки.ВыгрузитьКолонку("Номенклатура"); //Выгружаем номенклатуру
	
	З = Новый Запрос();
	З.Текст = 
	"ВЫБРАТЬ
	|	Т.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
	|	ЕСТЬNULL(Т.Стоимость, 0) КАК Себестоимость
	|ИЗ
	|	РегистрСведений.СтоимостьТоваров.СрезПоследних(&Дата, ) КАК Т
	|ГДЕ
	|	Т.АналитикаУчетаНоменклатуры.Номенклатура В(&М)";
	З.УстановитьПараметр("Дата", ТекущаяДата());
	З.УстановитьПараметр("М", М);
	
	ТЗ = З.Выполнить().Выгрузить();
	ТЗ.Индексы.Добавить("Номенклатура");
	Для Каждого Строка ИЗ ДЗ.Строки Цикл
		ТекНоменклатура = Строка.Номенклатура;
		ИскСтрока = ТЗ.Найти(ТекНоменклатура, "Номенклатура");
		Если ИскСтрока = Неопределено Тогда
			Строка.дор_Себестоимость = 0;
		Иначе
			Строка.дор_Себестоимость = ИскСтрока.Себестоимость;
		КонецЕсли;
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ДЗ, "ДеревоЦен");
	
КонецПроцедуры

В итоге получается такой результат:

Клиент просил заменить закупочную цену на себестоимость, но для этого не нужно программировать — закупочная цена убирается галочкой в настройках:

UPD 2021-10-07: была выявлена ошибка, если из карточки номенклатуры вызывать прайс-лист, выдается ошибка, что реквизит дор_Себестоимость уже есть, поэтому поправил процедуру создания колонок так:

&НаСервере
Процедура дор_СоздатьКолонки() Экспорт
	//Осипов 2021-10-07
	Если Элементы.Найти("дор_Себестоимость") <> Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	....

Среда: УТ 11.4.13.46
Объем: 1 час.

fixin

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

Читайте также:

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

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