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

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

    Для Каждого ЭлементРезультата из Результат Цикл    
        ДокументОбъект = ЭлементРезультата.ДокументДляПерепроведения.ПолучитьОбъект();
        НачатьТранзакцию();

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

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

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

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

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

Идет в процедуру "ПередЗаписью()", оттуда через кучу процедур и проверок в ПередЗаписьюДокументаУстановкаАвтораПередЗаписью()

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

Вы код смотрите, но ни черта не видите.
Запустите отладчик и выполните свое регламентное задание по отладчику.
...Отладчик может... Делайте это в тестовой
30 Ly_Alena
 
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) Проверьте подписка на события, бывает так, что туда чего лепят :)
33 DrShad
 
21.10.16
08:39
(30) сделай проще, у каждого объекта есть структура ДополнительныеСвойства, вставь в нее какой-то свой ключ (к примеру "РегламентноеПроведение")

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

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

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

НаборЗаписей = РегистрыНакопления.ДебиторыКредиторыСнабжение.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Регистратор.Установить(ЭлементРезультата.ЗаказПоставщику);
        
        НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
        
        НаборЗаписей.Записать();
63 Ly_Alena
 
31.10.16
18:50
(62) процедура не в общем модуле. я вас не так поняла. Процедура записи в модуле документа при проведении и по нажатию кнопки.
64 1sanekmaloi1
 
31.10.16
18:52
(63)Может программиста позвать?
65 Ly_Alena
 
31.10.16
18:52
(64)  Давайте позовем )
66 Ly_Alena
 
31.10.16
18:54
(64) только чур не такого "пропиши пользователя регламентному заданию"
67 Ly_Alena
 
31.10.16
19:03
Как-то не откликаются на зов программисты...
68 1sanekmaloi1
 
31.10.16
19:07
(67)Может зовете неправильно?
Хотя для решения вашей задачи уже все расписано как нужно сделать.
69 Ly_Alena
 
31.10.16
19:08
(68) а если без общего модуля?
70 1sanekmaloi1
 
31.10.16
19:10
(69)Разрешаю и без общего, скопируйте код из модуля объекта документа, который формирует набор для данного регистра и используйте этот кусок в регламентном.
71 1sanekmaloi1
 
31.10.16
19:12
+(70) Использовать проведение и откат транзакции для получения тз это как "на такси в булошную"
72 1sanekmaloi1
 
31.10.16
19:14
+(71)Кстати вы так и не ответили зачем в вашей конструкции проводится документ 2 раза?один раз в попытке и второй раз без попытки?
73 Ly_Alena
 
31.10.16
19:14
(71) Была такая мысль, но потом наткнулась на перепроведение документов только по нужному регистру и возрадовалась.
74 craxx
 
31.10.16
19:16
(73) ЧТо-то в коде логику не улавливаю
ОтменитьТранзакцию() там зачем??
75 Ly_Alena
 
31.10.16
19:16
(72) по факту не проводится ни разу как мне надо. Это уже мудрила
76 craxx
 
31.10.16
19:22
(74) а понял. там надо копать модуль набора записей регистра накоплений. походу там тоже подвязка под дату запрета. и это.. я бы набор записей в ТЗ выгружал, а потом уже транзакцию отменял. как-то так.
77 craxx
 
31.10.16
19:23
(76) + там надо перед выгрузкой прочитать набор записей.
78 Ly_Alena
 
31.10.16
19:30
(77) перед выгрузкой итак читает, после выгрузки отменяет.
(37)
79 Ly_Alena
 
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
Не уверена что отсюда взято, но пример кода был такой.
80 Ly_Alena
 
31.10.16
19:51
С внешней обработки все работает...
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой