Программное проведение "Действие не может выполняться в режиме загрузки данных"
Подскажите, как провести документ
Текст ошибки:
Действие не может выполняться в режиме загрузки данных
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(358)}: Док.Записать(РежимЗаписиДокумента.Проведение);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();
по причине:
Действие не может выполняться в режиме загрузки данных
Пока Выборка.Следующий() Цикл
Док = Выборка.Регистратор.ПолучитьОбъект();
Если ТипЗнч(Док) = Тип("ДокументОбъект.НачальнаяШтатнаяРасстановка") Тогда
Отбор = Новый Структура();
Отбор.Вставить("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);
НайденныеСтроки = Док.Сотрудники.НайтиСтроки(Отбор);
Для каждого Стр Из НайденныеСтроки Цикл
Стр.Должность = Объект.Должность;
КонецЦикла;
КонецЕсли;
Док.ОбменДанными.Загрузка = Истина;
Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
ПоказатьТекст ошибки:
Действие не может выполняться в режиме загрузки данных
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(358)}: Док.Записать(РежимЗаписиДокумента.Проведение);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();
по причине:
Действие не может выполняться в режиме загрузки данных
По теме из базы знаний
- Выгрузка-загрузка любых данных из 1С (и измененных) в XML между похожими конфигурациями (ФАЙЛ, HTTP, COM) ЛЮБЫХ баз 1С 8.1-8.3 с обработкой и поиском данных по произвольным полям поиска
- Выгрузка и загрузка данных XML с гибкими отборами
- Механизмы проведения документов при обмене по универсальному формату
- Самые используемые методы БСП 3.1.9
- Database Compression Tool: Инструмент для свертки и сжатия баз данных 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)*В приемнике: если нужно перенести в режиме загрузки, то:
а потом вставить перенесенные с другой базы движения документа:
при этом, если есть движения для Хозрасчетного регистра, то для него отдельно нужно записать движения, т.к. субконто при обычной сериализации будут падать в ошибку...
п.с.Если же вы не хотите переносить движения регистров из другой базы, и проводить документ именно в базе-приемнике по его регистрам (н-р, потому что некоторые регистры в документах разных баз могут отличаться по своей структуре), то признак НовДок.ОбменДанными.Загрузка = Истина; придется снять, при этом у пользователя, выполняющего загрузку - должен быть открыт период и достаточные права на действия с объектами.
НовДок.ОбменДанными.Загрузка = Истина
НовДок.Проведен = Док.Реквизиты.Проведен;
НовДок.Записать();
а потом вставить перенесенные с другой базы движения документа:
Для Каждого НаборЗаписей Из Док.МассивНаборовЗаписейРегистров Цикл
НаборЗаписей.Записать();
КонецЦикла;
при этом, если есть движения для Хозрасчетного регистра, то для него отдельно нужно записать движения, т.к. субконто при обычной сериализации будут падать в ошибку...
п.с.Если же вы не хотите переносить движения регистров из другой базы, и проводить документ именно в базе-приемнике по его регистрам (н-р, потому что некоторые регистры в документах разных баз могут отличаться по своей структуре), то признак НовДок.ОбменДанными.Загрузка = Истина; придется снять, при этом у пользователя, выполняющего загрузку - должен быть открыт период и достаточные права на действия с объектами.
(8) Противоречие в том, что "Закрытие периода" служит как раз для того, чтобы нельзя было
1. Откройте конкретному пользователю, период и пусть изменяет и проводит. Тем более, что по коду выглядит, что изменяется не один документ, а некоторое неизвестное количество.
2. Если это нужно вам, то для роли Администратор (если ничего не поменялось) закрытие периода игнорируется.
3. Если уж совсем "припекло" и другие варианты неподходят (например, по религиозным убеждениям), то можно сделать так:
- удалить (как написали в (2)) строку: - цикл обернуть в УстановитьПривилегированныйРежим(<Включить>):
провести документ (в закрытом периоде) с последующим изменением всех его движений.
1. Откройте конкретному пользователю, период и пусть изменяет и проводит. Тем более, что по коду выглядит, что изменяется не один документ, а некоторое неизвестное количество.
2. Если это нужно вам, то для роли Администратор (если ничего не поменялось) закрытие периода игнорируется.
3. Если уж совсем "припекло" и другие варианты неподходят (например, по религиозным убеждениям), то можно сделать так:
- удалить (как написали в (2)) строку:
Док.ОбменДанными.Загрузка = Истина;
УстановитьПривилегированныйРежим(Истина)
Пока Выборка.Следующий() Цикл
...
Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь)
(11) ОК, спасибо! Только проблема с проведением осталась.
НачальнаяШтатанаяРасстановка - док, который требуется провести.
Док.ОбменДанными.Загрузка = Истина; - убрала
Период открыла. Документ под пользователем интерактивно проводится, а программно нет. Помогите разобраться.
Текст ошибки:
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!
по причине:
Нарушение прав доступа!
НачальнаяШтатанаяРасстановка - док, который требуется провести.
Док.ОбменДанными.Загрузка = Истина; - убрала
Период открыла. Документ под пользователем интерактивно проводится, а программно нет. Помогите разобраться.
Текст ошибки:
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!
по причине:
Нарушение прав доступа!
(13)
Либо период для данного пользователя с его ролями всё же не открыт, либо у данного пользователя, от которого запускается обработка, нет прав на данные операции с обрабатываемым документом.
Если это разовое действие, то можно попробовать использовать предложенный мной 3-й вариант. Но, у пользователя нужно тогда временно отключить защиту от опасных действий.
Нарушение прав доступа!
Либо период для данного пользователя с его ролями всё же не открыт, либо у данного пользователя, от которого запускается обработка, нет прав на данные операции с обрабатываемым документом.
Если это разовое действие, то можно попробовать использовать предложенный мной 3-й вариант. Но, у пользователя нужно тогда временно отключить защиту от опасных действий.
(15)
Интерактивно под пользователем документ проводится.
Если Док.Записать() тоже проводится, но при этом не изменяется в РС значение одного реквизита.
Тут же провожу документ интерактивно под "тем самым" пользователем, всё ОК.
Не разовое действие.
Либо период для данного пользователя с его ролями всё же не открыт, либо у данного пользователя, от которого запускается обработка, нет прав на данные операции с обрабатываемым документом.
Интерактивно под пользователем документ проводится.
Если Док.Записать() тоже проводится, но при этом не изменяется в РС значение одного реквизита.
Тут же провожу документ интерактивно под "тем самым" пользователем, всё ОК.
Не разовое действие.
(22) Еще раз. Текст ошибки, приведенный вами, прямо утверждает, что не хватает прав:
Значит прав при выполнении обработки у пользователя, от которого эта обработка запускается, не хватает. В отличие, от интерактивного проведения.
Смотрите "Журнал регистрации".
Текст ошибки:
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!
по причине:
Нарушение прав доступа!
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(354)}: Ошибка при вызове метода контекста (Записать)
Док.Записать(РежимЗаписиДокумента.Проведение);
по причине:
Нарушение прав доступа!
по причине:
Нарушение прав доступа!
Значит прав при выполнении обработки у пользователя, от которого эта обработка запускается, не хватает. В отличие, от интерактивного проведения.
Смотрите "Журнал регистрации".
(32) Вот, теперь осталось определить, какие роли есть у пользователя и есть ли у них право на изменение данного регистра.
Если прав нет, то добавить соответствующую роль.
Кстати, если не секрет, какие роли у пользователя от которого запускаете обработку?
З.Ы.
Хотя мне всё же непонятно, как может быть какое-либо ограничение прав при установке привилегированного режима?
Если прав нет, то добавить соответствующую роль.
Кстати, если не секрет, какие роли у пользователя от которого запускаете обработку?
З.Ы.
Хотя мне всё же непонятно, как может быть какое-либо ограничение прав при установке привилегированного режима?
(21)
Покажите ваш текущий код
&НаСервере
Процедура ИсправитьДолжностьВНШРНаСервере()
УстановитьПривилегированныйРежим(Истина);
Если ЗначениеЗаполнено(Объект.ПозицияТекущая) Тогда
//Изменение справочника Штатное расписание
ЭлементШР = Объект.ПозицияТекущая.ПолучитьОбъект();
ЭлементШР.Должность = Объект.Должность;
Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
ЭлементШР.Подразделение = Объект.Подразделение;
КонецЕсли;
ЭлементШР.Наименование = Строка(ЭлементШР.Должность) + " /" + Строка(ЭлементШР.Подразделение) + "/";
ЭлементШР.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИзменениеШтатногоРасписанияПозиции.Ссылка КАК ДокПозции,
| ИзменениеШтатногоРасписанияПозиции.Должность КАК Должность,
| ИзменениеШтатногоРасписанияПозиции.Подразделение КАК Подразделение,
| ИзменениеШтатногоРасписанияПозиции.Позиция КАК Позиция
|ИЗ
| Документ.ИзменениеШтатногоРасписания.Позиции КАК ИзменениеШтатногоРасписанияПозиции
|ГДЕ
| ИзменениеШтатногоРасписанияПозиции.Позиция = &Позиция
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| УтверждениеШтатногоРасписанияПозиции.Ссылка,
| УтверждениеШтатногоРасписанияПозиции.Должность,
| УтверждениеШтатногоРасписанияПозиции.Подразделение,
| УтверждениеШтатногоРасписанияПозиции.Позиция
|ИЗ
| Документ.УтверждениеШтатногоРасписания.Позиции КАК УтверждениеШтатногоРасписанияПозиции
|ГДЕ
| УтверждениеШтатногоРасписанияПозиции.Позиция = &Позиция";
Запрос.УстановитьПараметр("Позиция", Объект.ПозицияТекущая);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ДокПозции = Выборка.ДокПозции.ПолучитьОбъект();
НайденнаяПозиция = ДокПозции.Позиции.Найти(Объект.ПозицияТекущая, "Позиция");
НайденнаяПозиция.Должность = Объект.Должность;
Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
НайденнаяПозиция.Подразделение = Объект.Подразделение;
КонецЕсли;
ДокПозции.ОбменДанными.Загрузка = Истина;
ДокПозции.Записать();
КонецЦикла;
//Изменение в кадровых документах (НШР,Увольнение, и т.д.)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| КадроваяИсторияСотрудников.Регистратор КАК Регистратор
|ИЗ
| РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИсторияСотрудников
|ГДЕ
| КадроваяИсторияСотрудников.ДолжностьПоШтатномуРасписанию = &ДолжностьПоШтатномуРасписанию";
Запрос.УстановитьПараметр("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Регистратор.ПолучитьОбъект();
Если ТипЗнч(Док) = Тип("ДокументОбъект.НачальнаяШтатнаяРасстановка") Тогда
Отбор = Новый Структура();
Отбор.Вставить("ДолжностьПоШтатномуРасписанию", Объект.ПозицияТекущая);
НайденныеСтроки = Док.Сотрудники.НайтиСтроки(Отбор);
Для каждого Стр Из НайденныеСтроки Цикл
Стр.Должность = Объект.Должность;
КонецЦикла;
КонецЕсли;
//Док.Записать(РежимЗаписиДокумента.Проведение); - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
Док.Записать();
КонецЦикла;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Объект.ПозицияТекущая = Справочники.ШтатноеРасписание.ПустаяСсылка();
КонецПроцедуры
Показать
(24) Я бы включал привилегированный режим только перед циклами записи, а не на весь блок выполнения. Ну, да ладно.
Всё же оптимально посмотреть журнал регистрации. Если вам трудно разобраться, по возможности, посмотрите его и выложите скрин со строками отказа (событие "Ошибка выполнения") при данной операции.
Всё же оптимально посмотреть журнал регистрации. Если вам трудно разобраться, по возможности, посмотрите его и выложите скрин со строками отказа (событие "Ошибка выполнения") при данной операции.
В механизЬме дат запрета есть возможность конкретному пользователю перенести дату.
Проведение в закрытом периоде противоречит самой идее закрытости периода.
Так что тут, как в том анекдоте - или трусики, или крестик.
Или мы проводим документ, открыв период, или не лезем в закрытый период.
Проведение в закрытом периоде противоречит самой идее закрытости периода.
Так что тут, как в том анекдоте - или трусики, или крестик.
Или мы проводим документ, открыв период, или не лезем в закрытый период.
Хотела по одному регистру провести (нет необходимости по всем), но и тут провал, ошибка та же "Нарушение прав доступа". Может кто подскажет вариант обхода.
Процедура ПровестиПоРегистру(ДокСсылка, КадроваяИсторияСотрудников)
ДокОбъект = ДокСсылка.ПолучитьОбъект();
НачатьТранзакцию();
УстановитьПривиллигированныйРежим(Истина);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();
ТаблицаДвиженийРегистра = ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Выгрузить();
//здесь отменяем проведение документа, чтобы ничего не изменилось
//в прошлых периодах (по другим регистрам)
ОтменитьТранзакцию();
НаборЗаписей = РегистрыСведений[КадроваяИсторияСотрудников].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокСсылка);
НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
НаборЗаписей.Записать();
УстановитьПривиллигированныйРежим(Ложь);
КонецПроцедуры
Показать
(38) Я что-то не понял, чем это в (24) отличается от этого в (38) ???
(38)
А у вас что?
Почему тогда не просто: ???
Док.Записать(РежимЗаписиДокумента.Проведение); - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
(38)
ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();
КоллекцияДвижений (RegisterRecordsCollection)
Элементы коллекции:
Наборы записей регистров.
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются наборы записей регистров.
Возможно обращение к коллекции посредством оператора [...]. В качестве аргумента передается номер.
Элементы коллекции:
Наборы записей регистров.
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются наборы записей регистров.
Возможно обращение к коллекции посредством оператора [...]. В качестве аргумента передается номер.
А у вас что?
Почему тогда не просто:
ДокОбъект.Движения.КадроваяИсторияСотрудников.Прочитать();
(45)
Ничем не отличается. До того, как обработку запускала как доп. это не работало. Теперь проводится, комментарий неактуален.
в 38 попытка проводить по одному регистру.
(38) Я что-то не понял, чем это в (24)
Док.Записать(РежимЗаписиДокумента.Проведение); - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
отличается от этого в (38)
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
???
Док.Записать(РежимЗаписиДокумента.Проведение); - НАРУШЕНИЕ ПРАВ ДОСТУПА, поэтому:
отличается от этого в (38)
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
???
Ничем не отличается. До того, как обработку запускала как доп. это не работало. Теперь проводится, комментарий неактуален.
в 38 попытка проводить по одному регистру.
(41) Так проводится - ура! Спасибо!
Только теперь хочется по одному регистру проводить, но что-то не так делаю. Пример нашла по запросу "1с проведение документа по одному регистру" ссылку, полагаю, не получится отправить. Код в 38 посте.
Ругается на строку: ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();
Что сделала не так?
Только теперь хочется по одному регистру проводить, но что-то не так делаю. Пример нашла по запросу "1с проведение документа по одному регистру" ссылку, полагаю, не получится отправить. Код в 38 посте.
Ругается на строку: ДокОбъект.Движения[РегистрыСведений.КадроваяИсторияСотрудников].Прочитать();
Получение элемента по индексу для значения не определено
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(370)}: ДокОбъект.Движения[КадроваяИсторияСотрудников].Прочитать();
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(353)}: ПровестиПоРегистру(Док.Ссылка,РегистрыСведений.КадроваяИсторияСотрудников);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(370)}: ДокОбъект.Движения[КадроваяИсторияСотрудников].Прочитать();
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(353)}: ПровестиПоРегистру(Док.Ссылка,РегистрыСведений.КадроваяИсторияСотрудников);
{ВнешняяОбработка.ИсправлениеКадровойИстории_v15.Форма.Форма.Форма(266)}: ИсправитьДолжностьВНШРНаСервере();
Что сделала не так?
(44)
Если я правильно помню, БСП работает с незарегистрированными обработками и не установленными разрешениями для неё в сведениях о ней только в безопасном режиме.
Речь о том, что если обработку открывать как внешнюю - не проводит документ, если как дополнительную - проводит. Не могу объяснить этот феномен.
Если я правильно помню, БСП работает с незарегистрированными обработками и не установленными разрешениями для неё в сведениях о ней только в безопасном режиме.
(52) Привилегированные модули в расширениях не создаются...
Но если отключить безопасный режим, то работает такой код.
Хотя он работает и в самой доп обработке, если она подключена в доп обработки с "не безопасным" режимом.
проверял в УТ, но в ЗУПе должно быть аналогично.
Но если отключить безопасный режим, то работает такой код.
Хотя он работает и в самой доп обработке, если она подключена в доп обработки с "не безопасным" режимом.
УстановитьПривилегированныйРежим(Истина);
ДокументОбъект = ДокСсылка.ПолучитьОбъект();
ПропуститьПроверкуЗапретаИзменения = ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения;
ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения = Истина;
ДокументОбъект.Записать(РежимЗаписи);
ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения = ПропуститьПроверкуЗапретаИзменения;
УстановитьПривилегированныйРежим(Ложь);
проверял в УТ, но в ЗУПе должно быть аналогично.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот