Обработка по перезаполнению цен в документах КА2

1. Shaldryn 04.10.18 01:14 Сейчас в теме
Добрый день! Стоит такая задача, база КА2 (2.4.5). Необходимо в документах РТУ с 1.07.18 по текущую дату перезаполнить цены в товарах по виду цен установленные в документе "Установка цен номенклатуры"(определенный документ). То есть по определенному контрагенту. Способ выбрал такой:
Получается ищем совпадения номенклатуры из определенной установки цен в документах РТУ. Находим РТУ, получаем ее форму и вызываем событие при изменении вида цен, которая перезаполняет нам цены по виду цен. Далее проводим документ. Само собой попутно ищем документ заказ клиента и там тоже самое проделываем. У меня вопрос, верной ли дорогой иду или есть более оптимальный способ?
Вот код обработки, он корявый я не спорю, просвятите меня, в первый раз сталкиваюсь с такой задачей:
&НаСервере
Функция Команда1НаСервере()
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	РеализацияТоваровУслугТовары.Ссылка КАК Ссылка
		|ИЗ
		|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦенНоменклатурыТовары
		|		ПО РеализацияТоваровУслугТовары.Номенклатура = УстановкаЦенНоменклатурыТовары.Номенклатура
		|			И РеализацияТоваровУслугТовары.ВидЦены = УстановкаЦенНоменклатурыТовары.ВидЦены
		|ГДЕ
		|	РеализацияТоваровУслугТовары.Ссылка.Контрагент = &Контрагент
		|	И УстановкаЦенНоменклатурыТовары.ВидЦены = &ВидЦены
		|	И РеализацияТоваровУслугТовары.Ссылка.Дата >= &Дата
		|	И УстановкаЦенНоменклатурыТовары.Ссылка = &Ссылка
		|
		|УПОРЯДОЧИТЬ ПО
		|	РеализацияТоваровУслугТовары.Ссылка.Дата";
	
	Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Видцены1"));
	Запрос.УстановитьПараметр("Дата", Дата(2018,07,01));
	Запрос.УстановитьПараметр("Контрагент", Справочники.Контрагенты.НайтиПоНаименованию("Контрагент1"));
	Запрос.УстановитьПараметр("Ссылка", УстановкаЦен); //УстановкаЦен - это реквизит на форме обработки, указываем документ из которого берем товары
	
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
		
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
	//Команда1НаСервере();
	
	МассивСсылок = Команда1НаСервере();
	
	Если МассивСсылок.Количество() > 0 Тогда 
		
		Для Каждого мСтрока Из МассивСсылок Цикл
			
			мФормаРТУ = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента", Новый Структура("Ключ", мСтрока), ЭтаФорма);
			
			Если ЗначениеЗаполнено(мФормаРТУ.Объект.ЗаказКлиента) Тогда 
				
				мФормаЗК = ПолучитьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента", Новый Структура("Ключ", мФормаРТУ.Объект.ЗаказКлиента), ЭтаФорма);
				
				Для Каждого СтрокаТЧ Из мФормаЗК.Объект.Товары Цикл
					
					ТоварыВидЦеныПриИзмененииЗК(СтрокаТЧ, мФормаЗК, мФормаЗК.Объект);
					
				КонецЦикла;	
				
				мФормаЗК.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
				
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Изменен документ " + мФормаЗК.Объект.Ссылка;
				Сообщение.Сообщить();
				
				мФормаЗК = "";
				
			КонецЕсли;
			
			Для Каждого СтрокаТЧ Из мФормаРТУ.Объект.Товары Цикл
				
				ТоварыВидЦеныПриИзмененииРТУ(СтрокаТЧ, мФормаРТУ, мФормаРТУ.Объект);
				
			КонецЦикла;	
			
			мФормаРТУ.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
			
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Изменен документ " + мФормаРТУ.Объект.Ссылка;
			Сообщение.Сообщить();
			
			мФормаРТУ = "";
			
		КонецЦикла;
		
	Иначе
		Возврат;
	КонецЕсли;
	
	
КонецПроцедуры


#Область РТУ

&НаКлиенте
Процедура ТоварыВидЦеныПриИзмененииРТУ(Элемент, мФорма, мОбъект)
	
	ТекущаяСтрока = Элемент;//ы.Товары.ТекущиеДанные;
	
	СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(мОбъект);
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныВСтрокеТЧ(мОбъект));
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСумму");
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
	СтруктураДействий.Вставить("ОчиститьСуммуВзаиморасчетов");
	//СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты());
	СтруктураДействий.Вставить("ПересчитатьСуммуСверхЗаказа", Новый Структура("РеализацияПоступлениеПоЗаказу, ТребуетсяЗалогЗаТару",
		мОбъект.РеализацияПоЗаказам, мОбъект.ТребуетсяЗалогЗаТару));
	СтруктураДействий.Вставить("ПодстановкаВидаЦен", Истина);
	
		
	ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
	
	ПродажиКлиентСервер.РассчитатьИтоговыеПоказателиРеализации(мФорма);
	РассчитатьСуммуПредоплаты(мФорма);
	СкидкиНаценкиКлиент.СброситьФлагСкидкиРассчитаны(мФорма);
		
КонецПроцедуры

#КонецОбласти


#Область ЗК

&НаКлиенте
Процедура ТоварыВидЦеныПриИзмененииЗК(Элемент, мФорма, мОбъект)
	
	ТекущаяСтрока = Элемент;//.Товары.ТекущиеДанные;
	
	СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(мОбъект);
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныВСтрокеТЧ(мОбъект));
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
	СтруктураДействий.Вставить("ПересчитатьСумму");
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
	СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
	//СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты());
	СтруктураДействий.Вставить("ПодстановкаВидаЦен", Истина);
		
	ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, Неопределено);
	
	РассчитатьИтоговыеПоказателиЗаказа(мФорма);
	
	СкидкиНаценкиКлиент.СброситьФлагСкидкиРассчитаны(мФорма);
		
КонецПроцедуры

#КонецОбласти
Показать


Оставил основные процедуры. Проблема в том что допусти мы находим 80 документов РТУ, с заказами получается 160. При запуске обработки, бывает выдает ошибку "Конфликт блокировок при выполнении транзакции:
Неустранимый конфликт блокировок"

Если например по одному документу, то ошибок нет, выполняется все и отрабатывает как надо.
+
По теме из базы знаний
Найденные решения
6. Shaldryn 05.10.18 10:05 Сейчас в теме
(5) что самое интересное, при написании обработки и ее отладки использовал файловую базу, и там обработка проходит без ошибок. Склоняюсь к тому что бы выгрузить серверную в файловую, там обработать все и снова загрузить в серверную, благо пока размер позволяет пользоваться файловой
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dnki 4 04.10.18 06:45 Сейчас в теме
Немного сломал глаза читая. Я понимаю, что у Вас нет проблемы различить "мФормаРТУ" и "мФормаЗК", в отличие от меня, не знающего этой конфигурации. Я тоже не люблю длинные имена, но посоветовал бы чуть более различимо. Например: ""мФормаРеал" и "мФормаЗак".
Что по сути:
- Держим открытой форму одного документа
- В цикле меняем формы второго и записываем
- Записываем первый
Ничего крамольного, но почему-то конфликт. Не понял только, в командах
мФормаЗК = ПолучитьФорму("...., ЭтаФорма) - зачем устанавливать владельцем саму обработку?
Могу предложить, что если эти 2 дока конфликтуют, такой вариант:
- Открыты форму РеалТУ
- Ссылки на заказы собрал в массив
- Записал РеалТУ
- Прошел по Заказам и обработал их
+
3. Shaldryn 04.10.18 23:34 Сейчас в теме
(2) Владельца всегда заполнял, думаю это не существенно, так как владелец чисто служит для уникальности формы

Немного переписал код, но проблема осталась, заметил вот что после вызова проведения документа, допустим "мФормаРТУ.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));" на сервере создается фоновое задание, которое рассчитывает себестоимость, взаиморасчеты и т.д. и т.п. соответственно захватывает объекты в СУБД, получается при каждом проведении таким способом документа запускается фоновое задание + захват объектов растет у каждого задания, отсюда, я думаю, и неустранимый конфликт блокировок.

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

Больше уже склоняюсь к тому, что через форму перезаполнение не подходит, необходимо получать объект и там перезаполнять данные...придется все переписывать
+
5. Dnki 4 05.10.18 09:02 Сейчас в теме
(3) "на сервере создается фоновое задание". Елы-палы! Разумеется, два процесса мешают друг другу.
И как ни делай, будет тот-же результат.
Я бы искал команду, запускающую процесс. Отключил бы его, а после завершения обработки запустить.
+
6. Shaldryn 05.10.18 10:05 Сейчас в теме
(5) что самое интересное, при написании обработки и ее отладки использовал файловую базу, и там обработка проходит без ошибок. Склоняюсь к тому что бы выгрузить серверную в файловую, там обработать все и снова загрузить в серверную, благо пока размер позволяет пользоваться файловой
+
4. Shaldryn 05.10.18 00:09 Сейчас в теме
Поправочка, через объект тоже самое, буду тогда смотреть какого не отключаются регламентные задания...
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот