Программное проведение "Действие не может выполняться в режиме загрузки данных"

1. nothing 16.10.21 16:46 Сейчас в теме
Подскажите, как провести документ
Пока Выборка.Следующий() Цикл
            Док = Выборка.Регистратор.ПолучитьОбъект();
            Если ТипЗнч(Док) = Тип("ДокументОбъект.НачальнаяШтатнаяРасстановка") Тогда
                
                Отбор = Новый Структура();
                Отбор.Вставить("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);    
                НайденныеСтроки = Док.Сотрудники.НайтиСтроки(Отбор);
                Для каждого Стр Из НайденныеСтроки Цикл
                    Стр.Должность = Объект.Должность;
                КонецЦикла; 
            КонецЕсли;

            Док.ОбменДанными.Загрузка = Истина;
            Док.Записать(РежимЗаписиДокумента.Проведение);
        КонецЦикла;
        

Показать


Текст ошибки:

Действие не может выполняться в режиме загрузки данных
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(358)}: Док.Записать(РежимЗаписиДокумента.Проведение);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();

по причине:
Действие не может выполняться в режиме загрузки данных
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
54. kalach2002 12.07.23 12:11 Сейчас в теме
(1) ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Истина);
//Док.ОбменДанными.Загрузка = Истина;
Док.Записать(РежимЗаписиДокумента.Проведение);
ДатыЗапретаИзменения.ОтключитьПроверкуДатЗапрета(Ложь);
55. jan-pechka 435 30.11.23 00:10 Сейчас в теме
(1)*В приемнике: если нужно перенести в режиме загрузки, то:
        НовДок.ОбменДанными.Загрузка = Истина
            НовДок.Проведен = Док.Реквизиты.Проведен; 
            НовДок.Записать();


а потом вставить перенесенные с другой базы движения документа:
Для Каждого НаборЗаписей Из Док.МассивНаборовЗаписейРегистров Цикл
                 НаборЗаписей.Записать();
            КонецЦикла;


при этом, если есть движения для Хозрасчетного регистра, то для него отдельно нужно записать движения, т.к. субконто при обычной сериализации будут падать в ошибку...
п.с.Если же вы не хотите переносить движения регистров из другой базы, и проводить документ именно в базе-приемнике по его регистрам (н-р, потому что некоторые регистры в документах разных баз могут отличаться по своей структуре), то признак НовДок.ОбменДанными.Загрузка = Истина; придется снять, при этом у пользователя, выполняющего загрузку - должен быть открыт период и достаточные права на действия с объектами.
2. t.v.s. 113 16.10.21 18:25 Сейчас в теме
Док.ОбменДанными.Загрузка = Истина;


Вот это - убрать
3. nothing 16.10.21 21:05 Сейчас в теме
(2) Тогда не проведется по другой причине - период закрыт для пользователя.
4. Swetlana 27 16.10.21 21:33 Сейчас в теме
(3) Открыть период для пользователя?
5. nothing 16.10.21 21:38 Сейчас в теме
(4)
Открыть период для пользователя?

Уточняю задачу - требуется проводить в закрытом периоде.
Просто записывать - не вариант, так как в РС КадроваяИсторияИнтревальный запись не изменяется, а нужно.
6. nomad_irk 81 17.10.21 00:29 Сейчас в теме
(5)вы уж определитесь, что вы хотите сделать: полностью самостоятельно обновить документ + его движения, либо таки использовать типовой механизм изменения документа с последующим изменением всех его движений с помощью проведения.
8. nothing 17.10.21 08:35 Сейчас в теме
(6) Мне нужно провести документ (в закрытом периоде) с последующим изменением всех его движений. Где Вы увидели противоречия?
10. Release 17.10.21 09:29 Сейчас в теме
(8) Противоречие в том, что "Закрытие периода" служит как раз для того, чтобы нельзя было
провести документ (в закрытом периоде) с последующим изменением всех его движений.

1. Откройте конкретному пользователю, период и пусть изменяет и проводит. Тем более, что по коду выглядит, что изменяется не один документ, а некоторое неизвестное количество.
2. Если это нужно вам, то для роли Администратор (если ничего не поменялось) закрытие периода игнорируется.
3. Если уж совсем "припекло" и другие варианты неподходят (например, по религиозным убеждениям), то можно сделать так:
- удалить (как написали в (2)) строку:
Док.ОбменДанными.Загрузка = Истина;
- цикл обернуть в УстановитьПривилегированныйРежим(<Включить>):
УстановитьПривилегированныйРежим(Истина)
Пока Выборка.Следующий() Цикл
    ...
    Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь)
11. nomad_irk 81 17.10.21 10:08 Сейчас в теме
(8)Противоречие - в
Док.ОбменДанными.Загрузка = Истина;

т.к. оно отключает изменение всех движений.

Решением в вашем случае будет открытие периода для пользователя, под которым выполняется перепроведение документов.
13. nothing 17.10.21 10:26 Сейчас в теме
(11) ОК, спасибо! Только проблема с проведением осталась.
НачальнаяШтатанаяРасстановка - док, который требуется провести.

Док.ОбменДанными.Загрузка = Истина; - убрала
Период открыла. Документ под пользователем интерактивно проводится, а программно нет. Помогите разобраться.

Текст ошибки:


{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!

по причине:
Нарушение прав доступа!
15. Release 17.10.21 10:53 Сейчас в теме
(13)
Нарушение прав доступа!

Либо период для данного пользователя с его ролями всё же не открыт, либо у данного пользователя, от которого запускается обработка, нет прав на данные операции с обрабатываемым документом.
Если это разовое действие, то можно попробовать использовать предложенный мной 3-й вариант. Но, у пользователя нужно тогда временно отключить защиту от опасных действий.
16. nothing 17.10.21 10:59 Сейчас в теме
(15)
Либо период для данного пользователя с его ролями всё же не открыт, либо у данного пользователя, от которого запускается обработка, нет прав на данные операции с обрабатываемым документом.

Интерактивно под пользователем документ проводится.
Если Док.Записать() тоже проводится, но при этом не изменяется в РС значение одного реквизита.
Тут же провожу документ интерактивно под "тем самым" пользователем, всё ОК.
Не разовое действие.
20. Release 17.10.21 11:08 Сейчас в теме
(16) Тогда, посмотрите в журнале регистрации, на какой тип объекта (документ, РС и т.п.) не хватает прав и разбирайтесь конкретно с ним - смотрите, какие у ролей пользователя права для него.
22. nothing 17.10.21 11:11 Сейчас в теме
(20) Если бы не хватало прав, интерактивно не провелся бы, а проводится.
23. Release 17.10.21 11:15 Сейчас в теме
(22) Еще раз. Текст ошибки, приведенный вами, прямо утверждает, что не хватает прав:
Текст ошибки:
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!

по причине:
Нарушение прав доступа!

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

Смотрите "Журнал регистрации".
25. nothing 17.10.21 11:28 Сейчас в теме
(23) По ходу Вы правы
Прикрепленные файлы:
27. Release 17.10.21 11:33 Сейчас в теме
(25) А подробнее эту строку можно показать?
29. nothing 17.10.21 11:36 Сейчас в теме
31. Release 17.10.21 11:39 Сейчас в теме
(29) Со скрина, которая выделена. Где "Доступ. Отказ в доступе".
32. nothing 17.10.21 11:44 Сейчас в теме
(31)
Прикрепленные файлы:
33. Release 17.10.21 11:48 Сейчас в теме
(32) Вот, теперь осталось определить, какие роли есть у пользователя и есть ли у них право на изменение данного регистра.
Если прав нет, то добавить соответствующую роль.

Кстати, если не секрет, какие роли у пользователя от которого запускаете обработку?

З.Ы.
Хотя мне всё же непонятно, как может быть какое-либо ограничение прав при установке привилегированного режима?
34. nothing 17.10.21 11:53 Сейчас в теме
(33) Какой уж тут секрет может быть.
Доп.права - это подозреваю нетиповая, для нетиповых же объектов.
Прикрепленные файлы:
35. Release 17.10.21 12:10 Сейчас в теме
(34) Интересно, я посмотрел, права на изменения по этому регистру есть только у роли "Полные права".
Это на типовой Зарплата и управление персоналом, редакция 3.1 (3.1.19.48) .
36. Release 17.10.21 12:28 Сейчас в теме
(34) А у пользователя защита от опасных действий?
37. nothing 17.10.21 12:39 Сейчас в теме
(36) Да, установлен флаг
Флаг сняла, запустила заново предприятие, но не помогло
39. Release 17.10.21 12:52 Сейчас в теме
(37) А обработку запускаете из "Дополнительные отчеты и обработки"?
40. nothing 17.10.21 12:53 Сейчас в теме
(39) Нет, Файл - Открыть - с отладчиком работаю. Попробую как доп.
41. Release 17.10.21 13:00 Сейчас в теме
(40) Нет, ненужно. Я думал проблема как раз в этом - БСП не дает открывать обработки в небезопасном режиме без роли "Администратор системы".
17. nomad_irk 81 17.10.21 10:59 Сейчас в теме
(13)Проблемы с правами. Либо дайте полные права, либо включайте ПривилегированныйРежим в обработке.
19. nothing 17.10.21 11:08 Сейчас в теме
(17) ПривилегированныйРежим включен в процедуре
21. Release 17.10.21 11:11 Сейчас в теме
(19) Это точно? Покажите ваш текущий код. Такого просто не должно быть, если конфигурация типовая.
24. nothing 17.10.21 11:18 Сейчас в теме
(21)
Покажите ваш текущий код

&НаСервере
Процедура ИсправитьДолжностьВНШРНаСервере()
    УстановитьПривилегированныйРежим(Истина);
    Если ЗначениеЗаполнено(Объект.ПозицияТекущая) Тогда
        
//Изменение справочника Штатное расписание
        ЭлементШР = Объект.ПозицияТекущая.ПолучитьОбъект();
        ЭлементШР.Должность = Объект.Должность;
        Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
            ЭлементШР.Подразделение = Объект.Подразделение;
        КонецЕсли; 
        ЭлементШР.Наименование = Строка(ЭлементШР.Должность) + " /" + Строка(ЭлементШР.Подразделение) + "/";
        ЭлементШР.Записать();
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    ИзменениеШтатногоРасписанияПозиции.Ссылка КАК ДокПозции,
        |    ИзменениеШтатногоРасписанияПозиции.Должность КАК Должность,
        |    ИзменениеШтатногоРасписанияПозиции.Подразделение КАК Подразделение,
        |    ИзменениеШтатногоРасписанияПозиции.Позиция КАК Позиция
        |ИЗ
        |    Документ.ИзменениеШтатногоРасписания.Позиции КАК ИзменениеШтатногоРасписанияПозиции
        |ГДЕ
        |    ИзменениеШтатногоРасписанияПозиции.Позиция = &Позиция
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    УтверждениеШтатногоРасписанияПозиции.Ссылка,
        |    УтверждениеШтатногоРасписанияПозиции.Должность,
        |    УтверждениеШтатногоРасписанияПозиции.Подразделение,
        |    УтверждениеШтатногоРасписанияПозиции.Позиция
        |ИЗ
        |    Документ.УтверждениеШтатногоРасписания.Позиции КАК УтверждениеШтатногоРасписанияПозиции
        |ГДЕ
        |    УтверждениеШтатногоРасписанияПозиции.Позиция = &Позиция";
        
        Запрос.УстановитьПараметр("Позиция", Объект.ПозицияТекущая);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            ДокПозции = Выборка.ДокПозции.ПолучитьОбъект();
            НайденнаяПозиция = ДокПозции.Позиции.Найти(Объект.ПозицияТекущая, "Позиция");
            НайденнаяПозиция.Должность = Объект.Должность;
            Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
                НайденнаяПозиция.Подразделение = Объект.Подразделение;
            КонецЕсли; 
            ДокПозции.ОбменДанными.Загрузка = Истина; 
            ДокПозции.Записать();
        КонецЦикла;
        
//Изменение в кадровых документах (НШР,Увольнение, и т.д.)        
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |    КадроваяИсторияСотрудников.Регистратор КАК Регистратор
        |ИЗ
        |    РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
        |ГДЕ
        |    КадроваяИсторияСотрудников.ДолжностьПоШтатномуРасписанию = &ДолжностьПоШтатномуРасписанию";
        
        Запрос.УстановитьПараметр("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Док = Выборка.Регистратор.ПолучитьОбъект();
            Если ТипЗнч(Док) = Тип("ДокументОбъект.НачальнаяШтатнаяРасстановка") Тогда
                
                Отбор = Новый Структура();
                Отбор.Вставить("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);    
                НайденныеСтроки = Док.Сотрудники.НайтиСтроки(Отбор);
                Для каждого Стр Из НайденныеСтроки Цикл
                    Стр.Должность = Объект.Должность;
                КонецЦикла; 
            КонецЕсли;

            //Док.Записать(РежимЗаписиДокумента.Проведение);  - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
            Док.Записать();
        КонецЦикла;
        
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Ложь);
    Объект.ПозицияТекущая = Справочники.ШтатноеРасписание.ПустаяСсылка();
    
КонецПроцедуры

Показать
26. Release 17.10.21 11:31 Сейчас в теме
(24) Я бы включал привилегированный режим только перед циклами записи, а не на весь блок выполнения. Ну, да ладно.

Всё же оптимально посмотреть журнал регистрации. Если вам трудно разобраться, по возможности, посмотрите его и выложите скрин со строками отказа (событие "Ошибка выполнения") при данной операции.
28. nothing 17.10.21 11:35 Сейчас в теме
(26)
Я бы включал привилегированный режим только перед циклами записи, а не на весь блок выполнения

Спасибо, воспользуюсь рекомендацией - "я не волшебник (что очевидно) я только учусь"
30. nothing 17.10.21 11:37 Сейчас в теме
(26) уже выложила скрин (25)
12. nomad_irk 81 17.10.21 10:11 Сейчас в теме
(5) Я вам больше скажу, повторное проведение документа может не дать ожидаемого результата и необходимо выполнять распроведение документа с последующим проведением.
14. nothing 17.10.21 10:28 Сейчас в теме
(12) Кстати, да, я такое замечала. Но пока не получается провести с учетом всех рекомендаций (13).
9. gybson 17.10.21 09:10 Сейчас в теме
(3)У вас была одна причина по которой не проведется, Вы сделали две. Как вариант можно попробовать еще пометку удаления поставить и посмотреть, может так лучше будет :)
7. DenisCh 17.10.21 07:14 Сейчас в теме
В механизЬме дат запрета есть возможность конкретному пользователю перенести дату.
Проведение в закрытом периоде противоречит самой идее закрытости периода.
Так что тут, как в том анекдоте - или трусики, или крестик.
Или мы проводим документ, открыв период, или не лезем в закрытый период.
38. nothing 17.10.21 12:47 Сейчас в теме
Хотела по одному регистру провести (нет необходимости по всем), но и тут провал, ошибка та же "Нарушение прав доступа". Может кто подскажет вариант обхода.
Процедура ПровестиПоРегистру(ДокСсылка, КадроваяИсторияСотрудников)
    ДокОбъект = ДокСсылка.ПолучитьОбъект();

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

    //здесь отменяем проведение документа, чтобы ничего не изменилось
    //в прошлых периодах (по другим регистрам)
    ОтменитьТранзакцию();

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

Показать
45. Release 17.10.21 13:44 Сейчас в теме
(38) Я что-то не понял, чем это в (24)
Док.Записать(РежимЗаписиДокумента.Проведение);  - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
отличается от этого в (38)
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
???

(38)
ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();

КоллекцияДвижений (RegisterRecordsCollection)
Элементы коллекции:
Наборы записей регистров.
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются наборы записей регистров.
Возможно обращение к коллекции посредством оператора [...]. В качестве аргумента передается номер.

А у вас что?
Почему тогда не просто:
ДокОбъект.Движения.КадроваяИсторияСотрудников.Прочитать();
???
47. nothing 17.10.21 14:00 Сейчас в теме
(45)
(38) Я что-то не понял, чем это в (24)
Док.Записать(РежимЗаписиДокумента.Проведение); - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
отличается от этого в (38)
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
???

Ничем не отличается. До того, как обработку запускала как доп. это не работало. Теперь проводится, комментарий неактуален.

в 38 попытка проводить по одному регистру.
42. nothing 17.10.21 13:14 Сейчас в теме
(41) Так проводится - ура! Спасибо!

Только теперь хочется по одному регистру проводить, но что-то не так делаю. Пример нашла по запросу "1с проведение документа по одному регистру" ссылку, полагаю, не получится отправить. Код в 38 посте.

Ругается на строку: ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();

Получение элемента по индексу для значения не определено
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(370)}: ДокОбъект.Движения[КадроваяИсторияСотрудников].Прочитать();
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(353)}: ПровестиПоРегистру(Док.Ссылка,РегистрыСведений.КадроваяИсторияСотрудников);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();


