Имя: Пароль:
1C
1С v8
Остаток по регистру в форме списка документа
0 Tolia_2016
 
08.10.16
11:26
Всем хороших выходных!
Если очень хочется, можно все таки добавить в форму списка колонку Остаток и в ПриВыводеСтроки высчитывать и прописывать в неё остаток по регистру?
Я знаю, что можно сделать реквизит шапки документа и при записи в него и вписывать, но мне так не подходит ((
А высчитывать на лету - тормозень же будет! Есть какие либо решения еще?
И чем быстрее будет, запросом или прямым обращением к регистру?
База файловая, пользователь будет один.
Спасибо.
1 Злопчинский
 
08.10.16
11:33
Нувбабахешь туда допустим остаток по складу, а по Ом внезапно образуется ещё склад
2 Tolia_2016
 
08.10.16
11:43
Ну и что? В документе может быть только один склад.
А в запросе по фильтру: ДанныеСтроки.Ссылка.Склад...
3 Tolia_2016
 
08.10.16
11:45
Если бы обработчик подписки на событие разрешал обход программной записи документа...
И кстати, почему так мало предустановленных событий? А мне вот ПослеЗаписи надо, а нету!
4 Lexey_
 
08.10.16
11:50
(0) "И чем быстрее будет, запросом или прямым обращением к регистру?", и чем же, по-твоему, одно от другого отличается?
5 Tolia_2016
 
08.10.16
11:51
хз
6 mistеr
 
08.10.16
11:55
(0) >База файловая, пользователь будет один.

При таких условиях можешь делать. Тормозить будет, но приемлемо. Только не в ПриВыводеСтроки, а в ПриПолученииДанных.
7 Tolia_2016
 
08.10.16
11:56
Просто есть дата запрета редактирования документов, отслеживается в т.ч. и подпиской на событие, и если делать через реквизит шапки документа, заретные доки будут выдавать ошибку!
8 Tolia_2016
 
08.10.16
12:00
(6) Спасибо, но не знаю.. Засада со всех сторон. Предустановленного события ПослеЗаписи нету, что бы держать актуальным реквизит шапки тот(иначе бы просто достаточно было открывать форму запретного дока только на чтение и всё), а расчет на лету - тормоза (
Напрашивается вывод - удалить к оленям колонку Остаток!
9 mistеr
 
08.10.16
12:03
(8) >удалить к оленям колонку Остаток!

Самое правильное решение. Тем более, если остаток привязывается к ДОКУМЕНТУ, значит где-то в дизайне косяк.
10 Tolia_2016
 
08.10.16
12:05
(9) Он и не привязывается! Если только через реквизит шапки для бытсрого показа в списке!
Есть заказ покупателя, ну удобно же сразу видеть сколько из него уже выбрано, правильно? Чем какие то дополнительные кнопки тыкать - показать остаток...
А если у заказа сделать реквизит остаток - его надо отгрузками-основаниями будет актуализировать!
А подписки на событие ПослеЗаписи нету! После того как отгрузка проведется! Что мне писать в реквизит?
11 Tolia_2016
 
08.10.16
12:07
+10 В самой отгрузке писать:
заказ = получитьобъект
заказ.остаток = ...
заказ. записать()
?
Это ж совсем бред.
12 Tolia_2016
 
08.10.16
12:08
А если отгрузку удалят?
13 Tolia_2016
 
08.10.16
12:09
Там гулинька наплакала предустановленных событий, может кто скажет которая как "ПриЗаписи", когда документ уже двинул регистры, срабатывает? И на удаление реагирует
14 mistеr
 
08.10.16
12:10
(10) Да делай уже колонку, разрешаю.
15 mistеr
 
08.10.16
12:12
(11) Это ты еще не подумал, что делать, если прошлые документы по заказу поменяли.
16 Tolia_2016
 
08.10.16
12:16
Да, остается только ПриПолученииДанных ((
17 Tolia_2016
 
08.10.16
12:21
Запрос хоть правильный написал?

ВЫБРАТЬ
Остатки.СуммаОстаток КАК Остаток
ИЗ
РегистрНакопления.ЗаказыПокупателей.Остатки(
            ,
            ЗаказПокупателя = &ЗаказПокупателя
                И Валюта = &Валюта) КАК Остатки
18 Tolia_2016
 
08.10.16
12:22
Потом через
Возврат Результат.Выполнить().Выгрузить()[0].Остаток
19 Злопчинский
 
08.10.16
12:24
(10) все тупо и плохо
Документ - для фиксации действия, внёс, записал и провёл, причём это все желательеэно делать по одной кнопке из типа заказа или некоего арм,

А подготовку к выписке документа, осмотр состояния остатков, осмотр состояния заказа, коавряние в носу, чай с бухами и продпвагами - это все ПРОЦЕСС подготовки к мгновенному действию - вот здесь и отражай все что надо

А то начинают из тривиального документа городить многоплановый отчет-арм
20 Tolia_2016
 
08.10.16
12:25
(19) :(
21 RomanYS
 
08.10.16
12:26
(17) нет конечно
ЗаказПокупателя В (&ЗаказыПокупателей)
Результат запроса кешировать в соответствие, а оттуда
Остаток = ТвоеСоответствие[ТекЗаказ];
22 Tolia_2016
 
08.10.16
12:28
(21) эээ... а можно плиз по подробнее?
Результат запроса кешировать в соответствие - это как?
23 Lexey_
 
08.10.16
12:30
(22) Соответствие.Вставить(Заказ, Остаток);
24 Tolia_2016
 
08.10.16
12:32
Запрос
ЗаказПокупателя В (&ЗаказыПокупателей)
Запрос.Выполнить

А дальше?
Соответствие.Вставить(ДанныеСтроки.Ссылка.Закза, Запрос.Остаток)

Так что ли?
25 RomanYS
 
08.10.16
12:32
(22)
Соответствие.Вставить(Выборка.Заказ, Выборка.Остаток);
26 Tolia_2016
 
08.10.16
12:33
А, понял. Спасибо!!
27 RomanYS
 
08.10.16
12:34
(24)
ДанныеСтроки.Ссылка.Закза???

У тебя что список не заказов?
Такая конструкция сама по себе тормоз, пока не уберешь дальше даже смысла оптимизировать нет
28 Tolia_2016
 
08.10.16
12:42
(27) Да нет, я образно написал.

СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Стр Из ОформленияСтрок Цикл
Стр.Ячейки.ОстатокПоЗаказу.Текст = Соответствие.Получить(Стр.ДанныеСтроки.Ссылка)
29 RomanYS
 
08.10.16
12:45
(28) так нормально
30 Tolia_2016
 
08.10.16
13:01
Долго думал почему  В (&ЗаказыПокупателей)  и где брать собственно &ЗаказыПокупателей.
Вот что получилось:

МассивЗаказов = Новый Массив;
Для Каждого Стр Из ОформленияСтрок Цикл
    МассивЗаказов (Стр.ДанныеСтроки.Ссылка);
КонецЦикла;

Соответствие = Новый Соответствие;

Запрос = Новый Запрос;
Запрос.Текст =
ВЫБРАТЬ
    ЗаказПокупателяОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
    ЗаказПокупателяОстатки.СуммаОстаток КАК Остаток
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Остатки(
            ,
            ЗаказПокупателя В (&МассивЗаказов)
                И Валюта = &Валюта) КАК ЗаказПокупателяОстатки

Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов);
Запрос.УстановитьПараметр("Валюта", Стр.ДанныеСтроки.Ссылка.Валюта);

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    Соответствие.Вставить(Результат.ЗаказПокупателя, Результат.Остаток);
КонецЦикла;    

Для Каждого Стр Из ОформленияСтрок Цикл
    Стр.Ячейки.НеоплаченныйОстаток.Значение = Соответствие.Получить(Стр.ДанныеСтроки.Ссылка);    
КонецЦикла;
31 Tolia_2016
 
08.10.16
13:01
Работает.
32 RomanYS
 
08.10.16
16:47
(30) единственно что смущает это
Стр.ДанныеСтроки.Ссылка.Валюта
Как по оптимальности (скорей всего есть Стр.ДанныеСтроки.Валюта), так и ещё по смыслу: зачем вообще валюта и почему берешь её из последней строки?
33 Tolia_2016
 
08.10.16
17:02
(32) Да, ошибочка, хоть и работало, не заметил сразу.
Уже исправил, именно Стр.ДанныеСтроки.Валюта!
В смысле из последней, из текущей? Я вообще что то ПриПолученииДанных не очень понимаю, в смысле как вызывается.
Ставил в начало Сообщить("!"), ну сообщает три раза(три документа в списке). Кликание по докам и прочие дрыганья по списку не добавляет сообщений, но при этом закрыть табло не дает...
Просто пытался отбор сделать по этой колонке, типа:
ДокументСписок.Отбор.ДокументСсылка.ВидСравнения = ВидСравнения.ВСписке;
ДокументСписок.Отбор.ДокументСсылка.Использование = Истина;
ДокументСписок.Отбор.ДокументСсылка.Значение = СписокОтбора;

Где СписокОтбора = список значений, содержащий ТОЛЬКО документы с не нулевыми остатками. ДокументСсылка - реквизит шапки, содержащий ссылку на самого себя.
Как то странно работает, то не работает, а потом вообще, видимо, зацикливаться стал - кулер на i5-ом взлетал от процесса 1cv8.
34 RomanYS
 
08.10.16
17:43
(33) ПриПолученииДанных вызывается для порции отображаемых (условно: попадающих на экран с небольшим запасом вверх/вниз). Почему у тебя 3 раза на 3 строки - непонятно.
По идее должно вызываться при сроллинге/обновлении/изменениях.
Отборы там ставить не стоит - получишь рекурсивный циклический вызов.