Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Перепроведение документа через регламентное задание.

Перепроведение документа через регламентное задание.
Я
   Ly_Alena
 
20.10.16 - 10:13
Добрый день! Появилась необходимость перепроводить документы, в том числе закрытого периода, но только по одному регистру через регламентное задание. На одном сайте нашла пример как это можно осуществить. В модуле регламентных заданий в процедуре:
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДокументДляПерепроведения.Ссылка КАК ДокументДляПерепроведения
        |ИЗ
        |    Документ.ДокументДляПерепроведения КАК ДокументДляПерепроведения
        |ГДЕ
        |    ДокументДляПерепроведения.ПометкаУдаления = ЛОЖЬ
        |    И ДокументДляПерепроведения.Проведен = ИСТИНА
        |    И ДокументДляПерепроведения.ПровестиПоДебиторам = ИСТИНА";

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

    Для Каждого ЭлементРезультата из Результат Цикл    
        ДокументОбъект = ЭлементРезультата.ДокументДляПерепроведения.ПолучитьОбъект();
        НачатьТранзакцию();
 
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        ДокументОбъект.Движения["ИмяРегистра"].Прочитать();
        ТаблицаДвиженийРегистра = ДокументОбъект.Движения["ИмяРегистра"].Выгрузить();
     
        //здесь отменяем проведение документа, чтобы ничего не изменилось

        //в прошлых периодах (по другим регистрам)

        ОтменитьТранзакцию();
     
        НаборЗаписей = РегистрыНакопления["ИмяРегистра"].СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(ДокументОбъект);
        НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
        НаборЗаписей.Записать();
        
    КонецЦикла;

Выдает ошибку:"{ОбщийМодуль.МодульРегламентныхЗаданий.Модуль(983)}: Ошибка при вызове метода контекста (Записать)
по причине:

по причине:
Не удалось провести «Документ К0000000209 от 05.02.2016 10:33:23″!"
 
 
   Boleev
 
1 - 20.10.16 - 10:16
продолжайте наблюдение
   iceman2112
 
2 - 20.10.16 - 10:17
от нас что ннвжн?
   iceman2112
 
3 - 20.10.16 - 10:17
нужно*
   Ly_Alena
 
4 - 20.10.16 - 10:19
(2) Нужно сказать почему выходит ошибка на метод "Записать" и как исправить ее.
   Boleev
 
5 - 20.10.16 - 10:23
(4) 100$
   Ly_Alena
 
6 - 20.10.16 - 10:32
(5) какой высокий у вас прайс )
   Mankubus
 
7 - 20.10.16 - 10:37
(0) отладчик в руки и вперед
   Ly_Alena
 
8 - 20.10.16 - 10:43
(7) что может показать мне отладчик на метод записать()?
   DrShad
 
9 - 20.10.16 - 10:45
(8) попадешь в процедуры ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения, ОбработкаПроведения

и там найдешь свою ошибку
   Это_mike
 
10 - 20.10.16 - 10:48
(9) разве в этих процедурах анализируется ДНК?
 
 Рекламное место пустует
   DrShad
 
11 - 20.10.16 - 10:56
(10) еще как
   Dmitrii
 
12 - 20.10.16 - 11:14
(0) Попробуйте взять Документ К0000000209 от 05.02.2016 10:33:23 и провести его вручную (вы ведь на копии тренируетесь).
Наверняка система не даст вам этого сделать. Если повезёт, то получите какое-то осмысленное сообщение об ошибке.
   Альбатрос
 
13 - 20.10.16 - 11:28
Чот я смысла кода не понял. Проводим док, берем его движения и  
их же опять записываем? Или что?
   catena
 
14 - 20.10.16 - 11:37
(13)Записываем движения только одного регистра. Чтобы остальные не послетали.
   Wirtuozzz
 
15 - 20.10.16 - 11:41
Предлагаю запись поместить в Попытку и по исключению записывать в Журнал регистрации ОписаниеОшибки(); будет дана более детальная инфа, для раздумий.
   Ly_Alena
 
16 - 20.10.16 - 11:49
(15) Спасибо, попробую.
   Ly_Alena
 
17 - 20.10.16 - 13:04
Теперь новый уровень - говорит что проводит все нормально. но в регистре записей нет...
Если провести документ вручную - записи есть в регистре.
   Ly_Alena
 
18 - 20.10.16 - 13:14
(17) В коде регламетного ничего не поменялось.
   Lexey_
 
19 - 20.10.16 - 13:14
(17) НаборЗаписей.Отбор.Регистратор.Установить(ДокументОбъект); - тип неправильный?
   Ly_Alena
 
20 - 20.10.16 - 13:17
(19) вместо ДокументОбъект стоит ЭлементРезультата.ДокументДляПерепроведения

Ссылку передает
   eskor
 
21 - 20.10.16 - 13:19
Отладчик и еще раз отладчик. Что оказалось в наборе записей?
   Ly_Alena
 
22 - 21.10.16 - 06:17
Как отключить все проверки типа ПередЗаписью?
   Mankubus
 
23 - 21.10.16 - 06:21
(22) ОбменДанными.Загрузка = Истина
   Ly_Alena
 
24 - 21.10.16 - 06:55
(23) Спасибо! Кажется получилось. Буду проверять при изменении данных.
   ЧеловекДуши
 
25 - 21.10.16 - 07:17
(18) Лена код документа проверь :)
   ЧеловекДуши
 
26 - 21.10.16 - 07:18
(24) За что спасибо?
Документ при этом не проводится. А записи в регистры нужно уже формировать самой, т.е. кодом из какого либо модуля :)
   Ly_Alena
 
27 - 21.10.16 - 07:48
(26) Да... вижу. Мое имя Алена.
Код документа нормальный - по кнопке проводится все хорошо. С регламентным засада.
   Ly_Alena
 
28 - 21.10.16 - 08:16
На строчке:
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Идет в процедуру "ПередЗаписью()", оттуда через кучу процедур и проверок в ПередЗаписьюДокументаУстановкаАвтораПередЗаписью()

После чего выходит ошибка:
"{Отчет.ПроверкаРегламентногоНаПроведениеЗаказовПоставщиков.Форма.ФормаОтчета.Форма(33)}: Ошибка при вызове метода контекста (Записать)
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!"
   ЧеловекДуши
 
29 - 21.10.16 - 08:19
(28) Лена, Алена, побоку, ... Хоть Евдакия...

Вы код смотрите, но ни черта не видите.
Запустите отладчик и выполните свое регламентное задание по отладчику.
...Отладчик может... Делайте это в тестовой
   Ly_Alena
 
30 - 21.10.16 - 08:24
(29) Естественно я это делаю через отладчик, а не силой мысли!
   ЧеловекДуши
 
31 - 21.10.16 - 08:24
+ 1. Запускаете конфигуратор
2. Ставите точку останова на том месте кода, который хотели бы отладить.
3. Запускаете отладку.
4. Заходите в консоль регламентных задач - Это такая обработка
5. Выполняете свою регламентную на сервере, не перепутайте.
   - Сдается мне, что у вас есть принципиальное отличие, где выполняется код... Проще говоря, у вас ГУАНО код в модуле документа :)
6. Находите свою ошибку
...
20. Как правило ошибка "Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!" предвещает тому, что документ при проведении пишется несколько раз, и криво обрабатывается :)
   ЧеловекДуши
 
32 - 21.10.16 - 08:28
+(30) Проверьте подписка на события, бывает так, что туда чего лепят :)
   DrShad
 
33 - 21.10.16 - 08:39
(30) сделай проще, у каждого объекта есть структура ДополнительныеСвойства, вставь в нее какой-то свой ключ (к примеру "РегламентноеПроведение")

далее в процедурах модуля объекта ПриЗаписи, ПередЗаписью и ОбработкаПроверкиЗаполнения вставь условие наподобии проверки ОбменДанными.Загрузка

и будет тебе счастие
 
 
   Ly_Alena
 
34 - 21.10.16 - 08:41
(32) (33) Спасибо! Я нашла ошибку - в процедуре проведения еще менялся реквизит и записывался. Закомментировала в доке, перенесла в регламентное и все провелось. Буду проверять как ведут себя другие регистры.
   Ly_Alena
 
35 - 31.10.16 - 16:54
Хотелось бы возобновить тему.
регламентное запускается, все проходит успешно, в журнале регистрации в нужном мне регистре статус транзакции "Зафиксирована", а записей в регистре нет. Фоновое задание завершено успешно.
Делаю внешнюю обработку - запихиваю туда код - запускаю - все проходит как по маслу и запись в регистре появляется. В чем может быть дело?
   eddy_n
 
36 - 31.10.16 - 17:33
(35) Взведён признак Записывать Набора записей регистра в процедуре фонового задания?
   Ly_Alena
 
37 - 31.10.16 - 17:37
(36)
ДокументОбъект = ЭлементРезультата.ЗаказПоставщику.ПолучитьОбъект();
        Сообщить(ЭлементРезультата.ЗаказПоставщику);
        НачатьТранзакцию();
        
        Попытка
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            Сообщить("Не удалось провести документ: " + ЭлементРезультата.ЗаказПоставщику);
            
            ОтменитьТранзакцию();
            Продолжить;
        КонецПопытки;
        
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        ДокументОбъект.Движения[ИмяРегистра].Прочитать();
        
        ТаблицаДвиженийРегистра = ДокументОбъект.Движения[ИмяРегистра].Выгрузить();
     
        //здесь отменяем проведение документа, чтобы ничего не изменилось

        //в прошлых периодах (по другим регистрам)

        ОтменитьТранзакцию();        
        
        НаборЗаписей = РегистрыНакопления.ДебиторыКредиторыСнабжение.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(ЭлементРезультата.ЗаказПоставщику);
        
        НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
        
        НаборЗаписей.Записать();
        ЗафиксироватьТранзакцию();
   Ly_Alena
 
38 - 31.10.16 - 17:38
Последняя строка ЗафиксироватьТранзакцию() уже дописано от безисходности.
   aleks_default
 
39 - 31.10.16 - 17:47
Фоновое задание под каким пользователем? Есть у него права на проведение документа?
   Ly_Alena
 
40 - 31.10.16 - 17:48
Фоновое запускается с сервера как я понимаю
   aleks_default
 
41 - 31.10.16 - 17:48
(40)И что?
   Ly_Alena
 
42 - 31.10.16 - 17:50
(41) фоновое запускается разве вне зависимости от пользователей?
Как посмотреть?
   aleks_default
 
43 - 31.10.16 - 17:51
в консоли рег. заданий.
   разработчик 1с
 
44 - 31.10.16 - 17:53
дата запрета на пользователя заданий стоит
   Ly_Alena
 
45 - 31.10.16 - 17:53
(43) там пользователя нет
   aleks_default
 
46 - 31.10.16 - 17:58
ну значит нужно указать
   Ly_Alena
 
47 - 31.10.16 - 17:59
(46) у меня ни для одного регламентного нет пользователя и как-то работает...
   Ly_Alena
 
48 - 31.10.16 - 18:01
(46) Хорошо, попробуем с пользователем - как его прописать?
   Ly_Alena
 
49 - 31.10.16 - 18:05
Если пользователь регламентного задания не указан, то выполнение происходит с правами, которые определяются набором ролей, указанных в свойстве конфигурации ОсновныеРоли. В том случае, если в этом свойстве не указано ни одной роли, выполнение происходит без ограничения прав доступа.
 
 Рекламное место пустует
   Жан Пердежон
 
50 - 31.10.16 - 18:07
(37)  
у тебя
ОтменитьТранзакцию();        
всегда происходить что ли безусловно?
было бы удивительно, если бы что-то записалось
   Ly_Alena
 
51 - 31.10.16 - 18:12
(50) да всегда - чтобы записи не менялись в прошлом периоде.
С внешней обработки все работает.
   Ly_Alena
 
52 - 31.10.16 - 18:12
(50) процедура проводит документ только по одному регистру.
   Жан Пердежон
 
53 - 31.10.16 - 18:13
(52) смотри тогда журнал регистрации;
если там ничего нет - пиши туда сама ОписаниеОшибки() вместо сообщить
   Жан Пердежон
 
54 - 31.10.16 - 18:18
(53)+ для набора записей кстати тоже работает
ОбменДанными.Загрузка = Истина;
   Ly_Alena
 
55 - 31.10.16 - 18:24
(53) выше писала что по журналу - все пишет и нет никаких ошибок.
   1sanekmaloi1
 
56 - 31.10.16 - 18:27
А весь этот ужас нельзя переписать?
Зачем 2 раза проводится документ?
Нельзя сформировать таблицу для регистра и записать набор?
   Ly_Alena
 
57 - 31.10.16 - 18:31
(56)в документ пишутся ссылки на документы-движения приход/расход. в документе есть изменяемые реквизиты. эти реквизиты пишутся вместе с данными документов-движений в РН. Когда период документов-движений закрыт и перепровести документы нельзя - можно переповести мой документ и он запишет то что нужно по этим документам в РН. Смысл в том чтобы этот документ перезаписывал только в один регистр, по другим данные не перепроводил.
   Ly_Alena
 
58 - 31.10.16 - 18:32
(56)  НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра); 
разве это не то, о чем Вы говорите?
   1sanekmaloi1
 
59 - 31.10.16 - 18:36
Я говорю что наверняка в модуле объекта дока есть что наподобие:
ОбщийМодуль.СформироватьДвижения() или
ОбщийМодуль.СформироватьДвиженеиПоРегистру()
или аналог , процедура для формирования необходимой таблицы для движений документа по этому регистру.
И ее можно адаптировать для получения ТЗ(при этом документ не нужно записывать,проводить и прочее)
а эту ТЗ уже в регистр.
   Ly_Alena
 
60 - 31.10.16 - 18:39
(59) есть и по кнопке по регистру перепроводится. Но тогда пользователю нужно будет заходить в документ и перепроводить его. Кто-то забыл это сделать например. Пусть машина за день записывает все движения.
Если я Вас правильно поняла.
   1sanekmaloi1
 
61 - 31.10.16 - 18:42
(60)Не возражаю, пусть машина за день записывает все движения.
   1sanekmaloi1
 
62 - 31.10.16 - 18:48
Вообще то я имел ввиду чтобы регламентное выглядело вот так:

ТаблицаДвиженийРегистра = ОбщийМодуль.ПолучитьТаблицуДляРегистраДебиторы(ЭлементРезультата.ЗаказПоставщику);

НаборЗаписей = РегистрыНакопления.ДебиторыКредиторыСнабжение.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(ЭлементРезультата.ЗаказПоставщику);
        
        НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
        
        НаборЗаписей.Записать();
   Ly_Alena
 
63 - 31.10.16 - 18:50
(62) процедура не в общем модуле. я вас не так поняла. Процедура записи в модуле документа при проведении и по нажатию кнопки.
   1sanekmaloi1
 
64 - 31.10.16 - 18:52
(63)Может программиста позвать?
   Ly_Alena
 
65 - 31.10.16 - 18:52
(64)  Давайте позовем )
   Ly_Alena
 
66 - 31.10.16 - 18:54
(64) только чур не такого "пропиши пользователя регламентному заданию"
   Ly_Alena
 
67 - 31.10.16 - 19:03
Как-то не откликаются на зов программисты...
   1sanekmaloi1
 
68 - 31.10.16 - 19:07
(67)Может зовете неправильно?
Хотя для решения вашей задачи уже все расписано как нужно сделать.
   Ly_Alena
 
69 - 31.10.16 - 19:08
(68) а если без общего модуля?
   1sanekmaloi1
 
70 - 31.10.16 - 19:10
(69)Разрешаю и без общего, скопируйте код из модуля объекта документа, который формирует набор для данного регистра и используйте этот кусок в регламентном.
   1sanekmaloi1
 
71 - 31.10.16 - 19:12
+(70) Использовать проведение и откат транзакции для получения тз это как "на такси в булошную"
   1sanekmaloi1
 
72 - 31.10.16 - 19:14
+(71)Кстати вы так и не ответили зачем в вашей конструкции проводится документ 2 раза?один раз в попытке и второй раз без попытки?
   Ly_Alena
 
73 - 31.10.16 - 19:14
(71) Была такая мысль, но потом наткнулась на перепроведение документов только по нужному регистру и возрадовалась.
   craxx
 
74 - 31.10.16 - 19:16
(73) ЧТо-то в коде логику не улавливаю
ОтменитьТранзакцию() там зачем??
   Ly_Alena
 
75 - 31.10.16 - 19:16
(72) по факту не проводится ни разу как мне надо. Это уже мудрила
   craxx
 
76 - 31.10.16 - 19:22
(74) а понял. там надо копать модуль набора записей регистра накоплений. походу там тоже подвязка под дату запрета. и это.. я бы набор записей в ТЗ выгружал, а потом уже транзакцию отменял. как-то так.
   craxx
 
77 - 31.10.16 - 19:23
(76) + там надо перед выгрузкой прочитать набор записей.
   Ly_Alena
 
78 - 31.10.16 - 19:30
(77) перед выгрузкой итак читает, после выгрузки отменяет.
(37)
   Ly_Alena
 
79 - 31.10.16 - 19:37
http://zdst.net/1s-8-kak-vypolnit-pereprovedenie-dokumentov-tolko-po-odnomu-registru-sohraniv-starye-dvizheniya-po-ostalnym-registram/#comment-148
Не уверена что отсюда взято, но пример кода был такой.
   Ly_Alena
 
80 - 31.10.16 - 19:51
С внешней обработки все работает...


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует