Вопросы по внешним обработкам от чайника

1. user2131446 16.03.25 23:55 Сейчас в теме
Доброго вечера!
Я очень начинающая (учусь), пытаюсь разбираться сама (методом тыка и ютуба).
Прошу не судить строго)))

У меня стоит задача сделать внешнюю обработку (база учебная, не типовая).
Суть обработки: отобрать документы за определенный период.
Реализовала через запрос по кнопке Отобрать (сервер), отобразила документы в табличной части обработки + чекбоксы для выбора конкретных документов (работают).

Следующий этап - под табличной частью разместила кнопку "Перерасчет" (сервер).
При клике на нее должна (теоретически) запускаться процедура по перерасчету.
Для этого необходимо пройти по табличной части внешней обработки, отобрать документы с отмеченным чекбоксом - и пойти их перерасчитывать.
Хотела сделать это запросом - но не могу понять как обращаться к таблице внешней обработки..
По всякому ее крутила - не понимаю.
Пробовала Обращаться к табличной части внешней обработки - тоже не то, пишет

Подскажите, пожалуйста, через что писать запрос к табличной части отобранных документов? (вручную пробовала собирать запрос, но данные таблицы не обнаруживаются).
Или в чем проблема моего обращения ниже ? (пишет, что метод объекта выбрать не обнаружен:
ОтборПользователя = Объект.ПереченьДокументов.Выбрать(); 
).


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

	//заполняем выбранными документами табличную часть 
	Пока ВыборкаДокументыОказанияУслуг.Следующий() Цикл
		
		НоваяСтрока = Объект.ПереченьДокументов.Добавить();
		НоваяСтрока.Документ = ВыборкаДокументыОказанияУслуг.Документ;
		       		
	КонецЦикла;  
	
КонецПроцедуры

&НаКлиенте
Процедура Показать(Команда)
	ПоказатьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПерерасчетНаСервере()   
	
	ОтборПользователя = Объект.ПереченьДокументов.Выбрать(); 
				
	Пока ОтборПользователя.Следующий() Цикл  
		Если ОтборПользователя.Использование = Истина Тогда
			Сообщить("Нашел!")
	    КонецЕсли;	
	КонецЦикла;
	  
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
2. Bukaska 148 17.03.25 01:06 Сейчас в теме
(1) Не совсем понимаю ваш вопрос
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))

Для каждого  Стр из Объект.ПереченьДокументов  Цикл

        Если ОтборПользователя.Использование = Истина Тогда
            Сообщить("Нашел!")
        КонецЕсли;
КонецЦикла


А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
user2131446; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Bukaska 148 17.03.25 01:06 Сейчас в теме
(1) Не совсем понимаю ваш вопрос
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))

Для каждого  Стр из Объект.ПереченьДокументов  Цикл

        Если ОтборПользователя.Использование = Истина Тогда
            Сообщить("Нашел!")
        КонецЕсли;
КонецЦикла


А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
user2131446; +1 Ответить
7. starik-2005 3171 17.03.25 11:47 Сейчас в теме
(1)
Процедура ПерерасчетНаСервере()   
    
    СтруктураОтбора = Новый Структура("Использование ", Истина); // поле с флажком
    ОтборПользователя = Объект.ПереченьДокументов.НайтиСтроки(СтруктураОтбора);
    Для Каждого СтрокаТаблицы ИЗ ОтборПользователя Цикл
      //СтрокаТаблицы.Поле = ...
    КонецЦикла;
//...
Показать
user2131446; +1 Ответить
3. user2107191 17.03.25 07:16 Сейчас в теме
Либо цикл, либо НайтиСтроки

Обработки и отчёты не хранят данные в базе данных. А запросы предназначены именно для работы с базой данных.
4. Fox-trot 164 17.03.25 08:56 Сейчас в теме
(3)
Для каждого ТекущаяСтрока Из ЭтотОбъект.МояТабЧасть Цикл

такое не работает?

Обработки и отчёты не хранят данные в базе данных. А запросы предназначены именно для работы с базой данных.

все так. данные в базе, но обращаетесь к ним по списку из вашей обработки
5. user2107191 17.03.25 09:18 Сейчас в теме
(4) Ты у меня зачем спрашиваешь?
6. starik-2005 3171 17.03.25 11:44 Сейчас в теме
(5)
зачем
Он не проснулся еще )))
8. user2131446 17.03.25 23:26 Сейчас в теме
Спасибо большое, голова совсем вечером не варит - нужно было
 Для каждого Стр из Объект.ПереченьДокументов  Цикл


Но тут возникла новая проблема. Когда я пытаюсь найти и сохранить объект в переменную
	 ТЧ = Объект.ПереченьДокументов; 
	 Для Каждого ТекущаяСтрока Из ТЧ Цикл
		 Если ТекущаяСтрока.Использование = Истина Тогда  
	
			Объект = ТекущаяСтрока.Документ.ПолучитьОбъект(); 
			                                                      
		 КонецЕсли;	
	КонецЦикла;


Вылетает ошибка:

Значение не является значением объектного типа (ПолучитьОбъект)
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(46)}:Объект = ТекущаяСтрока.Документ.ПолучитьОбъект();
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(59)}:ПерерасчетНаСервере();

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]


Вроде обращение делаю как положено, но почему вылетает ошибка..?
9. user2107191 18.03.25 06:08 Сейчас в теме
(8) 1. Потому что ПолучитьОбъект можно только у ссылки. А у тебя не ссылка.
2. Потому что делаешь на Клиенте. А надо на Сервере.

Выбирай.
10. user2131446 18.03.25 09:42 Сейчас в теме
(9)
(8) 2. Потому что делаешь на Клиенте. А надо на Сервере.


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

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

&НаКлиенте
Процедура Перерасчет(Команда)
	ПерерасчетНаСервере();
КонецПроцедуры
Показать


Как я понимаю, на клиенте после нажатия кнопки запускается серверная процедура, где уже процедура выполняется сервером. Т.е. выполнение должно вестись на сервере. Или это не так?

(9)
(8) 1. Потому что ПолучитьОбъект можно только у ссылки. А у тебя не ссылка.


в табличной части у меня находятся ссылки, которые я получила из запроса к БД. Они приходят в текстовом варианте, верно?
Не совсем понимаю как тогда к ним обращаться.. через найти по ссылке?
12. user2107191 18.03.25 13:08 Сейчас в теме
(10)
Как я понимаю, на клиенте после нажатия кнопки запускается серверная процедура
Тут уж как напрограммиздить. Само по себе ничего не запускается.
Они приходят в текстовом варианте, верно?
Нет, не верно. Они приходят с типом Ссылка. Если запрос правильный, конечно.
У тебя тип колонки "Документ" в ТЧ "ПереченьДокументов" какой?
11. user2131446 18.03.25 10:05 Сейчас в теме
Я пробовала так искать ссылку:
	Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);			
		Объект = Ссылка.ПолучитьОбъект();


Но вылетает такая ошибка:

Ошибка при вызове метода контекста (НайтиПоРеквизиту)
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(53)}:Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(66)}:ПерерасчетНаСервере();

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Неверно указан реквизит
[ОшибкаИспользованияВстроенногоЯзыка]
13. LeeAreHim 18.03.25 13:57 Сейчас в теме
(11) В (9) Вы пишите, что в таблице колонка документ содержит ссылку. Зачем Вы еще раз ищете ссылку
Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
к тому же не правильно

Тут, наверное, будет
Ссылка = ТекущаяСтрока.Документ;
// и наверное так
ДокументОбъект = Ссылка.ПолучитьОбъект();
14. user2107191 18.03.25 15:14 Сейчас в теме
(13) Я в (9) ничего не пишу, не надо мне тут напраслину!
15. LeeAreHim 18.03.25 15:23 Сейчас в теме
Оставьте свое сообщение

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