Не выполняется код функцией Выполнить

1. Vladiimir 25.05.20 18:08 Сейчас в теме
Здравствуйте!

Подскажите пожалуйста по какой причине функция Выполнить может не исполнять следующий скрипт:
Попытка
Результат="";
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора,
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Комментарий
|ИЗ
|	Справочник.рбсВидыДоговоров.ЗаполнениеРеквизитовДоговора КАК рбсВидыДоговоровЗаполнениеРеквизитовДоговора
|ГДЕ
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Ссылка = &Ссылка
|	И рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора.Наименование = ""ЧасовВМес""";

Запрос.УстановитьПараметр("Ссылка", Объект.ВидДоговора.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
СтрокаКомментария=Выборка.Комментарий;
ЧислоИзСтроки="";

Для Индекс = 0 По СтрДлина(СтрокаКомментария) Цикл
	Сим=Сред(СтрокаКомментария,Индекс,1);
	Если Сим>="0" и  Сим<="9" тогда
		ЧислоИзСтроки = ЧислоИзСтроки+Сим;
	КонецЕсли;
КонецЦикла; 

Попытка
	ЧасовВМес=Число(ЧислоИзСтроки);
Исключение
	ЧасовВМес=Неопределено;
	Сообщить("Не верно задано значение ЧасовВМес в виде договора");
КонецПопытки;
КонецЦикла;

Если ТипЗнч(ЧасовВМес)=Тип("Число") Тогда
Запрос2 = Новый Запрос;
Запрос2.Текст ="ВЫБРАТЬ
|	рбсДоговорПодпискаИТС.ДатаНачала,
|	рбсДоговорПодпискаИТС.ДатаОкончания
|ИЗ
|	Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
|ГДЕ
|	рбсДоговорПодпискаИТС.Ссылка = &Ссылка
|	И рбсДоговорПодпискаИТС.ДатаНачала = &ДатаНачала";

Запрос2.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос2.УстановитьПараметр("ДатаНачала", Параметры.ДатаПодпискиИТС);
РезультатЗапроса2 = Запрос2.Выполнить();
Выборка2 = РезультатЗапроса2.Выбрать();

Если Выборка2.Следующий() Тогда
	КоличествоМесяцев=(Год(Выборка2.ДатаОкончания)-Год(Выборка2.ДатаНачала))*12+Месяц(Выборка2.ДатаОкончания)-Месяц(Выборка2.ДатаНачала)+Окр((День(Выборка2.ДатаОкончания)-День(Выборка2.ДатаНачала))/30);			
Иначе
	Сообщить("Проверьте заполнение ИТС периода");
КонецЕсли;

Иначе
Сообщить("Проверьте значение ЧасовВМес в виде договора");			
КонецЕсли;

Результат=КоличествоМесяцев*ЧасовВМес;
Исключение
Результат="Проверьте значение ЧасовВМес в виде договора и Периоды ИТС"
КонецПопытки;
Показать


Данный код проверил с помощью внешней обработке - всё сработало корректно.

Перед отправкой в функцию Выполнить делаю очистку от переносов строк и символов "|", на других примерах это срабатывало корректно:
Действие=СтрЗаменить(Выборка.Действие, "|" ," ");
			Действие=СтрЗаменить(Действие,Символ(182)," ");


После отработки функция Выполнить возвращает следующею строку (код):
Попытка Результат=""; Запрос = Новый Запрос; Запрос.Текст =  "ВЫБРАТЬ  	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора,  	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Комментарий  ИЗ  	Справочник.рбсВидыДоговоров.ЗаполнениеРеквизитовДоговора КАК рбсВидыДоговоровЗаполнениеРеквизитовДоговора  ГДЕ  	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Ссылка = &Ссылка  	И рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора.Наименование = ""ЧасовВМес""";  Запрос.УстановитьПараметр("Ссылка", Объект.ВидДоговора.Ссылка); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать();  Пока Выборка.Следующий() Цикл СтрокаКомментария=Выборка.Комментарий; ЧислоИзСтроки="";  Для Индекс = 0 По СтрДлина(СтрокаКомментария) Цикл 	Сим=Сред(СтрокаКомментария,Индекс,1); 	Если Сим>="0" и  Сим<="9" тогда 		ЧислоИзСтроки = ЧислоИзСтроки+Сим; 	КонецЕсли; КонецЦикла;   Попытка 	ЧасовВМес=Число(ЧислоИзСтроки); Исключение 	ЧасовВМес=Неопределено; 	Сообщить("Не верно задано значение ЧасовВМес в виде договора"); КонецПопытки; КонецЦикла;  Если ТипЗнч(ЧасовВМес)=Тип("Число") Тогда Запрос2 = Новый Запрос; Запрос2.Текст ="ВЫБРАТЬ  	рбсДоговорПодпискаИТС.ДатаНачала,  	рбсДоговорПодпискаИТС.ДатаОкончания  ИЗ  	Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС  ГДЕ  	рбсДоговорПодпискаИТС.Ссылка = &Ссылка  	И рбсДоговорПодпискаИТС.ДатаНачала = &ДатаНачала";  Запрос2.УстановитьПараметр("Ссылка", Объект.Ссылка); Запрос2.УстановитьПараметр("ДатаНачала", Параметры.ДатаПодпискиИТС); РезультатЗапроса2 = Запрос2.Выполнить(); Выборка2 = РезультатЗапроса2.Выбрать();  Если Выборка2.Следующий() Тогда 	КоличествоМесяцев=(Год(Выборка2.ДатаОкончания)-Год(Выборка2.ДатаНачала))*12+Месяц(Выборка2.ДатаОкончания)-Месяц(Выборка2.ДатаНачала)+Окр((День(Выборка2.ДатаОкончания)-День(Выборка2.ДатаНачала))/30);			 Иначе 	Сообщить("Проверьте заполнение ИТС периода"); КонецЕсли;  Иначе Сообщить("Проверьте значение ЧасовВМес в виде договора");			 КонецЕсли;  Результат=КоличествоМесяцев*ЧасовВМес; Исключение Результат="Проверьте значение ЧасовВМес в виде договора и Периоды ИТС" КонецПопытки;:


Судя по тому, что кроме данной строки кода ничего не выводится, то не одно из исключений не срабатывает
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. DJDUH 17 25.05.20 21:48 Сейчас в теме
(1) для
выполнить()
нуно все "строки" оборачивать двойными, а в некоторых местах и четверными кавычками!
Vladiimir; +1 Ответить
8. Vladiimir 25.05.20 22:29 Сейчас в теме
(6) И это тоже. И нужно, чтобы переменная "Результат", в которой сохраняется результат работы алгоритма, проходила сквозь весь код, от начала до конца и участвовала во всех крупных блоках. Это я понял когда разбил весь алгоритм на 2-е части и запустил по отдельности - и они выполнились, потому что в каждой был "Результат"
7. Vladiimir 25.05.20 22:27 Сейчас в теме
(1) В общем нужно, чтобы переменная "Результат", в которой сохраняется результат работы алгоритма, проходила сквозь весь код, от начала до конца и участвовала во всех крупных блоках. Это я понял когда разбил весь алгоритм на 2-е части и запустил по отдельности - и они выполнились, потому что в каждой был "Результат" Вот такой вариант сработал:
Попытка
Результат="";

Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора,
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Комментарий
|ИЗ
|	Справочник.рбсВидыДоговоров.ЗаполнениеРеквизитовДоговора КАК рбсВидыДоговоровЗаполнениеРеквизитовДоговора
|ГДЕ
|	рбсВидыДоговоровЗаполнениеРеквизитовДоговора.Ссылка = &Ссылка
|	И рбсВидыДоговоровЗаполнениеРеквизитовДоговора.РеквизитДоговора.Наименование = ""ЧасовВМес""";

Запрос.УстановитьПараметр("Ссылка", Объект.ВидДоговора.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Если ТипЗнч(Результат)=Тип("Число") Тогда
	
	Запрос2 = Новый Запрос;
	Запрос2.Текст ="ВЫБРАТЬ
	|	рбсДоговорПодпискаИТС.ДатаНачала,
	|	рбсДоговорПодпискаИТС.ДатаОкончания
	|ИЗ
	|	Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
	|ГДЕ
	|	рбсДоговорПодпискаИТС.Ссылка = &Ссылка
	|	И рбсДоговорПодпискаИТС.ДатаНачала = &ДатаНачала";
	
	Запрос2.УстановитьПараметр("Ссылка", Объект.Ссылка);
	Запрос2.УстановитьПараметр("ДатаНачала", Параметры.ДатаПодпискиИТС);
	РезультатЗапроса2 = Запрос2.Выполнить();
	Выборка2 = РезультатЗапроса2.Выбрать();
	
	Если Выборка2.Следующий() Тогда
		КоличествоМесяцев=(Год(Выборка2.ДатаОкончания)-Год(Выборка2.ДатаНачала))*12+Месяц(Выборка2.ДатаОкончания)-Месяц(Выборка2.ДатаНачала)+Окр((День(Выборка2.ДатаОкончания)-День(Выборка2.ДатаНачала))/30);			
	Иначе
		Сообщить("Проверьте заполнение ИТС периода");
	КонецЕсли;
	
Иначе
	Сообщить("Проверьте значение ЧасовВМес в виде договора");			
КонецЕсли;

Результат=КоличествоМесяцев*Результат;
Исключение
Результат="Проверьте значение ЧасовВМес в виде договора и Периоды ИТС"
КонецПопытки;
Показать
2. antz 25.05.20 18:30 Сейчас в теме
Выполнить() - зло. А что вас подвигло на ее использование? В чем задача заключается?
Serega-artem; alex-l19041; SlavaKron; Pavel Rodinchenko; ipoloskov; +5 Ответить
3. Vladiimir 25.05.20 19:56 Сейчас в теме
(2) Так сложились обстоятельства ) Я сам стажер, руководство поставило задачу и по рекомендовала способ её решения. Данным способом уже сделано много в задаче, поэтому отступать уже поздно ) Позади дед-лайн! )
4. Vladiimir 25.05.20 20:00 Сейчас в теме
(2) У меня уже получались и более сложные скрипты выполнять с помощью Выполнить(), а на этом что-то прямо застрял и не пойму в чем дело
5. Vladiimir 25.05.20 20:04 Сейчас в теме
(2) Есть справочник, который заполнен тегами и как получить значение этого тега (код, который отправляется в функцию выполнить). Данный справочник пополняемый. С помощью этих скриптов вычисляю значения тегов
9. antz 26.05.20 08:32 Сейчас в теме
(5) Сделайте реквизит справочника с типом хранилище значения, туда кладите файл внешней обработки, при выполнении вытаскивайте ее и запускайте экспортную функцию/процедуру в модуле объекта. Сберегает кучу времени и нервов, легко модифицировать и отлаживать и на переделку нужен час от силы. А руководство странное.
Vladiimir; alex-l19041; +2 Ответить
10. Vladiimir 26.05.20 12:25 Сейчас в теме
11. starik-2005 3046 27.05.20 18:53 Сейчас в теме
А что за двоеточие в конце строки?
Уберите обвязку попытки и выполните код - система покажет, где что пошло не так. Сдается мне, что Вы количество месяцев на неопределенное количество часов умножить пытаетесь.
Оставьте свое сообщение

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