Что сделала не так?
43. Release 17.10.21 13:24 Сейчас в теме
(42) Так, это как? С ролью "Администратор системы"? Если так, то это плохо, кому попало такие роли раздавать.
Или речь о другом?
44. nothing 17.10.21 13:28 Сейчас в теме
(43) Ни в коем случае, Администратора системы у пользователя нет.
Речь о том, что если обработку открывать как внешнюю - не проводит документ, если как дополнительную - проводит. Не могу объяснить этот феномен.
46. Release 17.10.21 13:48 Сейчас в теме
(44)
Речь о том, что если обработку открывать как внешнюю - не проводит документ, если как дополнительную - проводит. Не могу объяснить этот феномен.

Если я правильно помню, БСП работает с незарегистрированными обработками и не установленными разрешениями для неё в сведениях о ней только в безопасном режиме.
48. nomad_irk 81 17.10.21 15:33 Сейчас в теме
(42)Нужно делать так:
ДокОбъект.Движения["КадроваяИсторияСотрудников"].Прочитать()
49. EVKash 16 17.10.21 21:08 Сейчас в теме
(47) Да сделайте вы уже проведение в общем привилегированном модуле. Там из параметров сеанса удаляете дату запрета изменения данных, а после выполнения обратно устанавливаете. Можно через расширение.
50. nothing 17.10.21 21:18 Сейчас в теме
(49)
Да сделайте вы уже проведение в общем привилегированном модуле

