Имя: Пароль:
1C
 
Необъяснимая ошибка метода "Записать()" или ошибка в ДНК?
0 YF
 
21.10.04
10:46
Бхгалтерия 7.7 4.5, SQL 21, База ДБФ

Задача: Найти все договоры (Спр.Договоры), где ДатаВозникновения обязательства отличается от даты выписки СчФ.

Решение:

//------- © YF --------------------
Процедура ПроверкаДат(индекс)
   Док=СоздатьОбъект("Документ.СчетФактура");
   Если Врег(Индекс)="ПЕЧАТЬ" Тогда
       Таб=СоздатьОбъект("Таблица");
       Таб.ВывестиСекцию("Шапка");
       Таб.ИсходнаяТаблица("Даты");
       Таб.Опции(0,0,Таб.ВысотаТаблицы());
       Таб.ПовторятьПриПечатиСтроки(2,Таб.ВысотаТаблицы());
   КонецЕсли; //Врег(Индекс)="ПЕЧАТЬ"
   НачатьТранзакцию();
   Док.ВыбратьДокументы(, ДатаО);
   Пока Док.ПолучитьДокумент()=1 Цикл
       ДатаДок=Док.ДатаДок;
       Договор=Док.Договор;
       Состояние("Проверка СчФ за "+СокрЛП(ДатаДок));
       Если Договор.Выбран()=1 Тогда
           ДатаДоговора=Договор.ДатаВозникновенияОбязательства;
           Если ДатаДоговора<>ДатаДок Тогда
               Если Врег(Индекс)="ПЕЧАТЬ" Тогда
                   Таб.ВывестиСекцию("Строка");    
               ИначеЕсли Врег(Индекс)="РЕДАКТИРОВАНИЕ" Тогда
                   Спр=СоздатьОбъект("Справочник.Договоры");
                   Если Спр.НайтиЭлемент(Договор)=1 Тогда
                       Спр.ДатаВозникновенияОбязательства=ДатаДок;
                       Спр.Записать();    
                   КонецЕсли; //Спр.НайтиЭлемент(Договор)=1
               КонецЕсли; //Врег(Индекс)="ПЕЧАТЬ"
           КонецЕсли; //ДатаДоговора<>ДатаДок
       КонецЕсли; //Договор.Выбран()=1
   КонецЦикла;
   ЗафиксироватьТранзакцию();
   Если Врег(Индекс)="ПЕЧАТЬ" Тогда
       Таб.ПараметрыСтраницы(1,,,5,5,5,5,5,5,1,1,"Вася");
       Таб.ТолькоПросмотр(1); Таб.Показать("Даты договоров, СчФ");
   ИначеЕсли Врег(Индекс)="РЕДАКТИРОВАНИЕ" Тогда
       Сообщить("Даты договоров, приведены в соответствие с датами СчФ. Запустите проверку ещё раз.", "i");
   КонецЕсли; //Врег(Индекс)="ПЕЧАТЬ"
КонецПроцедуры //ПроверкаДат

Сначала запускаю спараметром "Печать" - выводится табличка, в ней "Кнопка"

далее:

//------- © YF --------------------
Процедура ОбработкаЯчейкиТаблицы(Зн, Флаг, Табл)
   Если Врег(Зн)="РЕДАКТИРОВАТЬ" Тогда
       Табл.Показать(,,-1);    
       ПроверкаДат("Редактирование");
   иначе
       Флаг=1;
   КонецЕсли; //Врег(Зн)="РЕДАКТИРОВАТЬ"    
КонецПроцедуры //ОбработкаЯчейкиТаблицы


Результат:

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

Чо за фигня?
1 YF
 
21.10.04
10:52
Понимаю, что влом читать код, но че-то я с утра туплю - не могу понять почему записать() не работает.

АУ
2 Rovan
 
гуру
21.10.04
10:52
Я вот Вижу что "РЕДАКТИРОВАТЬ" <> Врег("Редактирование")
3 YF
 
21.10.04
10:56
(2)
Не, вроде там все ОК.

В кнопке в таблице расшифровка равна "Редактировать" - > запуск Обработки ячейки. - > ПроверкаДат("Редактирование");

В отладчике смотрел, доходит до метода "Записать", т.е. находит договор и т.п.
и далее процедура выполняется до конца и

Сообщить("Даты договоров, приведены в соответствие с датами СчФ. Запустите проверку ещё раз.", "i"); выполняется.
4 Шапокляк
 
21.10.04
10:56
Наверно
                  Спр=СоздатьОбъект("Справочник.Договоры");
                  Если Спр.НайтиЭлемент(Договор)=1 Тогда
                      Спр.ДатаВозникновенияОбязательства=ДатаДок;
                      Спр.Записать();    
                  КонецЕсли; //Спр.НайтиЭлемент(Договор)=1
подчиненный справочник Договора, не так ли? Значит по владельцу договор искать надо
Спр.Использовать Владельца(Док.Контрагент); передЕсли Спр.НайтиЭлемент(Договор)=1 Тогда
5 Rovan
 
гуру
21.10.04
11:00
Что это ДатаО ?
6 YF
 
21.10.04
11:02
(5)
Ето дата отчета - > реквизит формы отчета
7 YF
 
21.10.04
11:02
(4)
Попробовал - > то же самое ?
8 Шапокляк
 
21.10.04
11:09
Ну тогда полтергейст или права. Я сталкивалась с подобной ситуацией - когда при записи одного документа перезаписывался другой. Так вот если этот другой не мог перезаписаться по причине, например, задвоенности номера, он молча не перезаписывался и все. Может, в самом справочнике договоров причину поискать?
9 YF
 
21.10.04
11:12
(8)
Чо там искать-то?
Сделал Тест. и исправл.
10 Шапокляк
 
21.10.04
11:16
Сделал и что? Заработало?
11 YF
 
21.10.04
11:24
(10)
Нет
12 Шапокляк
 
21.10.04
11:28
А! Так это вопрос был - что искать?
Интересно, если не в транзакции делать - заработает?...
И я бы права посмотрела на справочник Договоры. Может, пользователь правов не имеет Договоры менять?
13 Rovan
 
гуру
21.10.04
11:28
Убери транзакции вобще.
14 SnarkHunter
 
21.10.04
11:30
(12)А права тут при чем?
15 Rovan
 
гуру
21.10.04
11:31
(12) В 7.7 программно можно чё угодно менять (а вот в 8.0 обломись).
16 YF
 
21.10.04
11:31
(12), (13)
1. Сначала было без транзакции
2. Я с правами админа, +при обработке кодом права не проверяются
17 YF
 
21.10.04
11:33
+ Офигеть

Сейчас только заметил, даты в справочнике меняются, не не на те, что нужно?
Круто да?
18 Шапокляк
 
21.10.04
11:37
Извиняюсь за абсурдное предположение. Не может быть такого: счетов фактур с одним контрагентом и одним договором несколько в разные даты. Вот и записывается справочник несколько раз?
19 Rovan
 
гуру
21.10.04
11:43
(18) Точно !!!
20 ПроходилМимо
 
21.10.04
11:45
(0)Попробовал твой код у себя в базе - работет нормально.
(18,19) не влияет. записывается последнее изменение.
21 Шапокляк
 
21.10.04
11:48
На что не влияет, на погоду?
Если один документ от 1-го числа, другой от 10-го, а договор в них один. Ну запишется 10-го. И что?
22 YF
 
21.10.04
11:48
Всем

Ищу СчФ по одному договору, пока не нашел.
23 Rovan
 
гуру
21.10.04
11:50
(21) а ты не глазами ищи, а создай объект СписокЗначений и заполняй его и смотри ищи в нем на предмет повтора!
24 ПроходилМимо
 
21.10.04
11:52
(21) в (1) пишет, что Записать() не работает.
Вот и говорю что не влияет. Работает нормально и записывает последнее что нашел.
Что не ясно?
25 YF
 
21.10.04
11:53
Всем спасибо!

Ошибка в ДНК оказалась

Бухи ведь сторнирование делают отриц. СчФ по тем же договорам

Звиняйте все что доставал. Хотя может полезно иногда голову поломать :)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс