Работа с формами

1. user719210 22.05.17 10:17 Сейчас в теме
Добрый день.

Есть документ ПериодическиеСписания (реквизиты: Сумма, Получатель, Отправитель)
Мне нужно, чтобы при создании или редактировании документа, при выборе даты, открывалась форма выбора, содержащая все документы на выбранное число.

При изменении даты открываю форму выбора, но она содержит все документы.
Как ограничить форму нужными данными?
И как при выборе документа, перенести его данные в поля формы документа?
Если можно, попонятнее, чтоб мне как новичку было проще разобраться. Читал книжку Радченко, но разобраться как это сделать не смог. Помогите пожалуйста.

Процедура ДатаПриИзменении(Элемент)
    Форма = ПолучитьФорму("Документ.ПериодическиеСписания.ФормаВыбора",,ЭтаФорма);
    Форма.Открыть();
	
КонецПроцедуры
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. lefthander 22.05.17 10:52 Сейчас в теме
(1)Если Форма Выбора у вас на основе динамического списка, то у списка есть реквизит - отбор. Вот в него и передайте отбор по дате в списке

ДатаОтбора  = Элемент.Значение;
Отбор = Новый Структура;
Отбор.Вставить("Дата", ДатаОтбора  );

Форма = ПолучитьФорму("Документ.ПериодическиеСписания.ФормаВыбора",Отбор,ЭтаФорма);


При создании формы выбора в параметрах будет отборПоДата, с датой, ее и используйте для отбора

Что то типа
в процедуре присозданиинасервере

	Если Параметры.Отбор.Свойство("Дата") Тогда
		ОтборПодате = Параметры.Отбор.ДатаОтбора;
	КонецЕсли;



Примерно так.
Код не проверял, писал по памяти, но надеюсь мысль понятна
Vitaly1C8; user719210; +2
6. user719210 22.05.17 11:00 Сейчас в теме
(5)
ФормаДокумента:
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	ДатаОтбора  = Элемент.Значение;
	Отбор = Новый Структура;
	Отбор.Вставить("Дата", ДатаОтбора  );
	Форма = ПолучитьФорму("Документ.ПериодическиеСписания.ФормаВыбора",Отбор,ЭтаФорма);
КонецПроцедуры


ФормаВыбора:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Отбор.Свойство("Дата") Тогда
		ОтборПодате = Параметры.Отбор.ДатаОтбора;
	КонецЕсли;
КонецПроцедуры


Выдает ошибку "Поле объекта не обнаружено (Значение)
ДатаОтбора = Элемент.Значение;"
+
7. lefthander 22.05.17 11:06 Сейчас в теме
(6)Ну да, посмотрите в отладчике чему равен Элемент формы дата при изменении
ЗЫ я же говорю, код писал с памяти, без проверки в 1С, мог где то напутать... Я Вам показал путь...
Что то типа ДотаОтбора = Объект.Дата
Это если Дата реквизит объекта.
+
8. user719210 22.05.17 11:18 Сейчас в теме
(7)
Попробовал написать вот-так
ДатаОтбора = ЭтаФорма.Объект.Дата;
в ДатаОтбора в отладчике теперь записывается дата, которую я выбрал, но после этого форма выбора не открывается
+
9. lefthander 22.05.17 11:21 Сейчас в теме
(8)Добавьте Форма.Открыть();
после Форма = ПолучитьФОРМУ....
user719210; +1
14. user719210 22.05.17 11:44 Сейчас в теме
(9)
Добавьте Форма.Открыть();

Теперь форма открывается, но также со всеми значениями, без отбора
+
2. Biilsun 22.05.17 10:28 Сейчас в теме
Примера под рукой нет, при открытии формы можно наложить отбор (в типовых пример есть, или гуглиться), при выборе элемента есть получить результат подбора
+
3. BackinSoda 22.05.17 10:34 Сейчас в теме
Отбор установить можно примерно так:
Форма.ДокументСписок.Отбор.Организация.Значение = Организация;
+
4. PhoenixAOD 62 22.05.17 10:37 Сейчас в теме
как то так
СправочникСписок.Отбор.Сбросить();
      

    СправочникСписок.Отбор.статус.ВидСравнения=ВидСравнения.Содержит;
      

    СправочникСписок.Отбор.Статус.Значение="Принята";
      

    СправочникСписок.Отбор.Статус.Установить(); 
Показать
+
10. ResetAtreides 22.05.17 11:28 Сейчас в теме
ИМХО, что-то неправильное в методологии. Вам лучше механизм "ввод на основании" использовать
+
11. user719210 22.05.17 11:40 Сейчас в теме
(10)
ну может быть я неправильно понял как это сделать, а задача была приблизительно в следующем:
При наличии нескольких проведенных документов в 1 день, давать пользователю возможность выбрать одну из них
+
20. Biilsun 22.05.17 16:52 Сейчас в теме
(11)
ну может быть я неправильно понял как это сделать, а задача была приблизительно в следующем:
При наличии нескольких проведенных документов в 1 день, давать пользователю возможность выбрать одну из них


Смотри типовые, там это повсюду, не надо велосипед изобретать, это вполне нормально когда например подбираем документ взаиморасчетов или заказ с отбором по контрагенту или договору
+
12. user719210 22.05.17 11:42 Сейчас в теме
Я просто подумал, что надо реализовывать это так, хотя была еще идея создать на форме табличную часть, в которой будут записаны проведенные документы на выбранную дату. Ну и сделать, чтобы табличная часть становилась видимая при наличии больше 1 документа. Но я подумал, что это сделать сложнее, чем с формой выбора, поэтому решил пробовать через форму выбора. Через табличную часть думал тоже попробовать для саморазвития, но позже.
+
13. ResetAtreides 22.05.17 11:44 Сейчас в теме
(12) а общий-то смысл какой? Создать новый документ, заполнить его на основании уже существующего, что-то подкорректировать и записать? Это и есть типовой метод "ввод на основании"
+
15. user719210 22.05.17 11:50 Сейчас в теме
(13)
Постараюсь объяснить:
У меня есть Кошельки, у них есть периодические поступления и расходы. Например, каждый месяц 10 числа, на конкретный кошелек поступает конкретная сумма денег (или списывается). Сумму документа можно изменять с периодичностью в пределах месяца. При наличии нескольких списаний (поступлений) в одну дату нужно давать пользователю выбор.
Может быть для системы такое, впринципе, делать не надо, но поскольку я только учусь, выполняю такое задание, чтоб научиться работать с подобными вещами.
Надеюсь, что смог объяснить более понятно.
+
16. ResetAtreides 22.05.17 11:57 Сейчас в теме
(15) Насколько помню, под это дело у тебя был назначен периодический регистр сведений. Т.е. планировал получать последнее изменение. Т.е. выбор не подразумевался и данные можно было непосредственно из регистра брать. А эта задача, вроде, конфликтует с созданным..
ну если для обучения, то лучше все таки сделай отдельную кнопку "Заполнить из документа", а не при изменении даты или ещё каких-то реквизитов, т.к. в принципе это не связанные объекты. А дальше нужно смотреть какой у тебя интерфейс, обычный или управляемый. Там методы разные. Пока форму-то с отбором ты откроешь, но дальнейшей обработки у тебя нигде нет
user719210; +1
17. user719210 22.05.17 12:05 Сейчас в теме
(16)
Пока форму-то с отбором ты откроешь, но дальнейшей обработки у тебя нигде нет

Ну это да, это я думал делать после того, как, хотя бы, смогу отобрать нужные значения.

А дальше нужно смотреть какой у тебя интерфейс, обычный или управляемый.

Интерфейс управляемый

то лучше все таки сделай отдельную кнопку "Заполнить из документа", а не при изменении даты или ещё каких-то реквизитов

Ну можно сделать и так, только мне надо, чтобы выбор зависел от даты, например при открытии документа 5 числа, при нажатии на кнопку, я должен видеть только документы проведенные 5 числа.
+
18. ResetAtreides 22.05.17 12:19 Сейчас в теме
(17)
я должен видеть только документы проведенные 5 числа

Пятого числа любого месяца? Тут скорее всего обычным отбором не отделаешься, либо перед открытием придется формировать список всех дат с этим числом, а т.к. в принципе это бесконечный ряд, то решение не айс. Я бы сделал отдельную форму выбора с динамическим списком,в который в качестве параметра передается нужный день месяца. Параметр передавать через дополнительные параметры формы.
+
19. user719210 22.05.17 13:42 Сейчас в теме
(18)
Да любого. Буду думать насчет отдельной формы, пока не знаю, как это сделать. С формами у меня не очень хорошо покаю
+
21. user719210 23.05.17 06:53 Сейчас в теме
(16)
Решил сделать с кнопкой. Чтобы при нажатии на кнопку открывалась форма выбора с соответствующими дате документами.

Форма документа:
&НаКлиенте
Процедура КомандаВыбрать(Команда)      
	  ДатаОтбора  = ЭтаФорма.Объект.Дата;      
	  Отбор = Новый Структура;      
	  Отбор.Вставить("Дата", ДатаОтбора);      
	  Форма = ПолучитьФорму("Документ.ПериодическиеСписания.ФормаВыбора",Отбор,ЭтаФорма);       
	  Форма.Открыть();      	  
КонецПроцедуры


Форма выбора:

&НаКлиенте 
Процедура ПриОткрытии(Отказ)
 ДатаОтбора = Параметры.Отбор.Дата;
 ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("Дата");
 ЭлементОтбора.Использование    = Истина;
 ЭлементОтбора.ВидСравнения     = ВидСравненияКомпоновкиДанных.Равно;
 ЭлементОтбора.ПравоеЗначение   = ДатаОтбора;
КонецПроцедуры
Показать


Что-то я опять делаю не так.
Пробовал в начале в форме выбора так как посоветовали в (5) посте, но не понял зачем ОтборПоДате, где его дальше использовать.
 Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)      
      Если Параметры.Отбор.Свойство("Дата") Тогда          
            ОтборПоДате = Параметры.Отбор.ДатаОтбора;
      КонецЕсли;
КонецПроцедуры
+
22. ResetAtreides 23.05.17 10:12 Сейчас в теме
Вот, например, про передачу параметров в форму:
https://infostart.ru/public/86853
Ещё раз упомяну, что таким образом (21) у тебя будет отбор по конкретной дате, а не числу месяца
+
23. user719210 23.05.17 10:28 Сейчас в теме
(22)
уже дошел вот до этого

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


форма выбора:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)      
 Если Параметры.МойОтбор.Свойство("Дата") Тогда          
    ОтборПоДате = Параметры.МойОтбор.Дата;	
 	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 	ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("Дата");
 	ЭлементОтбора.Использование    = Истина;
 	ЭлементОтбора.ВидСравнения     = ВидСравненияКомпоновкиДанных.Равно;
	Элементы.Список.Период.ДатаНачала = НачалоДня(ОтборПоДате);
	Элементы.Список.Период.ДатаОкончания = КонецДня(ОтборПоДате);
 	ЭлементОтбора.ПравоеЗначение   = ОтборПоДате;
 КонецЕсли;
КонецПроцедуры
Показать


Проблема сейчас в том, что отображается только та запись, из которой была нажата кнопка выбрать
+
24. ResetAtreides 23.05.17 10:36 Сейчас в теме
(23) Ну у тебя вид сравнения "ВидСравненияКомпоновкиДанных.Равно", так что логично. А ты, похоже, хочешь "ВидСравнения.Интервал" использовать. Только настраиваешь как-то странно
user719210; +1
25. user719210 23.05.17 10:56 Сейчас в теме
(24)
В итоге (с помощью) оставил только в форме документа процедуру. Все работает
&НаКлиенте    
Процедура КомандаВыбрать(Команда)
    
    ПараметрыФормы = Новый Структура;
    
    Настройки = Новый НастройкиКомпоновкиДанных;
    
    ЭлементОтбораДатаНачала                      = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаНачала.ЛевоеЗначение      = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
    ЭлементОтбораДатаНачала.Использование      = Истина;
    
    ЭлементОтбораДатаОкончания                  = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаОкончания.ВидСравнения      = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
    ЭлементОтбораДатаОкончания.Использование  = Истина;
    
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
    
    ОткрытьФорму("Документ.ПериодическиеСписания.ФормаВыбора",ПараметрыФормы,ЭтаФорма);
        
КонецПроцедуры
Показать
+
26. user719210 24.05.17 08:11 Сейчас в теме
Добрый день, форма выбора теперь отбирает нужные значения, но теперь не могу понять, как вернуть их в поля формы документа.

в форме документа все та-же процедура:
&НаКлиенте    
Процедура КомандаВыбрать(Команда)
    
    ПараметрыФормы = Новый Структура;
    
    Настройки = Новый НастройкиКомпоновкиДанных;
    
    ЭлементОтбораДатаНачала                      = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаНачала.ЛевоеЗначение      = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
    ЭлементОтбораДатаНачала.Использование      = Истина;
    
    ЭлементОтбораДатаОкончания                  = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаОкончания.ВидСравнения      = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
    ЭлементОтбораДатаОкончания.Использование  = Истина;
    
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
    
    ОткрытьФорму("Документ.ПериодическиеСписания.ФормаВыбора",ПараметрыФормы,ЭтаФорма);
        
КонецПроцедуры
Показать


А вот на форме выбора я что-то делаю не так видимо:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	ЗначениеВыбора = Новый Структура;
	ЗначениеВыбора.Вставить("Дата", ЭтаФорма.Объект.Дата);
	ЗначениеВыбора.Вставить("Получатель", ЭтаФорма.Объект.Получатель);
	ЗначениеВыбора.Вставить("Сумма", ЭтаФорма.Объект.Сумма);
	ЗначениеВыбора.Вставить("Кошелек", ЭтаФорма.Объект.КошелекОтправления);	
	ОповеститьОВыборе(ЗначениеВыбора);	
КонецПроцедуры
Показать


Отладчик при выборе элемента, в процедуру даже не залазит (событие привязано к форме)
+
27. user719210 24.05.17 08:19 Сейчас в теме
Хмм, или процедуру надо вставлять на в модуль формы выбора, в модуль формы документа? попробовал, хоть что-то делает, хотя вообще не то, что надо
+
28. madonov 200 24.05.17 08:22 Сейчас в теме
Форме документа нужно обработать событие ОбработкаВыбора.

1. Вызываешь форму выбора
2. Выбираешь, оповещаешь о выборе форму документа через ОповеститьОВыборе(ЗначениеВыбора)
3. Перехватываешь это значение в событии формы документа ОбработкаВыбора

Наверное так. Могу ошибаться - давно не писал на УФ, на работе все на обычных.
+
29. user719210 24.05.17 08:24 Сейчас в теме
(28)
Да, уже понял что там, как вот теперь значения с результата выбора вставить в поля на форме документа.
+
30. madonov 200 24.05.17 08:26 Сейчас в теме
(29)
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
      Реквизит = ВыбранноеЗначение;
КонецПроцедуры


не работает?
+
33. user719210 24.05.17 08:35 Сейчас в теме
(30)
А как мне в 4 реквизита записать?
Если пишу просто выбранное значение, то
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    ЭтаФорма.Объект.Дата = ВыбранноеЗначение;
	ЭтаФорма.Объект.КошелекОтправления = ВыбранноеЗначение;
	ЭтаФорма.Объект.Получатель = ВыбранноеЗначение;
	ЭтаФорма.Объект.Сумма = ВыбранноеЗначение;
КонецПроцедуры


В отладчике в выбранное значение записывается документ "Периодические списания 000000001 от 22.05.2017 13:05:31"
а если пишу например
ЭтаФорма.Объект.Сумма = ВыбранноеЗначение.Сумма;
то выдает ошибку "поле объекта не обнаружено (Сумма)
+
34. ResetAtreides 24.05.17 08:43 Сейчас в теме
(33)
А как мне в 4 реквизита записать?

Верни структуру. А учитывая, что у тебя приемник и источник одного типа, используй "ЗаполнитьЗначениеСвойств(Объект, ВыбранноеЗначение)"
И не надо "ЭтоФорма.Объект" использовать, обычно просто "Объект" достаточно, скорее всего и просто имени реквизита у тебя хватит
+
35. user719210 24.05.17 08:45 Сейчас в теме
(34)
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	ЗначениеВыбора = Новый Структура;
	ЗначениеВыбора.Вставить("Дата", ВыбранноеЗначение.Дата);
	ЗначениеВыбора.Вставить("Получатель", ВыбранноеЗначение.Получатель);
	ЗначениеВыбора.Вставить("Сумма", ВыбранноеЗначение.Сумма);
	ЗначениеВыбора.Вставить("Кошелек", ВыбранноеЗначение.КошелекОтправления);
	Дата = ЗначениеВыбора.Дата;
	КошелекОтправления = ЗначениеВыбора.Кошелек;
	Получатель = ЗначениеВыбора.Получатель;
	Сумма = ЗначениеВыбора.Сумма;
КонецПроцедуры
Показать

С "ЗаполнитьЗначениеСвойств(Объект, ВыбранноеЗначение)" чуть-чуть не понял, щас почитаю, попробую
+
31. user719210 24.05.17 08:27 Сейчас в теме
Хмм, сейчас попробую
+
32. madonov 200 24.05.17 08:31 Сейчас в теме
Если нужно не сам документ, а его реквизиты куда-то подставить то:

Сумма= ВыбранноеЗначение.Сумма;
Получатель = ВыбранноеЗначение.Получатель;
Отправитель = ВыбранноеЗначение.Отправитель ;
+
36. user719210 24.05.17 09:06 Сейчас в теме
что-то не могу разобраться. В качестве объекта, должна быть форма выбора?
+
37. ResetAtreides 24.05.17 10:38 Сейчас в теме
В качестве объекта должна быть коллекция значений, в данном случае сам документ - "ДокументОбъект.ПериодическиеСписания", т.е. в твоем случае просто "Объект"
+
38. user719210 24.05.17 10:53 Сейчас в теме
Читал, читал и решил все переделать.

На форме выбора сделал кнопку выбрать, пробую реализовать через "закрыть"

&НаКлиенте
Процедура Выбрать(Команда)
	ВыбранноеЗначение = Новый Структура;
	ВыбранноеЗначение.Вставить("Получатель", Элементы.Список.ТекущаяСтрока);
	ВыбранноеЗначение.Вставить("Сумма", Элементы.Сумма);
	ВыбранноеЗначение.Вставить("Кошелек", Элементы.КошелекОтправления);	
	Закрыть(ВыбранноеЗначение);	
КонецПроцедуры


на форме документа решил сделать так, что при изменении даты, открывается форма с документами, проведенными в этот день (т.е. просто вместо кнопки пересунул на Датаприизменении)

Возникла проблема с Закрыть
Процедура при изменении даты:
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	Объект.Сумма = ПериодическийРасход.Заполнение(Объект.Дата,Объект.КошелекОтправления, Объект.Получатель);	
	ПараметрыФормы = Новый Структура;
    Настройки = Новый НастройкиКомпоновкиДанных;
    
    ЭлементОтбораДатаНачала                      = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаНачала.ЛевоеЗначение      = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
    ЭлементОтбораДатаНачала.Использование      = Истина;
    
    ЭлементОтбораДатаОкончания                  = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Дата");
    ЭлементОтбораДатаОкончания.ВидСравнения      = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
    ЭлементОтбораДатаОкончания.Использование  = Истина;
    
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
   Закрытиее = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
    ОткрытьФорму("Документ.ПериодическиеСписания.ФормаВыбора",ПараметрыФормы,ЭтаФорма,,,,Закрытиее);    

КонецПроцедуры
Показать


В этой же форме процедура ОписаниеЗакрытия, которая используется в ОписаниеОповещения, не могу понять, что в ней надо писать и какие параметры указывать?

&НаКлиенте
Процедура ОписаниеЗакрытия(Результат,Параметры) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") Тогда 
Результат = Результат.Значение; 
КонецЕсли;	
КонецПроцедуры
+
39. user719210 24.05.17 11:55 Сейчас в теме
(38)
Исправил вроде команду выбрать
&НаКлиенте
Процедура Выбрать(Команда)
	ВыбранноеЗначение = Новый Структура;
	ВыбранноеЗначение.Вставить("Получатель",Элементы.Список.ТекущиеДанные.Получатель);
	ВыбранноеЗначение.Вставить("Сумма", Элементы.Список.ТекущиеДанные.Сумма);
	ВыбранноеЗначение.Вставить("Кошелек", Элементы.Список.ТекущиеДанные.КошелекОтправления);	
	Закрыть(ВыбранноеЗначение);	
КонецПроцедуры
+
40. user719210 24.05.17 12:15 Сейчас в теме
Как теперь перенести значения на форму документа, которые возвращаются из процедуры Выбрать в структуре "ВыбранноеЗначение"?
+
41. user719210 24.05.17 12:29 Сейчас в теме
Опять пришлось переделать, т.к. если выбрать значение двойным кликом, то просто выходило с формы. Убрал кнопку сделал событие "ВыборЗначения".

&НаКлиенте
Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	ВыбранноеЗначение = Новый Структура;
	ВыбранноеЗначение.Вставить("Получатель",Элементы.Список.ТекущиеДанные.Отправитель);
	ВыбранноеЗначение.Вставить("Сумма", Элементы.Список.ТекущиеДанные.Сумма);
	ВыбранноеЗначение.Вставить("Кошелек", Элементы.Список.ТекущиеДанные.КошелекПоступления);	
	Закрыть(ВыбранноеЗначение);
КонецПроцедуры
+
42. user719210 25.05.17 05:28 Сейчас в теме
Все, почти доделал. Осталась последняя проблема

Сделал не так, как хотел изначально (т.к. понял, что это не совсем правильно) Объясню работу сначала,
Есть документы РасходДенежныхСредств, ПериодическиеСписания и регистр сведений ПериодическийРасход (в пределах месяца).
Мне нужно, чтобы при создании (редактировании) документов РасходДенежныхСредств, при изменении даты открывалось окно выбора проведенных документов ПериодическиеСписания и при выборе строки, ее данные вносились в форму создания (редактирования) документа РасходДенежныхСредств.
Я сделал все это, только без регистра сведений. При изменении даты открывается форма выбора документа ПериодическиеСписания, выбираю оттуда строку и ее данные вбиваются в форму документа.
Мне надо сделать тоже самое только с регистром сведений, т.к. если много документов не проведено, программа будет перебирать все документы, думаю так делать не разумно.
Не получается это сделать с регистром сведений, т.к. там открывается та же форма списка, только с отбором по дате.

КОД:
Форма документа РасходДенежныхСредств
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)	
	ПараметрыФормы = Новый Структура;
    Настройки = Новый НастройкиКомпоновкиДанных;
    
    ЭлементОтбораДатаНачала                   = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаНачала.ЛевоеЗначение     = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
    ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
    ЭлементОтбораДатаНачала.Использование     = Истина;
    
    ЭлементОтбораДатаОкончания                = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
    ЭлементОтбораДатаОкончания.ВидСравнения   = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
    ЭлементОтбораДатаОкончания.Использование  = Истина;
    
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
	Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
    ОткрытьФорму("РегистрСведений.ПериодическийРасход.ФормаСписка",ПараметрыФормы,ЭтаФорма,,,,Закрытие); 
КонецПроцедуры

&НаКлиенте
Процедура ОписаниеЗакрытия(Результат,Параметры) экспорт 
	Если ТипЗнч(Результат) = Тип("Структура") Тогда
		Объект.КошелекОтправления = Результат.КошелекОтправления; 
		Объект.Сумма = Результат.Сумма;
		Объект.Получатель = Результат.Получатель;
		Объект.Комментарий = "";
	КонецЕсли;
КонецПроцедуры

Показать


Форма списка регистра сведений:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ВыбранноеЗначение = Новый Структура;
	ВыбранноеЗначение.Вставить("Получатель",Элементы.Список.ТекущиеДанные.Получатель);
	ВыбранноеЗначение.Вставить("Сумма", Элементы.Список.ТекущиеДанные.Сумма);
	ВыбранноеЗначение.Вставить("КошелекОтправления", Элементы.Список.ТекущиеДанные.Кошелек);	
	ОповеститьОВыборе(ВыбранноеЗначение);
КонецПроцедуры

Показать


Как мне сделать чтоб открывающаяся форма из регистра сведений была такой-же, как и форма выбора из документа?
+
43. user719210 25.05.17 05:46 Сейчас в теме
Короче говоря, мне надо, чтобы при изменении даты выводилась не стандартная форма списка регистра, а измененная (оставить только 3 колонки) и в отдельном окне
+
44. user719210 25.05.17 06:23 Сейчас в теме
Я думаю, что мне надо создать форму выбора у самого документа РасходДенежныхСредств и в событии присоздании заполнить его данными из регистра сведений. Правильно так будет сделать?
+
46. ResetAtreides 26.05.17 10:39 Сейчас в теме
(44)
Я думаю, что мне надо создать форму выбора у самого документа РасходДенежныхСредств и в событии присоздании заполнить его данными из регистра сведений. Правильно так будет сделать?

Правильнее эту форму регистру сведений сделать и вызывать её, а не стандартную
ОткрытьФорму("РегистрСведений.ПериодическийРасход.ФормаСписка",ПараметрыФормы,ЭтаФорма,,,,Закрытие); 


(45)
остался последний недочет, если нет записей в регистре сведений на заданную дату, то открывается пустая форма, как это исправить не могу понять

А что в таком случае отображать должно?
+
47. user719210 26.05.17 10:51 Сейчас в теме
(46)
Просто не должна открываться форма
+
48. ResetAtreides 26.05.17 11:22 Сейчас в теме
(47) Я бы тогда не так делал. В форме выбора убрал список записей регистра и сделал свой список, который бы заполнял запросом в процедуре "ПередОткрытием". При этом, зная, что запрос ничего не вернул, я могу проконтролировать ситуацию отсутствия подходящих записей и запретить открытие формы(установив Отказ = Истина). Но если твою концепцию не ломать, то впихни контроль наличия записей перед открытием формы
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)    
    Если ЕстьЗаписиНаДату(Дата) Тогда

        ПараметрыФормы = Новый Структура;
        Настройки = Новый НастройкиКомпоновкиДанных;
    
        ЭлементОтбораДатаНачала                   = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораДатаНачала.ЛевоеЗначение     = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
        ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
        ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
        ЭлементОтбораДатаНачала.Использование     = Истина;
    
        ЭлементОтбораДатаОкончания                = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
        ЭлементОтбораДатаОкончания.ВидСравнения   = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
        ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
        ЭлементОтбораДатаОкончания.Использование  = Истина;
    
        ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
        Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
        ОткрытьФорму("РегистрСведений.ПериодическийРасход.ФормаСписка",ПараметрыФормы,ЭтаФорма,,,,Закрытие); 
    Иначе
        Сообщить("Нет записей");
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЕстьЗаписиНаДату(Дата)
      ...
      Запрос на наличие записей на дату в РС
      ...
     Возврат НЕ Запрос.Пустой();

КонецФункции

Показать
user719210; +1
49. user719210 26.05.17 11:41 Сейчас в теме
(48)
Попробовал сделать, получилось как-то так...
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	Объект.Сумма = ПериодическийРасход.Заполнение(Объект.Дата,Объект.КошелекОтправления, Объект.Получатель);	
	Если  ЧислоЗаписейРасход.ЕстьЗаписиНаДату(Объект.Дата) = истина  Тогда
	ПараметрыФормы = Новый Структура;
    Настройки = Новый НастройкиКомпоновкиДанных;
 
    ЭлементОтбораДатаНачала                   = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаНачала.ЛевоеЗначение     = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
    ЭлементОтбораДатаНачала.ВидСравнения      = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбораДатаНачала.ПравоеЗначение    = НачалоДня(Объект.Дата);
    ЭлементОтбораДатаНачала.Использование     = Истина;
	
	ЭлементОтбораДатаОкончания                = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораДатаОкончания.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Регистратор.Дата");
    ЭлементОтбораДатаОкончания.ВидСравнения   = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбораДатаОкончания.ПравоеЗначение = КонецДня(Объект.Дата);
    ЭлементОтбораДатаОкончания.Использование  = Истина;
	
	ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
	Закрытие = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
    ОткрытьФорму("РегистрСведений.ПериодическийРасход.Форма.ФормаВыбора",ПараметрыФормы,ЭтаФорма,,,,Закрытие); 
	КонецЕсли;	
КонецПроцедуры
Показать


Общий модуль

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

	Запрос.УстановитьПараметр("Дата", Дата);
	КоличествоЗаписей = Запрос.Выполнить().Выбрать().Количество();
	Если КоличествоЗаписей = 0 Тогда
	  Проверка = ложь;
  	Иначе
	  Проверка = истина;
  	КонецЕсли;
    Возврат(Проверка);
КонецФункции
Показать


Но в отладчике в КоличествоЗаписей всегда записывается 0, не пойму почему?
+
50. ResetAtreides 26.05.17 12:11 Сейчас в теме
(49) Так у тебя дата жестко задана, а не периодом НачалоДня - КонецДня. Используй
ПериодическийПриходСрезПервых.Регистратор.Дата Между &НачалоДня и &КонецДня

И не надо так сложно проверять на наличие записей. Я же написал как проще
    Запрос.УстановитьПараметр("Дата", Дата);
    Результат = Запрос.Выполнить();
    Возврат НЕ Результат.Пустой();
user719210; +1
53. user719210 26.05.17 12:32 Сейчас в теме
(50)
Между &НачалоДня и &КонецДня

Не понял как задать эти параметры

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


Вот вместо "???" мне же надо написать дату регистратора получается, а как к ней обратиться?
+
55. user719210 26.05.17 12:37 Сейчас в теме
(53)
Между надо в условии писать?
 		|ГДЕ
		|	(ПериодическийРасходСрезПоследних.Регистратор.Дата Между &НачалоДня и &КонецДня) = &Дата";
	
+
45. user719210 26.05.17 05:38 Сейчас в теме
Решил вопрос созданием произвольной формы, остался последний недочет, если нет записей в регистре сведений на заданную дату, то открывается пустая форма, как это исправить не могу понять. Подскажите как написать условие на проверку записей и куда его вставлять (в событие приоткрытии или присозданиинасервере или еще куда-нибудь?).
+
51. ResetAtreides 26.05.17 12:15 Сейчас в теме
Если  ЧислоЗаписейРасход.ЕстьЗаписиНаДату(Объект.Дата) = истина  Тогда

Это тоже излишество
Достаточно
Если  ЧислоЗаписейРасход.ЕстьЗаписиНаДату(Объект.Дата)  Тогда


Строка
 Объект.Сумма = ПериодическийРасход.Заполнение(Объект.Дата,Объект.КошелекОтправления, Объект.Получатель); 

вроде как-то не к месту. Как минимум она должна быть под условием, да и вообще вроде это уже обработка выбора, т.е. в другой процедуре?
user719210; +1
52. user719210 26.05.17 12:17 Сейчас в теме
(51)
Про первую строку да, это в другом месте используется, стирал обычно перед тем как код выложить, щас забыл
+
54. ResetAtreides 26.05.17 12:37 Сейчас в теме +1.24 $m
Запрос.Текст = 
        "ВЫБРАТЬ
        |    ПериодическийРасходСрезПоследних.Кошелек КАК Кошелек,
        |    ПериодическийРасходСрезПоследних.Отправитель КАК Отправитель,
        |    ПериодическийРасходСрезПоследних.Сумма КАК Сумма,
        |    ПериодическийРасходСрезПоследних.Регистратор.Дата КАК РегистраторДата
        |ИЗ
        |    РегистрСведений.ПериодическийПриход.СрезПервых КАК ПериодическийРасходСрезПоследних
        |ГДЕ
        |    ПериодическийРасходСрезПоследних.Регистратор.Дата Между &НачалоДня и &КонецДня";
    
    Запрос.УстановитьПараметр("НачалоДня",НачалоДня(Дата));
    Запрос.УстановитьПараметр("КонецДня",КонецДня(Дата));
Показать
user719210; +1
56. user719210 26.05.17 12:37 Сейчас в теме
(54)
АА, понял, спасибо
+
57. user719210 26.05.17 12:41 Сейчас в теме
В итоге вот так щас, но в отладчике "результат" пустой всегда
Функция ЕстьЗаписиНаДату(Дата) Экспорт
	              
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПериодическийРасходСрезПоследних.Кошелек КАК Кошелек,
		|	ПериодическийРасходСрезПоследних.Отправитель КАК Отправитель,
		|	ПериодическийРасходСрезПоследних.Сумма КАК Сумма,
		|	ПериодическийРасходСрезПоследних.Регистратор.Дата Между &НачалоДня и &КонецДня КАК РегистраторДата
		|ИЗ
		|	РегистрСведений.ПериодическийПриход.СрезПервых КАК ПериодическийРасходСрезПоследних
		|ГДЕ
		|	ПериодическийРасходСрезПоследних.Регистратор.Дата Между &НачалоДня и &КонецДня";
	Запрос.УстановитьПараметр("НачалоДня",НачалоДня(Дата));
	Запрос.УстановитьПараметр("КонецДня",КонецДня(Дата));
	Результат = Запрос.Выполнить();
    Возврат НЕ Результат.Пустой();
КонецФункции
Показать
+
63. user719210 29.05.17 04:14 Сейчас в теме
(57)
Да уж, под вечер вообще невнимательным становлюсь)
Хочу получить расход из таблицы прихода, да еще и срез первых. Как так написал не пойму), теперь вроде все работает. Спасибо reset
|ИЗ
|    РегистрСведений.ПериодическийПриход.СрезПервых КАК ПериодическийРасходСрезПоследних
+
58. user719210 26.05.17 12:43 Сейчас в теме
А, все, забыл убрать Между &НачалоДня и &КонецДня вначале
+
59. user719210 26.05.17 12:46 Сейчас в теме
Хотя все равно странно как-то работает, например на 22 правильно показывает, а на 23 ничего не показывает
+
60. user719210 26.05.17 12:52 Сейчас в теме
Странно как-то, у меня есть 2 документа на 22 и 2 документа на 23 число.
Только что менял дату на все дни месяца по очереди, открылась форма на 22, 24 и 25 числе
+
61. DAL 26.05.17 13:35 Сейчас в теме
(60)

Функция ЕстьЗаписиНаДату(Дата) Экспорт
                  
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |    ПериодическийРасходСрезПоследних.Кошелек КАК Кошелек,
        |    ПериодическийРасходСрезПоследних.Отправитель КАК Отправитель,
        |    ПериодическийРасходСрезПоследних.Сумма КАК Сумма,
        |    ПериодическийРасходСрезПоследних.Регистратор.Дата КАК Дата
        |ИЗ
        |    РегистрСведений.ПериодическийПриход.СрезПервых КАК ПериодическийРасходСрезПоследних
        |ГДЕ
        |    ПериодическийРасходСрезПоследних.Регистратор.Дата Между &НачалоДня и &КонецДня");
    Запрос.УстановитьПараметр("НачалоДня",НачалоДня(Дата));
    Запрос.УстановитьПараметр("КонецДня",КонецДня(Дата));
    
    Результат = Запрос.Выполнить().Выбрать();
    Возврат НЕ Результат.Следующий();
КонецФункции
Показать
+
62. ResetAtreides 26.05.17 13:47 Сейчас в теме
(60) Возможно потому, что ты регистр не по назначению используешь, я тебя это (16) писал. Концепцию сменил, а архитектуру старую оставил. В такой реализации тебе регистр сведений, а тем более "срез последних", совсем не нужен, все можно из самого документа вытащить. У тебя запрос работает примерно так - получает данные среза, а потом среди полученного выбирает условие "ГДЕ", т.е. в таблице движений данные-то есть, но срез тебе только последние данные оставляет, а там уже условию "ГДЕ" не из чего отбирать. Если все таки так хочешь оставить, бери не из среза, а из самих движений
+
64. user719210 29.05.17 07:46 Сейчас в теме
Все-таки, заметил одну неточность, может я неправильно объяснил задачу изначально. У меня открываются все записи именно на заданную дату, а надо только на заданный день, в любом месяце и году.

Попробовал исправить, но не получилось. Я так понял, мне начало дня и конец дня уже использовать не надо?

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

	
		 ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
		 Закрытиее = Новый ОписаниеОповещения("ОписаниеЗакрытия",ЭтаФорма);
    	 ОткрытьФорму("РегистрСведений.ПериодическийПриход.Форма.ФормаВыбора",ПараметрыФормы,ЭтаФорма,,,,Закрытиее); 
	КонецЕсли;
Показать



Функция ЕстьЗаписиПриход(Дата) Экспорт	              
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПериодическийПриход.Кошелек КАК Кошелек,
		|	ПериодическийПриход.Отправитель КАК Отправитель,
		|	ПериодическийПриход.Сумма КАК Сумма,
		|	ПериодическийПриход.Регистратор.Дата КАК РегистраторДата
		|ИЗ
		|	РегистрСведений.ПериодическийПриход КАК ПериодическийПриход
		|ГДЕ
		|	День(ПериодическийПриход.Регистратор.Дата) = &ТекДень";
	Запрос.УстановитьПараметр("ТекДень",День(Дата));
	Результат = Запрос.Выполнить();
    Возврат НЕ Результат.Пустой();
КонецФункции
Показать
+
65. user719210 29.05.17 07:47 Сейчас в теме
Мне в ЭлементОтбораДата.ЛевоеЗначение надо же брать как-то день от даты регистратора?
+
66. user719210 29.05.17 10:15 Сейчас в теме
Пробовал, пробовал, опять все переделал
Решил На форме выбора создать произвольный запрос к динамической форме,
       "ВЫБРАТЬ
        |    ПериодическийПриход.Кошелек КАК Кошелек,
        |    ПериодическийПриход.Отправитель КАК Отправитель,
        |    ПериодическийПриход.Сумма КАК Сумма,
        |    ПериодическийПриход.Регистратор.Дата КАК РегистраторДата
        |ИЗ
        |    РегистрСведений.ПериодическийПриход КАК ПериодическийПриход
        |ГДЕ
        |    День(ПериодическийПриход.Регистратор.Дата) = &ТекДата"
Показать


Потом , при создании на сервере передал параметр
Список.Параметры.УстановитьЗначениеПараметра("ТекДата",Параметры.ТекДата)


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


Вроде бы теперь все работает правильно
+
67. ResetAtreides 29.05.17 14:59 Сейчас в теме
(66) Поэтому и предлагал добавить в регистр новое измерение "ДеньМесяца" ) Сделал по нему отбор и никаких заморочек с получением дня через две точки
user719210; +1
68. user719210 31.05.17 08:16 Сейчас в теме
(67)
Задача еще немного усложнилась, сейчас у меня есть:
2 документа:
- ПриходДенежныхСредств
- ПериодическиеПоступления
и 2 регистра
- РегистрПостпуления (оборотный регистр накопления, в котором записываются проведенные документы ПриходДенежныхСредств)
- ПериодическийПриход (регистр сведений, в котором записываются проведенные документы ПериодическиеПоступления)

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

Надо как-то реализовать контроль выполненных операций. Например при указании даты 22 числа у меня отображаются запланированные записи на 22 число из регистра сведений, я выбираю одну из записей и провожу ее. Мне надо сделать так, чтобы в этом месяце 22 числа, я не мог заново выбрать и провести эту запись (т.е. при открытии формы выбора ее там быть не должно)

Если более кратко, то принцип такой: в регистре сведений записаны запланированные поступления на месяц, при открытии формы выбора должны отображаться только те, которые еще не были проведены в этом месяце на заданный день.

Я думаю, что надо наверное делать через уникальный идентификатор как-то (для записей регистра сведений создать уникальный идентификатор и перед открытием проверять есть ли запись с таким идентификатором в регистре накопления). Только не пойму куда его при выборе передавать, как его отправить в регистр накопления вместе с записью и как потом добавить в условие отбор по нему. Или может это неправильный способ и есть проще.
+
69. ResetAtreides 31.05.17 09:29 Сейчас в теме
(68) Ты же при смене даты сейчас выбираешь не документ "ПериодическиеПоступления", а его записи РС "ПериодическийПриход"? Я бы чуть изменил структуру выбора периодических поступлений
1) Форму выбора записей РС "ПериодическийПриход" при смене даты переделал бы, что бы она вместо записей регистра выводила таблицу значений, с колонками "Использовать"(Флажок), "Отправитель","Кошелек" и "Сумма"(как в РС)
2) Таблица заполняется при открытии формы. Берет данные из РС "ПериодическийПриход" за указанный день месяца и вычитает данные оборота за текущий день из РН "РегистрПостпуления" по измерениям "Отправитель","Кошелек" и "Сумма". Возможно потребуется исключить обороты текущего документа или его движения удалить перед заполнением, это смотря как у тебя концепция будет. Из полученной таблицы исключить строки с минусовой суммой (их не было в периодических поступлениях)
3) При нажатии кнопки выбора, документу передается массив строк таблицы с установленными флажками "Использовать", и документ их добавляет в свою ТЧ
Для следующего документа в этом дне эти строки отображаться не будут, т.к. из остатки будут снижены движениями этого документа
+
70. user719210 31.05.17 10:22 Сейчас в теме
(69)
Чтобы почти ничего не менять, думаю сделать так:
В регистре сведений и в регистре накоплений создать измерение УИД (Уникальный идентификатор), в документ ПериодическиеПоступления добавить реквизит УИД, в процедуре ПослеЗаписи документа добавить :
Объект.УИД = Новый УникальныйИдентификатор;

Далее при проведении УИД записывается в регистр сведений. А в регистре накоплений все поля УИД пока пустые, далее при изменении даты в документе открывается форма выбора, оттуда выбираю 1 из строк регистра сведений, считываются данные этой строки вместе с УИД и при проведении в регистре накоплений записываются УИД этой записи.
А в запросе динамического списка напишу где день(РС.период) = день(РН.период) и рс.уид <> рн.уид
Получится так или нет? Пока что попробую так сделать, если не получится буду думать дальше.
+
73. user719210 31.05.17 11:09 Сейчас в теме
Плохо, другими не знаю как сделать. Ваше (69) прочитал, но не понял как сделать, да и много исправлять наверное.
+
74. ResetAtreides 31.05.17 11:12 Сейчас в теме
(73) Форму выбора только свою нарисовать и табличку в ней заполнить одним запросом с объединением, что уж такого сложного?
+
76. user719210 31.05.17 12:24 Сейчас в теме
(74)
Не пойму почему неправильно работает запрос
Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПериодическийПриходСрезПоследних.Период КАК Период,
		|	ПериодическийПриходСрезПоследних.Кошелек КАК Кошелек,
		|	ПериодическийПриходСрезПоследних.Отправитель КАК Отправитель,
		|	ПериодическийПриходСрезПоследних.УИД КАК УИД,
		|	ПериодическийПриходСрезПоследних.Сумма КАК Сумма
		|ИЗ
		|	РегистрСведений.ПериодическийПриход.СрезПоследних КАК ПериодическийПриходСрезПоследних
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрПоступления КАК РегистрПоступления
		|		ПО ПериодическийПриходСрезПоследних.УИД <> РегистрПоступления.УИД
		|ГДЕ
		|	ДЕНЬ(ПериодическийПриходСрезПоследних.Период) = &Дата";
	
	Запрос.УстановитьПараметр("Дата", День(Дата));
	
	РезультатЗапроса = Запрос.Выполнить();
	ТЗ = РезультатЗапроса.Выгрузить();
Показать

в ТЗ записаны на каждое значение по 5 строк
+
77. ResetAtreides 31.05.17 13:38 Сейчас в теме
(76) Не взлетит, ты костыли к костылям привязываешь. Вот эта строчка:
ДЕНЬ(ПериодическийПриходСрезПоследних.Период) = &Дата

И эта
ПериодическийПриходСрезПоследних.УИД <> РегистрПоступления.УИД

В срезе последних работать адекватно не смогут в принципе. Меняй концепцию, дальше будет только хуже
+
78. user719210 01.06.17 03:43 Сейчас в теме
(77)
А почему в срезе последних они не будут работать? (Кстати, периодичность у регистра сведений убрал, и по периоду сделал отбор, убрал регистратор.дата)
+
79. ResetAtreides 01.06.17 11:05 Сейчас в теме
(78) Срез последних выдает последнюю запись в разрезе измерений, т.е. большей части записей в этой таблице просто нет. Поэтому какой может быть отбор через "ГДЕ", если большая часть уже отсеяна?
+
80. user719210 01.06.17 12:33 Сейчас в теме
(79)
Сделал запрос вот так, все работает
"ВЫБРАТЬ
		|	ПериодическийПриходСрезПоследних.Период КАК Период,
		|	ПериодическийПриходСрезПоследних.Регистратор КАК Регистратор,
		|	ПериодическийПриходСрезПоследних.НомерСтроки КАК НомерСтроки,
		|	ПериодическийПриходСрезПоследних.Активность КАК Активность,
		|	ПериодическийПриходСрезПоследних.Кошелек КАК Кошелек,
		|	ПериодическийПриходСрезПоследних.Отправитель КАК Отправитель,
		|	ПериодическийПриходСрезПоследних.Сумма КАК Сумма,
		|	ПериодическийПриходСрезПоследних.УИД КАК УИД
		|ИЗ
		|	РегистрСведений.ПериодическийПриход.СрезПоследних КАК ПериодическийПриходСрезПоследних
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическиеПроведенные.СрезПоследних КАК ПериодическиеПроведенные
		|		ПО ПериодическийПриходСрезПоследних.УИД = ПериодическиеПроведенные.УИД
		|			И (ДЕНЬ(ПериодическийПриходСрезПоследних.Период) = ДЕНЬ(ПериодическиеПроведенные.Период))
		|			И (МЕСЯЦ(&ТекДата) = МЕСЯЦ(ПериодическиеПроведенные.Период))
		|ГДЕ
		|	ПериодическиеПроведенные.УИД ЕСТЬ NULL
		|	И ДЕНЬ(ПериодическийПриходСрезПоследних.Период) = ДЕНЬ(&ТекДата)
		|	И МЕСЯЦ(ПериодическийПриходСрезПоследних.Период) <= МЕСЯЦ(&ТекДата)";
Показать
+
71. user719210 31.05.17 11:04 Сейчас в теме
Так, добавил в обоих документах реквизит УИД и в обоих регистрах измерение УИД,
Теперь при записи документа ПериодическиеПоступления, создается УИД. Далее при изменении даты документа ПриходДС открывается форма выбора, там все записи уже с УИД, выбираю запись, уид записывается в форму документа ПриходДС и при проведении этого документа записывается в РН. Т.е. в РН записи не выбранные из РС, а просто созданные в форме документа находятся в РН с пустым УИД.
Все пока работает также, вот только не пойму как сделать запрос в динамическом списке формы РС

ВЫБРАТЬ
	РегистрСведенийПериодическийПриход.Период КАК Период,
	РегистрСведенийПериодическийПриход.Регистратор КАК Регистратор,
	РегистрСведенийПериодическийПриход.НомерСтроки КАК НомерСтроки,
	РегистрСведенийПериодическийПриход.Активность КАК Активность,
	РегистрСведенийПериодическийПриход.Кошелек КАК Кошелек,
	РегистрСведенийПериодическийПриход.Отправитель КАК Отправитель,
	РегистрСведенийПериодическийПриход.Сумма КАК Сумма,
	РегистрСведенийПериодическийПриход.УИД КАК УИД
ИЗ
	РегистрСведений.ПериодическийПриход КАК РегистрСведенийПериодическийПриход
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрПоступления КАК РегистрПоступления
		ПО РегистрСведенийПериодическийПриход.УИД <> РегистрПоступления.УИД
ГДЕ
	ДЕНЬ(РегистрСведенийПериодическийПриход.Период) = &ТекДата
Показать


При изменении даты вылазит ошибка: Обнаружено дублирование ключевых значений в колонках:"...." ну и все колонки перечислены.
Что-то не так с запросом, как его исправить? Или можно отдельно от запроса проверку по УИД сделать?
+
72. ResetAtreides 31.05.17 11:06 Сейчас в теме
Не надо так. Ты уже типовой механизм "СрезПоследних" убил, а так ещё и "Обороты" убьешь ) Если планируешь стандартов 1С придерживаться, лучше другое решение выбери. Да и не универсальное твое решение, куча проблем вылезет в различных ситуациях
+
75. user719210 31.05.17 11:26 Сейчас в теме
Ну у меня вроде форма выбора и так самодельная
+
Внимание! Тема сдана в архив

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