Как? Пожалуйста объясните подробнее, желательно с примерами.
Объект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения", Истина);

В модуле формы мне этот код не поможет?
51. EVKash 16 17.10.21 21:21 Сейчас в теме
(50) Это сейчас на сон грядущий... Надо открыть конфигуратор и потратить 10-15 минут... Лень хотя бы без $m. Завтра после 10 по мск могу написать.
52. nothing 18.10.21 11:01 Сейчас в теме
(51) провела, но не в привилегированном модуле. Интересно, конечно, увидеть Ваш вариант
53. EVKash 16 18.10.21 14:07 Сейчас в теме
(52) Привилегированные модули в расширениях не создаются...
Но если отключить безопасный режим, то работает такой код.
Хотя он работает и в самой доп обработке, если она подключена в доп обработки с "не безопасным" режимом.
    УстановитьПривилегированныйРежим(Истина);
    ДокументОбъект = ДокСсылка.ПолучитьОбъект();
    ПропуститьПроверкуЗапретаИзменения = ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения;
    ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения = Истина;
    ДокументОбъект.Записать(РежимЗаписи);
    ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения = ПропуститьПроверкуЗапретаИзменения;
    УстановитьПривилегированныйРежим(Ложь);


проверял в УТ, но в ЗУПе должно быть аналогично.
kabantus; IVaN764u36567; nothing; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот