Вопросы по внешним обработкам от чайника
Доброго вечера!
Я очень начинающая (учусь), пытаюсь разбираться сама (методом тыка и ютуба).
Прошу не судить строго)))
У меня стоит задача сделать внешнюю обработку (база учебная, не типовая).
Суть обработки: отобрать документы за определенный период.
Реализовала через запрос по кнопке Отобрать (сервер), отобразила документы в табличной части обработки + чекбоксы для выбора конкретных документов (работают).
Следующий этап - под табличной частью разместила кнопку "Перерасчет" (сервер).
При клике на нее должна (теоретически) запускаться процедура по перерасчету.
Для этого необходимо пройти по табличной части внешней обработки, отобрать документы с отмеченным чекбоксом - и пойти их перерасчитывать.
Хотела сделать это запросом - но не могу понять как обращаться к таблице внешней обработки..
По всякому ее крутила - не понимаю.
Пробовала Обращаться к табличной части внешней обработки - тоже не то, пишет
Подскажите, пожалуйста, через что писать запрос к табличной части отобранных документов? (вручную пробовала собирать запрос, но данные таблицы не обнаруживаются).
Или в чем проблема моего обращения ниже ? (пишет, что метод объекта выбрать не обнаружен: ).
Я очень начинающая (учусь), пытаюсь разбираться сама (методом тыка и ютуба).
Прошу не судить строго)))
У меня стоит задача сделать внешнюю обработку (база учебная, не типовая).
Суть обработки: отобрать документы за определенный период.
Реализовала через запрос по кнопке Отобрать (сервер), отобразила документы в табличной части обработки + чекбоксы для выбора конкретных документов (работают).
Следующий этап - под табличной частью разместила кнопку "Перерасчет" (сервер).
При клике на нее должна (теоретически) запускаться процедура по перерасчету.
Для этого необходимо пройти по табличной части внешней обработки, отобрать документы с отмеченным чекбоксом - и пойти их перерасчитывать.
Хотела сделать это запросом - но не могу понять как обращаться к таблице внешней обработки..
По всякому ее крутила - не понимаю.
Пробовала Обращаться к табличной части внешней обработки - тоже не то, пишет
Подскажите, пожалуйста, через что писать запрос к табличной части отобранных документов? (вручную пробовала собирать запрос, но данные таблицы не обнаруживаются).
Или в чем проблема моего обращения ниже ? (пишет, что метод объекта выбрать не обнаружен:
ОтборПользователя = Объект.ПереченьДокументов.Выбрать();
&НаСервере
Процедура ПоказатьНаСервере()
//отбираем проведенные документы оказания услуг за выбранный период
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОказаниеУслуги.Ссылка КАК Документ
|ИЗ
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
|ГДЕ
| ОказаниеУслуги.Дата МЕЖДУ &НачалоПериода И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
| И ОказаниеУслуги.Проведен = ИСТИНА";
Запрос.УстановитьПараметр("НачалоПериода", Объект.Период.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода", Объект.Период.ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
//ТЗ = РезультатЗапроса.Выгрузить();
ВыборкаДокументыОказанияУслуг = РезультатЗапроса.Выбрать();
//заполняем выбранными документами табличную часть
Пока ВыборкаДокументыОказанияУслуг.Следующий() Цикл
НоваяСтрока = Объект.ПереченьДокументов.Добавить();
НоваяСтрока.Документ = ВыборкаДокументыОказанияУслуг.Документ;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Показать(Команда)
ПоказатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПерерасчетНаСервере()
ОтборПользователя = Объект.ПереченьДокументов.Выбрать();
Пока ОтборПользователя.Следующий() Цикл
Если ОтборПользователя.Использование = Истина Тогда
Сообщить("Нашел!")
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Ворчание старого чайника
- Нейросеть для прогнозирования: универсальная обработка и методика для любой конфигурации. Примеры прогнозирования бизнес процессов
- Практика доступа в базу 1С через протокол oData. Чтение данных
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Расширяемый фреймворк на 1С, или Нюансы натягивания совы на глобус
Найденные решения
(1) Не совсем понимаю ваш вопрос
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))
А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))
Для каждого Стр из Объект.ПереченьДокументов Цикл
Если ОтборПользователя.Использование = Истина Тогда
Сообщить("Нашел!")
КонецЕсли;
КонецЦикла
А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Не совсем понимаю ваш вопрос
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))
А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
Если вы уже собрали список документов? Он у вас на форме? Форма не закрыта?
Пока форма жива и там данные, но вы их не записали? Я бы прошлась стандартным циклом для каждого МойДок из Объект, МояТЧ, цикл в форме обработки. Но клиент, сервер думаю вам не надо пояснять)))
Для каждого Стр из Объект.ПереченьДокументов Цикл
Если ОтборПользователя.Использование = Истина Тогда
Сообщить("Нашел!")
КонецЕсли;
КонецЦикла
А выборка.Следующий() это больше для запросов. А так для ТЧ вроде всегда как таковой цикл был, что выше)))
(1)
Процедура ПерерасчетНаСервере()
СтруктураОтбора = Новый Структура("Использование ", Истина); // поле с флажком
ОтборПользователя = Объект.ПереченьДокументов.НайтиСтроки(СтруктураОтбора);
Для Каждого СтрокаТаблицы ИЗ ОтборПользователя Цикл
//СтрокаТаблицы.Поле = ...
КонецЦикла;
//...
Показать
(3)
такое не работает?
все так. данные в базе, но обращаетесь к ним по списку из вашей обработки
Для каждого ТекущаяСтрока Из ЭтотОбъект.МояТабЧасть Цикл
такое не работает?
Обработки и отчёты не хранят данные в базе данных. А запросы предназначены именно для работы с базой данных.
все так. данные в базе, но обращаетесь к ним по списку из вашей обработки
Спасибо большое, голова совсем вечером не варит - нужно было
Но тут возникла новая проблема. Когда я пытаюсь найти и сохранить объект в переменную
Вылетает ошибка:
Вроде обращение делаю как положено, но почему вылетает ошибка..?
Для каждого Стр из Объект.ПереченьДокументов Цикл
Но тут возникла новая проблема. Когда я пытаюсь найти и сохранить объект в переменную
ТЧ = Объект.ПереченьДокументов;
Для Каждого ТекущаяСтрока Из ТЧ Цикл
Если ТекущаяСтрока.Использование = Истина Тогда
Объект = ТекущаяСтрока.Документ.ПолучитьОбъект();
КонецЕсли;
КонецЦикла;
Вылетает ошибка:
Значение не является значением объектного типа (ПолучитьОбъект)
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(46)}:Объект = ТекущаяСтрока.Документ.ПолучитьОбъект();
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(59)}:ПерерасчетНаСервере();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(46)}:Объект = ТекущаяСтрока.Документ.ПолучитьОбъект();
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(59)}:ПерерасчетНаСервере();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
Вроде обращение делаю как положено, но почему вылетает ошибка..?
(9)
Процедура у меня прописана так:
Как я понимаю, на клиенте после нажатия кнопки запускается серверная процедура, где уже процедура выполняется сервером. Т.е. выполнение должно вестись на сервере. Или это не так?
(9)
в табличной части у меня находятся ссылки, которые я получила из запроса к БД. Они приходят в текстовом варианте, верно?
Не совсем понимаю как тогда к ним обращаться.. через найти по ссылке?
(8) 2. Потому что делаешь на Клиенте. А надо на Сервере.
Процедура у меня прописана так:
&НаСервере
Процедура ПерерасчетНаСервере()
//проходим по всем документам, выбранным пользователем для перерасчета
ТЧ = Объект.ПереченьДокументов;
Для Каждого ТекущаяСтрока Из ТЧ Цикл
Если ТекущаяСтрока.Использование = Истина Тогда
Объект = ТекущаяСтрока.Документ.ПолучитьОбъект();
//Скидка = РаботаСРегистрамиСведений.РасчетРазмераСкидкиДляКлиента(Объект.Дата, Объект.Клиент);
//ТекущаяСтрока.Документ.Записать(РежимЗаписиДокумента.Запись)
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Перерасчет(Команда)
ПерерасчетНаСервере();
КонецПроцедуры
ПоказатьКак я понимаю, на клиенте после нажатия кнопки запускается серверная процедура, где уже процедура выполняется сервером. Т.е. выполнение должно вестись на сервере. Или это не так?
(9)
(8) 1. Потому что ПолучитьОбъект можно только у ссылки. А у тебя не ссылка.
в табличной части у меня находятся ссылки, которые я получила из запроса к БД. Они приходят в текстовом варианте, верно?
Не совсем понимаю как тогда к ним обращаться.. через найти по ссылке?
(10)
У тебя тип колонки "Документ" в ТЧ "ПереченьДокументов" какой?
Как я понимаю, на клиенте после нажатия кнопки запускается серверная процедура
Тут уж как напрограммиздить. Само по себе ничего не запускается.
Они приходят в текстовом варианте, верно?
Нет, не верно. Они приходят с типом Ссылка. Если запрос правильный, конечно.
У тебя тип колонки "Документ" в ТЧ "ПереченьДокументов" какой?
Я пробовала так искать ссылку:
Но вылетает такая ошибка:
Ошибка при вызове метода контекста (НайтиПоРеквизиту)
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(53)}:Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(66)}:ПерерасчетНаСервере();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Неверно указан реквизит
[ОшибкаИспользованияВстроенногоЯзыка]
Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
Объект = Ссылка.ПолучитьОбъект();
Но вылетает такая ошибка:
Ошибка при вызове метода контекста (НайтиПоРеквизиту)
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(53)}:Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
{ВнешняяОбработка.воПерерасчетСкидки.Форма.Форма.Форма(66)}:ПерерасчетНаСервере();
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Неверно указан реквизит
[ОшибкаИспользованияВстроенногоЯзыка]
(11) В (9) Вы пишите, что в таблице колонка документ содержит ссылку. Зачем Вы еще раз ищете ссылку
Тут, наверное, будет
Ссылка = Документы.ОказаниеУслуги.НайтиПоРеквизиту("Ссылка", ТекущаяСтрока.Документ);
к тому же не правильно
Тут, наверное, будет
Ссылка = ТекущаяСтрока.Документ;
// и наверное так
ДокументОбъект = Ссылка.ПолучитьОбъект();
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот