Ошибка чтения значения в результате запроса

1. Алексей Мамруков (user719210) 19.05.17 08:34 Сейчас в теме
Здравствуйте!

При отладке при вычислении выражения в переменной "Результат" у всех свойств в значении написано "Ошибка чтения значения":

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


Модуль формы:
Процедура ДатаПриИзменении(Элемент)
	Объект.Сумма = Периодический.Заполнение(ЭтаФорма.Объект.Дата);
КонецПроцедуры


Программирую на 1С всего неделю, поэтому еще мало чего знаю.

Задача состоит в следующем:
- Ежемесячно какого-то числа у меня списывается какая-то сумма денег. Нужно, чтобы при открытии документа данного числа сумма автоматически вписывалась в поле. Сумму в документе можно изменять, но раз в месяц.
- Поэтому создал регистр сведений с периодичностью в пределах месяца. Все проведенные документы записываю туда, но как сравнить текущую дату с датой документа из регистра, если период всегда заполняется значением первого числа месяца (измерения регистра: Кошелек, получатель; ресурс - сумма). Подскажите, как это можно реализовать.
- И почему в запросе "ошибка чтения значения"?
На всякий случай прикрепляю базу
Прикрепленные файлы:
1Cv8.dt
Ответы
2. Алексей (Alexey_) 21 19.05.17 08:48 Сейчас в теме
(1)
"ошибка чтения значения"
на какой строке?
3. Владислав Козак (vkozak) 19.05.17 08:54 Сейчас в теме
Регистр периодический, поэтому нужно пользоваться таблицей "СрезПоследних" условие по периоду ставить в параметрах таблицы.
user719210; +1 Ответить 1
4. Алексей Мамруков (user719210) 19.05.17 08:55 Сейчас в теме
(2)
Результат = Запрос.Выполнить().Выбрать(); 

при отладке вычисляю выражение "результата" и у всех свойств в значении написано "ошибка чтения значения".
5. Алексей (Alexey_) 21 19.05.17 08:58 Сейчас в теме
(4)смотри после строки Результат.Следующий()
6. Алексей Мамруков (user719210) 19.05.17 08:59 Сейчас в теме
(3)
Спасибо, теперь результат заполняется
7. Алексей Мамруков (user719210) 19.05.17 09:05 Сейчас в теме
Пока работает правильно, только вот теперь у меня возник вопрос.
Поскольку регистр в пределах месяца, в поле период указывается первое число месяца. Т.е. сумма будет заполняться только при изменении даты документа на первое число. Как мне сделать, чтоб это можно было делать для любого числа (может быть, в запросе сделать соединение с таблицей документа и брать дату оттуда)?
8. Алекс Кон (alex-l19041) 8 19.05.17 09:15 Сейчас в теме
(7) или изменить периодичность регистра
9. Алексей Мамруков (user719210) 19.05.17 09:24 Сейчас в теме
(8)
По условию задачи сумма может меняться, период изменения - 1 месяц. Не упомянул в начале, т.к. проблема пока была в другом.
Поскольку я только начал программировать в 1с, разбираюсь во всем поэтапно.
10. Алексей Мамруков (user719210) 19.05.17 10:48 Сейчас в теме
Условие только по периоду было неправильно, подходило несколько записей. Поэтому добавил условие отбора по кошельку и получателю.
Но все еще не пойму, как мне сделать, чтоб это можно было делать для любого числа. Соединением таблицы регистра с таблицей документа в запросе или записывать еще в регистр накопления и брать дату оттуда?
Или может быть есть способ попроще и поумнее?
11. Reset Atreides (ResetAtreides) 19.05.17 11:01 Сейчас в теме
А зачем вообще период регистрации месяц, если детализация по конкретной дате нужна? Да и вообще, почему регистр сведений? Делай регистр накопления с измерениями "Кошелек" и "Получатель", ресурс "Сумма". Подозреваю, что у тебя уже даже есть подходящий:
Все проведенные документы

А при открытии документа делай запрос к оборотной таблице этого регистра за период с НачалоДня(ДобавитьМесяц(Дата, -1)) по КонецДня(ДобавитьМесяц(Дата, -1))
12. Алексей Мамруков (user719210) 19.05.17 11:17 Сейчас в теме
(11)
Периодичность регистра - месяц потому что, мне надо, чтобы сумму можно было изменить, но с периодом изменения - 1 месяц. Например, если я изменю сумму в следующем месяце , то при выборе даты мне надо будет выводить актуальное на то время значение, поэтому регистр сведений. Я подозреваю, что я неправильно начал делать.

Уточню условие задачи:
При создании документа, когда я укажу кошелек и получателя, сумма должна ввестись автоматически исходя из прошлых записей (если есть полное совпадение даты, кошелька и получателя). При изменении параметров документа сумма также вставляется автоматически, но изменить сумму можно с периодичностью 1 месяц.
13. Reset Atreides (ResetAtreides) 19.05.17 11:26 Сейчас в теме
(12) Тогда может в регистр сведений добавить измерение "ЧислоМесяца", для хранения числа и при записи ещё его заполнять? Тогда срезом последних на текущую дату, по измерениями "Кошелек", "Получатель", "ЧислоМесяца" получишь что нужно
user719210; +1 Ответить 3
14. Алексей Мамруков (user719210) 19.05.17 11:36 Сейчас в теме
(13)
Неплохая идея. Спасибо за совет.
Вашим способом я конечно же попробую сделать, но мне не нравится, что будет 2 поля с датами, хотелось бы найти еще какой-нибудь способ.
15. Reset Atreides (ResetAtreides) 19.05.17 11:38 Сейчас в теме
так не надо "ЧислоМесяца" датой делать, это должно быть число (1-31), месяц и год тут только мешать будут
16. Владислав Козак (vkozak) 19.05.17 12:37 Сейчас в теме
(13)Так нельзя делать, я про идею с числом.
Вот почему. есть запись с измерениями кошелек1, получатель1, 13, ресурс 100 периодом 01/01/2000
и запись с измерением кошелек1 получатель1, 20, ресурс 2500 периодом 13/02/2017
И делаете запрос на текущую дату, с измерениями кошелек1, получатель1, тек дата 19/05/2017 день месяца 19 по срезу последних.
Получате НОЛЬ. т.к. записи с такой комбинацией измерений нет.
Это пол беды а захотите постомреть что было 13 апреля получите вместо ожидаемых 2500 - 100.
или периодичность как минимум сутки, или если регистр подчинен регистратору периодичность документ регистратор.
17. Reset Atreides (ResetAtreides) 19.05.17 14:22 Сейчас в теме
(16)
змерениями кошелек1, получатель1, тек дата 19/05/2017 день месяца 19 по срезу последних

А ему, вроде, так и нужно
Ежемесячно какого-то числа у меня списывается какая-то сумма денег. Нужно, чтобы при открытии документа данного числа сумма автоматически вписывалась в поле

Т.е. 19 числа ничего не списывается, поэтому ничего и не выдает. а 13го апреля 100 и должно выдавать, потому что в январе он установил, что 13го числа у него списывают 100
18. Алексей Мамруков (user719210) 23.05.17 08:34 Сейчас в теме
(13)
Сделал через число месяца, потом когда дошел до следующей задачи подумал, что в запросе можно было бы использовать дату регистратора, чтоб не добавлять дополнительное измерение. Исправил, вроде бы работает.
Общий модуль:
Функция Заполнение (ТекДата,ТекКошелек, ТекПолучатель) Экспорт
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПериодическийРасходСрезПоследних.Период КАК Период,
		|	ПериодическийРасходСрезПоследних.Кошелек КАК Кошелек,
		|	ПериодическийРасходСрезПоследних.Получатель КАК Получатель,
		|	ПериодическийРасходСрезПоследних.Сумма КАК Сумма,
		|	ПериодическийРасходСрезПоследних.Регистратор.Дата КАК РегистраторДата
		|ИЗ
		|	РегистрСведений.ПериодическийРасход.СрезПоследних(
		|			&Дата,
		|			Кошелек = &Кошелек
		|				И Получатель = &Получатель) КАК ПериодическийРасходСрезПоследних";
		Запрос.УстановитьПараметр("Дата", ТекДата);
		Запрос.УстановитьПараметр("Кошелек", ТекКошелек);
		Запрос.УстановитьПараметр("Получатель", ТекПолучатель);
		Результат = Запрос.Выполнить().Выбрать();
		Пока Результат.Следующий() Цикл
			Если День(Результат.РегистраторДата) = День(ТекДата) Тогда
		 		 Возврат (Результат.Сумма);
			КонецЕсли;
		КонецЦикла;
	КонецФункции
...Показать Скрыть


Модуль формы:
Процедура ДатаПриИзменении(Элемент)
	Объект.Сумма = ПериодическийРасход.Заполнение(Объект.Дата,Объект.КошелекОтправления, Объект.Получатель);
КонецПроцедуры
19. Иван Тюриков (tjurikov_ivan) 69 23.05.17 08:56 Сейчас в теме
(18)И все же думаю для этой задачи лучше использовать регистр накопления:
1. Что будет если у вас два документа на разные суммы за один день? Если я например добавил себе в том месяце на 30 число расход 500р а в это месяце хочу добавить еще 500р. Мне придется искать тот документ и редактировать? Мне будет проще завести новый с новой суммой или например когда я хочу убавить свой расход мне придется искать тот документ редактировать его или удалять, когда я могу просто ввести документ (сторно) с отрицательной суммой.
2. Из п.1 выходит, что в результате запроса к регистру сведений у меня будет не одна строка и ваш цикл выборки записей запроса не подойдет, т.к. нужно суммировать расходы за день. Придется в цикле перебирать записи регистра и складывать.
3.Но зачем изобретать велосипед, если это уже есть в регистрах накопления.
-Записываете в него документы
-получаете обороты за период (нужный день)
-Он сам все складывает выдает одну цифру
Можно даже без запроса обойтись функцией "Обороты"

Если конечно я понял суть задания
20. Reset Atreides (ResetAtreides) 23.05.17 09:49 Сейчас в теме
(18) Не уверен, что у тебя срез последних в таком случае корректно отрабатывает. Если у тебя будет несколько подходящих записей, то фактически выберется первая попавшаяся. Я бы не сказал, что метод оптимизировал, скорее наоборот. Механизм среза последних работает не по назначению и последующая выборка из результата запроса вместо однозначного определения
Оставьте свое сообщение