Данные не записываются в справочник

1. vargostelemax1 25.06.18 07:12 Сейчас в теме
Доброго времени суток. Дело в следующем: Добавил в справочник новую кнопку, при нажатии которой открывается внешняя обработка:
Процедура ИзменитьРасценкиНажатие(Элемент)
ОткрытьОбработку = ВнешниеОбработки.Создать("C:\Работы.epf");
ОткрытьФорму=ОткрытьОбработку.ПолучитьФорму("Форма");
ОткрытьФорму.Открыть();	
КонецПроцедуры

Далее, в обработке две функции: 1 - найти расхождения в фактических данных и данных, которые забиты в справочник + показать их; 2 - перезаписать расхождения
Первая функция отрабатывает, все расхождения видны, а вот записать полученные данные не удается. Прошу подсказать в чем причина. Код:
кнопка просмотра расхождений:
Расценки = Новый Запрос
	("ВЫБРАТЬ
	|	Работы.Код,
	|	Работы.Наименование,
	|	Работы.Расценка,
	|	Работы.НормаЧасов,
	|	Работы.Родитель
	|ИЗ
	|	Справочник.Работы КАК Работы
	|ГДЕ
	|	Работы.ЭтоГруппа = Ложь И
	|	Работы.ПометкаУдаления = Ложь");
	Выборка = Расценки.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл	
		Если Найти(НРег(Выборка.Наименование), "набор арматуры")
			ИЛИ Найти(НРег(Выборка.Наименование), "обрыв перемычки")
			ИЛИ Найти(НРег(Выборка.Наименование), "мат 1000х1000 (вулкнизация)")			
			Тогда Продолжить;
		КонецЕсли;	
		Если Найти(НРег(Выборка.Родитель.Родитель.Наименование), "праздничные") 
			ИЛИ Найти(НРег(Выборка.Родитель.Родитель.Родитель.Наименование), "праздничные")  Тогда
			Если Найти(Выборка.Наименование, "вулканизац") Тогда
				Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("5-разряд (Сде-щики СОВ)"));	
				Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);	
				Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2);
			ИначеЕсли Найти(Выборка.Наименование, "шероховка") Тогда
				Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("2-разряд (Сде-щики СН"));	
				Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
				Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка,2);
Показать



кнопка записи:
Выборка = Справочники.Работы.Выбрать();
	Пока Выборка.Следующий() Цикл	
		Если Найти(НРег(Выборка.Наименование), "набор арматуры")
			ИЛИ Найти(НРег(Выборка.Наименование), "обрыв перемычки")
			ИЛИ Найти(НРег(Выборка.Наименование), "мат 1000х1000 (вулкнизация)")			
			Тогда Продолжить;
		КонецЕсли;	
		Если Найти(НРег(Выборка.Родитель.Родитель.Наименование), "праздничные") 
			ИЛИ Найти(НРег(Выборка.Родитель.Родитель.Родитель.Наименование), "праздничные")  Тогда
			Если Найти(Выборка.Наименование, "вулканизац") Тогда
				Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("5-разряд (Сде-щики СОВ)"));	
				Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);	
				Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2);
			ИначеЕсли Найти(Выборка.Наименование, "шероховка") Тогда
				Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("2-разряд (Сде-щики СН"));	
				Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
				Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка,2);
				ВыборкаОбъект = Выборка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать();
Показать
По теме из базы знаний
Найденные решения
19. spacecraft 25.06.18 09:09 Сейчас в теме
(11) (1)
Если Найти(Выборка.Наименование, "вулканизац") Тогда
Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("5-разряд (Сде-щики СОВ)"));
Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2);
ИначеЕсли Найти(Выборка.Наименование, "шероховка") Тогда
Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("2-разряд (Сде-щики СН"));
Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка,2);
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = Формула;
ВыборкаОбъект.Записать();


Тут только вторая формула будет записываться.
vargostelemax1; +1 Ответить
38. Elnur54442 25.06.18 10:26 Сейчас в теме
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = Число(Формула);
ВыборкаОбъект.Записать();
так попробуй
vargostelemax1; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
19. spacecraft 25.06.18 09:09 Сейчас в теме
(11) (1)
Если Найти(Выборка.Наименование, "вулканизац") Тогда
Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("5-разряд (Сде-щики СОВ)"));
Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2);
ИначеЕсли Найти(Выборка.Наименование, "шероховка") Тогда
Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("2-разряд (Сде-щики СН"));
Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка,2);
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = Формула;
ВыборкаОбъект.Записать();


Тут только вторая формула будет записываться.
vargostelemax1; +1 Ответить
2. PhoenixAOD 62 25.06.18 07:22 Сейчас в теме
Выборка.Ссылка.ПолучитьОбъект() так попробуй.
3. vargostelemax1 25.06.18 07:52 Сейчас в теме
(2)
Вместо чего это использовать?
4. vargostelemax1 25.06.18 08:00 Сейчас в теме
(2)
Если про эту строчку
 ВыборкаОбъект = Выборка.ПолучитьОбъект();


То не помогло :-(
5. PhoenixAOD 62 25.06.18 08:03 Сейчас в теме
(4)Найти(Выборка.Наименование, "шероховка") что тут отладчик показывает?
6. vargostelemax1 25.06.18 08:06 Сейчас в теме
(5)
свойство - Найти(Выборка.Наименование, "шероховка")
значение - 12
тип - число
7. PhoenixAOD 62 25.06.18 08:10 Сейчас в теме
Ну вот, что и требовалось доказать. Объект вы получить не можете.
8. vargostelemax1 25.06.18 08:15 Сейчас в теме
(7)
Добавил запрос по аналогии с первой кнопкой, теперь вылетает ошибка
 Метод объекта не обнаружен (ПолучитьОбъект)
				ВыборкаОбъект = Выборка.ПолучитьОбъект();

Как можно побороть ее?
9. PhoenixAOD 62 25.06.18 08:20 Сейчас в теме
ВЫБРАТЬ
    |    Работы.Ссылка как Ссылка,
    |    Работы.Код,
    |    Работы.Наименование,
    |    Работы.Расценка,
    |    Работы.НормаЧасов,
    |    Работы.Родитель
    |ИЗ
    |    Справочник.Работы КАК Работы
    |ГДЕ
    |    Работы.ЭтоГруппа = Ложь И
    |    Работы.ПометкаУдаления = Ложь
Показать


И вот уже Выборка.Ссылка.ПолучитьОбъект()
10. vargostelemax1 25.06.18 08:22 Сейчас в теме
(9)
Получил новую ошибку :(
11. vargostelemax1 25.06.18 08:24 Сейчас в теме
(9)
Вру, ошибки нет, опечатку допустил в запросе.
Теперь обработка срабатывает, но все равно не перезаписывает данные
12. AlexFort1961 1 25.06.18 08:37 Сейчас в теме
Ну, осталось посмотреть в отладчике, что происходит в строке

ВыборкаОбъект.Расценка = Формула;

(тип "Расценка", содержимое "Формула").
13. vargostelemax1 25.06.18 08:46 Сейчас в теме
(12)
В строку Выборка.Ссылка.ПолучитьОбъект().Расценка
Получен объект

В строку ВыборкаОбъект.Расценка = Формула
Получено число
14. AlexFort1961 1 25.06.18 08:48 Сейчас в теме
Да нет,
1) тип реквизита "Расценка" - "Строка"?
2) и содержимое переменной "формула" в момент выполнения строки?

ВыборкаОбъект.Расценка = Формула;
15. vargostelemax1 25.06.18 08:50 Сейчас в теме
(14)
Свойств ВыборкаОбъект.Расценка = Формула
Значение Истина
Тип Булево

Не понимаю, почему в булево преобразуется

Формула в момент выполнения содержит число
16. vargostelemax1 25.06.18 08:56 Сейчас в теме
(14)
Или вас интересует какой тип данных имеет сам реквизит в справочнике? Если так, то Число
17. AlexFort1961 1 25.06.18 09:02 Сейчас в теме
Может быть несоответствие типов в разных частях присвоения:

ВыборкаОбъект.Расценка = Формула

Если тип реквизита справочника "Расценка" - "число", то и в переменной "Формула", также должно быть число.
18. vargostelemax1 25.06.18 09:04 Сейчас в теме
(17)
И в Расценке, и в Формуле содержится число, проверил
20. AlexFort1961 1 25.06.18 09:17 Сейчас в теме
"Теперь обработка срабатывает, но все равно не перезаписывает данные"

А что значит "не перезаписывает"? Вываливается ошибка или просто в реквизите справочника остается прежнее значение?
21. vargostelemax1 25.06.18 09:19 Сейчас в теме
(20)остаются прежние значения
22. Elnur54442 25.06.18 09:35 Сейчас в теме
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = 1;
ВыборкаОбъект.Записать();

Вы сначало попрбуйте так . Посмотрите значение реквизита можете поменять. Если да тогда проблема в формуле иначе напишите посмотрим в чем проблема дальще
24. vargostelemax1 25.06.18 09:45 Сейчас в теме
(22)
Попробовал - данные остались прежние.
23. Elnur54442 25.06.18 09:44 Сейчас в теме
Еще может быть какое то условие стоит в модуле и в момент записи не дает записать новое значение. Или данные реквизита хранятся в регистре. Вариантов много
25. Elnur54442 25.06.18 09:48 Сейчас в теме
26. Elnur54442 25.06.18 09:50 Сейчас в теме
Или сам реквизит Расценку включи в табло и через f11 помотри когда значение меняетса на прежднюю
27. Elnur54442 25.06.18 09:52 Сейчас в теме
ВыборкаОбъект.Расценка = 1; после этой строки начни через f11 ходить
28. vargostelemax1 25.06.18 09:57 Сейчас в теме
(27)
Не в ту ветку указал
ВыборкаОбъект.Расценка = 1;
Данные перезаписались, значит с формулой что-то не так?
Что с ней может быть не так?

Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2)
29. Elnur54442 25.06.18 10:03 Сейчас в теме
ВыборкаОбъект.Записать(); в этой строке остонавись и посмотри Формула и ВыборкаОбъект.Расценка какое значение возвращает ?
ВыборкаОбъект.Расценка = Формула тоже посмотри истина возвращает ?
30. Elnur54442 25.06.18 10:04 Сейчас в теме
Напиши если не трудно значение Формула
31. vargostelemax1 25.06.18 10:06 Сейчас в теме
(30)
Значения одинаковые в Формула и ВыборкаОбъект.Расценка
ВыборкаОбъект.Расценка=Формула - истина
Значение Формула = число, 1565,12
32. vargostelemax1 25.06.18 10:07 Сейчас в теме
(30)
Но значения одинаковые потому что не у всех позиций справочника есть расхождения, в моем понимании
33. Elnur54442 25.06.18 10:08 Сейчас в теме
в справочнике посмотри длина и точность реквизита Расценка какие?
34. vargostelemax1 25.06.18 10:08 Сейчас в теме
35. Elnur54442 25.06.18 10:12 Сейчас в теме
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = 1565,12;
ВыборкаОбъект.Записать();
проверь этот код посмотри записывается число 1565,12
36. vargostelemax1 25.06.18 10:23 Сейчас в теме
(35)
Сейчас добавил следующий код:
Что-то я уже совсем не понимаю почему так происходит:
Сначала попробовал так:
ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка = 1565.12;
				//ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать();

Данные не поменялись
Затем так
ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка = 30;
				//ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать()
;
Данные не поменялись.
И затем так, как я пробовал в первый раз:
ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка =ВыборкаОбъект.Расценка+ 30;
				//ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать()
;
Данные поменялись
37. Elnur54442 25.06.18 10:25 Сейчас в теме
ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = 1;
ВыборкаОбъект.Записать();
а когда так тогда меняется?
vargostelemax1; +1 Ответить
39. vargostelemax1 25.06.18 10:28 Сейчас в теме
(37)
Дак вот, я сделал
ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
                ВыборкаОбъект.Расценка =ВыборкаОбъект.Расценка+ 30;
                //ВыборкаОбъект.Расценка = Формула;
                ВыборкаОбъект.Записать()

таким образом, и подумал что это будет идентичным вашему варианту.
Сейчас откачу все то, что назаписывал в справочник и попробую
38. Elnur54442 25.06.18 10:26 Сейчас в теме
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Расценка = Число(Формула);
ВыборкаОбъект.Записать();
так попробуй
vargostelemax1; +1 Ответить
40. vargostelemax1 25.06.18 10:35 Сейчас в теме
(38)
Все равно не перезаписываются значения
41. Elnur54442 25.06.18 10:37 Сейчас в теме
может я сам посмотрю если это здесь не запрешено?
vargostelemax1; +1 Ответить
42. Elnur54442 25.06.18 10:40 Сейчас в теме
так просто не может быть что типы одинакывые и значение не записывается. Значить в момент записи какое то условие не дает записать новое значение
vargostelemax1; +1 Ответить
43. vargostelemax1 25.06.18 10:44 Сейчас в теме
44. vargostelemax1 25.06.18 11:58 Сейчас в теме
(42)
Выражаю огромную благодарность пользователю с ником Elnur54442.
Ошибка была в том, что я не добавил условие записи в одну из веток условия. Вот рабочий код. Может кому-нибудь пригодится
РасценкиЗапись = Новый Запрос
	("ВЫБРАТЬ
	|	Работы.Ссылка как Ссылка,
	|	Работы.Код,
	|	Работы.Наименование,
	|	Работы.Расценка,
	|	Работы.НормаЧасов,
	|	Работы.Родитель
	|ИЗ
	|	Справочник.Работы КАК Работы
	|ГДЕ
	|	Работы.ЭтоГруппа = Ложь И
	|	Работы.ПометкаУдаления = Ложь");
	Выборка = РасценкиЗапись.Выполнить().Выбрать();

	//Выборка = Справочники.Работы.Выбрать();
	Пока Выборка.Следующий() Цикл	
		Если Найти(НРег(Выборка.Наименование), "набор арматуры")
			ИЛИ Найти(НРег(Выборка.Наименование), "обрыв перемычки")		
			Тогда Продолжить;
		КонецЕсли;	
		Если Найти(НРег(Выборка.Родитель.Родитель.Наименование), "праздничные") 
			ИЛИ Найти(НРег(Выборка.Родитель.Родитель.Родитель.Наименование), "праздничные")  Тогда
				Если Найти(Выборка.Наименование, "вулканизац") Тогда
					Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("5-разряд (Сде-щики СОВ)"));	
					Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);	
					Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка, 2);
				ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать();
				ИначеЕсли Найти(Выборка.Наименование, "шероховка") Тогда
					Отбор = Новый Структура("Разряд", Справочники.ТарифныеСетки.НайтиПоНаименованию("2-разряд (Сде-щики СН"));	
					Расчет = РегистрыСведений.РазрядыТарифныхСеток.СрезПоследних(ТекущаяДата(), Отбор);
					Формула= Окр(2*Выборка.НормаЧасов * Расчет[0].Ставка,2);
				ВыборкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
				ВыборкаОбъект.Расценка = Формула;
				ВыборкаОбъект.Записать();
Показать
Оставьте свое сообщение

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