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

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

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

З.Ы.
Хотя мне всё же непонятно, как может быть какое-либо ограничение прав при установке привилегированного режима?
34. babLucy 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. babLucy 17.10.21 12:39 Сейчас в теме
(36) Да, установлен флаг
Флаг сняла, запустила заново предприятие, но не помогло
39. Release 17.10.21 12:52 Сейчас в теме
(37) А обработку запускаете из "Дополнительные отчеты и обработки"?
40. babLucy 17.10.21 12:53 Сейчас в теме
(39) Нет, Файл - Открыть - с отладчиком работаю. Попробую как доп.
41. Release 17.10.21 13:00 Сейчас в теме
(40) Нет, ненужно. Я думал проблема как раз в этом - БСП не дает открывать обработки в небезопасном режиме без роли "Администратор системы".
17. nomad_irk 76 17.10.21 10:59 Сейчас в теме
(13)Проблемы с правами. Либо дайте полные права, либо включайте ПривилегированныйРежим в обработке.
19. babLucy 17.10.21 11:08 Сейчас в теме
(17) ПривилегированныйРежим включен в процедуре
21. Release 17.10.21 11:11 Сейчас в теме
(19) Это точно? Покажите ваш текущий код. Такого просто не должно быть, если конфигурация типовая.
24. babLucy 17.10.21 11:18 Сейчас в теме
(21)
Покажите ваш текущий код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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