Имя: Пароль:
1C
1С v8
ОбработкаПроведения
0 AnisaL
 
25.01.13
10:18
Добрый день! Подскажите, в обработке проведения документа такое движение :              
движение = движения.ОплатаПоСмете.Добавить();
движение.ВидДвижения  = ВидДвиженияНакопления.Приход;
движение.Период = дата;
движение.Смета = смета;
движение.ПризнакРасчета = Признак;
движение.Сумма = СуммаДокумента;
Потом идет запрос по этому движению:

// Расчет сальдо по Смете            
   смет = смета.ПолучитьОбъект();
   ном = смет.Номер;

   запрос = новый запрос;
   запрос.УстановитьПараметр("Номер", ном);
   запрос.Текст = "Выбрать * из регистрНакопления.ОплатаПоСмете как рег где рег.смета.номер = &номер";
   выборка = запрос.Выполнить().Выбрать();
   Ссальдо = 0;
   если выборка.Количество()<>0 тогда
   пока выборка.Следующий() цикл
       если выборка.видДвижения = видДвиженияНакопления.Приход тогда
       ссальдо = ссальдо+выборка.сумма;
   иначе
       ссальдо = ссальдо-выборка.сумма;
       конецЕсли;
   конецЦикла;
       
   иначе
   ссальдо = 0;
   конецЕсли;

   смет.Сальдо = ссальдо;
   смет.Записать();
1 AnisaL
 
25.01.13
10:19
Документ - ПКО. Вопрос в том, почему запрос не находит это движение?
2 Ёпрст
 
25.01.13
10:20
а движения записаны хоть до запроса ?
3 k1us181b
 
25.01.13
10:21
а где Записывать=истина и Записать()
4 AnisaL
 
25.01.13
10:21
(1) По идее сальдо должно стать равно сумме движения, а оно равно 0.
5 AnisaL
 
25.01.13
10:21
(2) аа, вот значит этой строчки и не хватает!
6 AnisaL
 
25.01.13
10:22
(3) Как правильно записать, движение.Записать() = Истина ?
7 k1us181b
 
25.01.13
10:24
РегистрНакопленияНаборЗаписей.<Имя регистра накопления> (AccumulationRegisterRecordSet.<Имя регистра накопления>)
Записывать (Write)
Использование:

Чтение и запись.
Описание:

Тип: Булево.
Ложь - не происходит записи набора в информационную базу при вызове Записать коллекции движений документа, которой принадлежит набор, а также при стандартной обработке проведения документа, если значение свойства метаданного документа "Запись движений при проведении" в Конфигураторе выставлено в "Записывать выбранные".

Доступность:

Сервер, толстый клиент, внешнее соединение.
8 AnisaL
 
25.01.13
10:30
(7) Пока у меня не получилось, так пишу
движение.Записывать(); ошибка.
Значит нужно через РегистрНакоплениянаборзаписей делать?
9 k1us181b
 
25.01.13
10:32
движения.ОплатаПоСмете.Записывать = Истина;
движение = движения.ОплатаПоСмете.Добавить();
движение.ВидДвижения  = ВидДвиженияНакопления.Приход;
движение.Период = дата;
движение.Смета = смета;
движение.ПризнакРасчета = Признак;
движение.Сумма = СуммаДокумента;
10 AnisaL
 
25.01.13
10:33
(9) Документ.ПриходныйКассовыйОрдер(1696)}: Поле объекта не обнаружено (Записывать)
       движения.ОплатаПоСмете.Записывать = Истина;
11 AnisaL
 
25.01.13
10:34
Не получилось(
12 AnisaL
 
25.01.13
10:36
Написала так - движения.ОплатаПоСмете.Записать(Истина);
прокатило, но опять потом в запросе не находит эту оплату(
13 НафНаф
 
25.01.13
10:38
создай свой набор движений (не тот что у объекта Движения), запиши и читай запросом

а тот запишется после обработки проведения
14 k1us181b
 
25.01.13
10:38
в регистре то хоть строки появляются после записи доков?
15 AnisaL
 
25.01.13
10:41
(14) Да, в регистре появляются эти движения)
16 НафНаф
 
25.01.13
10:41
(15) см (13)
17 AnisaL
 
25.01.13
10:41
(13) Я пробовала перенести этот запрос в событие ПослеЗаписи, тогда он работает
18 НафНаф
 
25.01.13
10:42
(17) не надо ничего переносить, сделай как в (13)
19 AnisaL
 
25.01.13
10:43
(18) А что значит создай "свой набор движений", я ведь и так его вручную создаю
20 Шапокляк
 
25.01.13
10:43
(0) Вы в транзакции по проведению запускаете транзакцию по записи документа. Вряд ли это хорошая идея. Есть несколько способов реализовать ваши идеи. 1 - вычислить это ваше ссальдо без учета движений документа и прибавить к нему планируемые движения, которые делаются в обработке проведения, и в процедуре ПередЗаписью поменять реквизит в объекте, после чего запустится обработка проведения. 2-использовать подписки для изменения реквизита объекта.
21 AnisaL
 
25.01.13
10:44
(18) мне тоже не хочется переносить
22 AnisaL
 
25.01.13
10:47
(13) можно про это поподробнее, что-то я недогоняю
23 cw014
 
25.01.13
10:47
(19) Вместо:

движение = движения.ОплатаПоСмете.Добавить();

Пиши

ДвиженияОплат = РегистрНакопления.ОплатаПоСмете.СоздатьНаборЗаписей();
ДвиженияОплат.Регистратор.Установить(ТвойДокументСсылка);
Движение = ДвиженияОплат.Добавить();
Движение.Регистратор = ТвойДокументСсылка;
Движение.Период = <период>;
Движение.Активность = Истина;
24 НафНаф
 
25.01.13
10:48
+(23) а в конце не забыть записать
25 Reset
 
25.01.13
10:51
Это все ради
   смет.Сальдо = ссальдо;
   смет.Записать();
?

Может использовать Обороты регистра?
26 Reset
 
25.01.13
10:53
или вовсе пересмотреть стратегию.
Как я понял, этот документ при каждом проведении добавляет себе еще одно движение. Это мне не нравится.
27 AnisaL
 
25.01.13
10:53
(23) Сделала так, но ошибка
Документ.ПриходныйКассовыйОрдер(1704)}: Поле объекта не обнаружено (Регистратор)
       ДвиженияОплат.Регистратор.Установить(Смета);
28 AnisaL
 
25.01.13
10:56
(23) Почему ошибка ??
29 nvs
 
25.01.13
10:56
Вот это что за хрень:

запрос.Текст = "Выбрать * из регистрНакопления.ОплатаПоСмете как рег где рег.смета.номер = &номер";
   выборка = запрос.Выполнить().Выбрать();
   Ссальдо = 0;
   если выборка.Количество()<>0 тогда
   пока выборка.Следующий() цикл
       если выборка.видДвижения = видДвиженияНакопления.Приход тогда
       ссальдо = ссальдо+выборка.сумма;
   иначе
       ссальдо = ссальдо-выборка.сумма;
       конецЕсли;
   конецЦикла;


Есть виртуальная таблица остатков если что...
и за "Ссальдо" отдельный плюс )))
30 Reset
 
25.01.13
10:56
Вероятно, эта "Смета" должна быть измерением, а не регистратором, раз по ней требуются остатки и обороты
31 Reset
 
25.01.13
10:57
+(30) а приход и расход должны формировать другие документы
32 AnisaL
 
25.01.13
10:57
(30) Да, правильно - измерением
33 AnisaL
 
25.01.13
10:58
(31) Да, все так
34 cw014
 
25.01.13
10:59
(28)
ДвиженияОплат.Отбор.Регистратор.Установить(ТвойДокументСсылка);
35 Reset
 
25.01.13
11:00
(33) Совсем не понимаю смысла в (0) :(
36 nvs
 
25.01.13
11:00
+(29) я бы реквизит у сметы сальдо не хранил а вычислял каждый раз при необходимости (например просто в форме элемента показывал)
37 Reset
 
25.01.13
11:01
(33) Зачем в реквизит сметы писать сальдо?
Для этого есть остатки у регистра
38 Reset
 
25.01.13
11:02
Вот, товарищ nvs тоже не понимает
39 Reset
 
25.01.13
11:03
(36) Возможно, с нее требуют в списке документов показывать сальдо ;]
40 Reset
 
25.01.13
11:04
хотя даже в этом случае я бы считал "динамически"
41 AnisaL
 
25.01.13
11:07
(39) На самом деле так и есть, все это для того чтобы в списке документов видеть сальдо и ИтогПоСмете и соотвественно окрашивать эти Ячейки: если она равны , то зеленые, если нет, то красным
42 AnisaL
 
25.01.13
11:10
(40) динамически - это без запроса, так?
43 nvs
 
25.01.13
11:11
(41) у табличного поля есть такое событие "При полученииДанных" - вот в нем и можно спокойно вывести тебе нужные данные и покрасить в нужный цвет
44 Reset
 
25.01.13
11:11
(42) Как раз запросом к остаткам
45 nvs
 
25.01.13
11:12
(42) динамически это значит "в процессе выполнения" как-то так... счас пример тебе подкину
46 AnisaL
 
25.01.13
11:12
(44) А сейчас и так запрос (0)
47 AnisaL
 
25.01.13
11:15
(43) Да, все так и делается) Проблема в том была, что после проведении ПКО, при открытии этого журнала Смет, оплата не "вставала", приходилось бухгалтеру искать Смету, в нее заходить - нажимать, записать, и только после этого в Журнале поялвялось Сальдо.
48 Reset
 
25.01.13
11:17
(46)(47)
Сейчас все совсем не так делается.
Идет речь от том, что реквизит в документе не нужен совсем, т.е. все (0) лишнее.

В момент окраски нужно получать остатки там принимать решение об окраске
49 cw014
 
25.01.13
11:18
Последний вопрос... А второй запрос когда выполняется? В той же процедуре проведения? Или где-то еще?
50 AnisaL
 
25.01.13
11:18
(48) То есть в процедуре ПриПолученииДанных? Там делать Запрос к регистру ОплатаПоСмете?
51 Reset
 
25.01.13
11:18
а скорее всего и вовсе дело в
"оплата не "вставала", приходилось бухгалтеру искать Смету, в нее заходить - нажимать, записать"

Т.е. ты сейчас делаешь костыль вместо исправления ошибки.
52 shamannk
 
25.01.13
11:18
(0) Позови взрослых и поставь чеку на место.
53 nvs
 
25.01.13
11:18
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Если ОформленияСтрок.Количество() = 1 Тогда
       тСтатус = РегистрыСведений.СтатусДокумента.Получить(Новый Структура("Документ", ОформленияСтрок[0].ДанныеСтроки.Ссылка)).Статус;
       ОформленияСтрок[0].Ячейки.Статус.УстановитьТекст(тСтатус);
       ОформленияСтрок[0].Ячейки.Оплачено.УстановитьТекст(Формат(оснПолучитьСуммуОплаченногоПоСчету(ОформленияСтрок[0].ДанныеСтроки.Ссылка),"ЧЦ=15; ЧДЦ=2"));
       СуммаПоСчету = ?(ОформленияСтрок[0].ДанныеСтроки.Ссылка.СуммаВключаетНДС, ОформленияСтрок[0].ДанныеСтроки.Ссылка.Сумма, ОформленияСтрок[0].ДанныеСтроки.Ссылка.Сумма + ОформленияСтрок[0].ДанныеСтроки.Ссылка.СуммаНДС);
       ОформленияСтрок[0].Ячейки.СуммаПоСчету.УстановитьТекст(Формат(СуммаПоСчету,"ЧЦ=15; ЧДЦ=2"));
       ОформленияСтрок[0].ЦветФона = УстановитьЦветЗаписи(ОформленияСтрок[0].ДанныеСтроки.Ссылка, тСтатус);
   Иначе
       Массив = Новый Массив;
       МассивПросроченных = ПолучитьСписокПросроченных();
       Для Каждого Элемнт Из ОформленияСтрок Цикл
           Массив.Добавить(Элемнт.ДанныеСтроки.Ссылка);
           Результат = МассивПросроченных.Найти(Элемнт.ДанныеСтроки.Ссылка);
           Если Результат <> Неопределено Тогда
               бпИнициализироватьБП("ЗаписьСчета",Элемнт.ДанныеСтроки.Ссылка);
           КонецЕсли;
       КонецЦикла;
       
       фЗапрос = Новый Запрос;
       фЗапрос.Текст =
           "ВЫБРАТЬ
           |    СтатусДокумента.Статус,
           |    СтатусДокумента.Документ,
           |    ВЫБОР
           |        КОГДА СтатусДокумента.Документ.СуммаВключаетНДС
           |            ТОГДА СтатусДокумента.Документ.Сумма
           |        ИНАЧЕ СтатусДокумента.Документ.Сумма + СтатусДокумента.Документ.СуммаНДС
           |    КОНЕЦ КАК СуммаПоСчету,
           |    ЕСТЬNULL(ПотребностьОплатыОбороты.СуммаВключаетНДСРасход, 0) КАК Оплачено
           |ИЗ
           |    РегистрСведений.СтатусДокумента КАК СтатусДокумента
           |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПотребностьОплаты.Обороты КАК ПотребностьОплатыОбороты
           |        ПО СтатусДокумента.Документ = ПотребностьОплатыОбороты.Счет
           |ГДЕ
           |    СтатусДокумента.Документ В(&Документы)";
       фЗапрос.УстановитьПараметр("Документы", Массив);
       Выборка = фЗапрос.Выполнить().Выбрать();
       Для Каждого Элемнт Из ОформленияСтрок Цикл
           Выборка.Сбросить();
           Если Выборка.НайтиСледующий(Новый Структура("Документ", Элемнт.ДанныеСтроки.Ссылка)) Тогда
               Элемнт.Ячейки.Статус.УстановитьТекст(Выборка.Статус);
               Элемнт.Ячейки.СуммаПоСчету.УстановитьТекст(Формат(Выборка.СуммаПоСчету,"ЧЦ=15; ЧДЦ=2"));
               Элемнт.Ячейки.Оплачено.УстановитьТекст(Формат(Выборка.Оплачено,"ЧЦ=15; ЧДЦ=2"));
               Элемнт.ЦветФона = УстановитьЦветЗаписи(Элемнт.ДанныеСтроки.Ссылка, Выборка.Статус);
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
   
КонецПроцедуры
54 Reset
 
25.01.13
11:20
(50) Да, для получения этго самого "сальдо".
55 AnisaL
 
25.01.13
11:20
ПКО = ЭтотОбъект.Ссылка;
       ДвиженияОплат = РегистрыНакопления.ОплатаПоСмете.СоздатьНаборЗаписей();
       ДвиженияОплат.Отбор.Регистратор.Установить(Ссылка);
       Движение = ДвиженияОплат.Добавить();
       Движение.Регистратор = ПКО;
       Движение.Смета = смета;
       Движение.ПризнакРасчета = Признак;
       Движение.Период = дата;
       Движение.Сумма = СуммаДокумента;
       Движение.Активность = Истина;

Вот такой код не сработал, даже в Регистр нету записи
56 Reset
 
25.01.13
11:21
(55) Этот код вообще к деле не относится
57 AnisaL
 
25.01.13
11:21
(54) Но это же циклическая процедура, если каждый раз в ней делать запрос, то медленнее будет работать
58 AnisaL
 
25.01.13
11:22
(56) Я его по (23) делала
59 Reset
 
25.01.13
11:23
+(56)
к делу*

Речь о Остатках

"ВЫБРАТЬ
|    ЗаказыПокупателейОстатки.СуммаОстаток
|ИЗ
|    РегистрНакопления.ЗаказыПокупателей.Остатки(, ЗаказПокупателя = &Заказ) КАК ЗаказыПокупателейОстатки"
60 AnisaL
 
25.01.13
11:23
(51) А ошибка то в чем?
61 Reset
 
25.01.13
11:24
(60)
"приходилось бухгалтеру искать Смету, в нее заходить - нажимать, записать"
Это - ошибка
62 Reset
 
25.01.13
11:24
Похоже, у вас очень своеобразная конфигурация
63 AnisaL
 
25.01.13
11:25
(49) Да, в этой же процедуре проведения, прямо после этого ДВижения
64 AnisaL
 
25.01.13
11:27
(62) Да, она у нас очень своебразная) написана с нуля, и переписана
65 AnisaL
 
25.01.13
11:28
(61) Так как эту ошибку исправить?
66 AnisaL
 
25.01.13
11:30
(59) Такой запрос в процедуру ПриПолучении данных запихнуть что ли
67 AnisaL
 
25.01.13
11:31
(53) Попробую такое сделать
68 nvs
 
25.01.13
11:37
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "Выбрать т.суммаОстаток
   |    ИЗ регистрНакопления.ОплатаПоСмете.Остатки(, смета в (&Сметы))";
   Сметы = Новый Массив;
   Для Каждого эл Из ОформленияСтрок Цикл
       Сметы.Добавить(эл.ДанныеСтроки.Ссылка);
   КонецЦикла;
   Запрос.УстановитьПараметр("Сметы", Сметы);
   Выборка = Запрос.Выполнить().Выбрать();
   Для Каждого эл Из ОформленияСтрок Цикл
       Выборка.Сбросить();
       Если Выборка.НайтиСледующий(Новый Структура("Документ", эл.ДанныеСтроки.Ссылка)) Тогда
           эл.Ячейки.Сальдо.УстановитьТекст(Формат(Выборка.суммаОстаток,"ЧЦ=15; ЧДЦ=2"));
           //тут уж как вам нравится...условия и любой цвет
           эл.ЦветФона = WebЦвета.Лимонный;
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры
69 AnisaL
 
25.01.13
11:43
(68) спасибо), попробую
70 nvs
 
25.01.13
11:55
(69) примерно так... могут быть ошибки писал без отладчикаи не знаю как у вас реквизиты, объекты, колонки и т.д называются
71 AnisaL
 
25.01.13
12:04
(70) ну да, это понятно
72 AnisaL
 
25.01.13
12:35
(70) что-то не получилось, в этой строке какой должен быть Документ ?
      Если Выборка.НайтиСледующий(Новый Структура("Документ", эл.ДанныеСтроки.Ссылка))
73 AnisaL
 
25.01.13
12:37
у меня пишет "Поле не найдено" Документ
74 nvs
 
25.01.13
12:39
Запрос поправьтье:
Запрос.Текст =
   "Выбрать
   |    т.Смета КАК Документ,
   |    т.суммаОстаток
   |    ИЗ регистрНакопления.ОплатаПоСмете.Остатки(, смета в (&Сметы))
75 AnisaL
 
25.01.13
12:48
(74) спасибо) поправлю
76 AnisaL
 
25.01.13
12:59
(74) Еще раз благодарю )) Все получилось). Всем откликнувшимся отдельное спасибо:)))
77 AnisaL
 
25.01.13
13:09
(74) А вот делаю отмену проведения ПКО, то опять в Журнале сумма остается, хотя сальдо должно быть 0
78 AnisaL
 
25.01.13
13:16
(77) ой, ошиблась я, все четко работает ))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший