Доброго утра.
Помогите пожалуйста разобраться с отладчиком и найти ошибку.
Я пытаюсь создать пользователей в базе, добавить ему права доступа.
Пользователи создаются.
При добавлении пользователям прав доступа, изменении профиля групп пользователей возникает ошибка:
Переполнение стека встроенного языка на сервере.
Переполнение стека встроенного языка на сервере
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(458)}: ЗаписатьИзмененияНаСервере(Отказ);
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(437)}: ЗаписатьИзмененияЗавершение(Null, ОбработкаПродолжения);
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(327)}: ЗаписатьИзменения();
по причине:
Переполнение стека встроенного языка на сервере
по причине:
ОбщаяФорма.ПраваДоступаУпрощенно.Форма : 852 : ГруппаДоступаОбъект.Записать();
Справочник.ГруппыДоступа.МодульОбъекта : 152 : РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Ссылка);
РегистрСведений.ТаблицыГруппДоступа.МодульМенеджера : 262 : Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений());
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 4584 : ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений);
...
РегистрСведений.ПараметрыРаботыВерсийРасширений.МодульМенеджера : 62 : НаборЗаписей.Записать();
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1034 : Если ОбщегоНазначения.ЭтоКонстанта(Источник.Метаданные()) Тогда
ОбщийМодуль.ОбщегоНазначения.Модуль : 0
по причине:
Переполнение стека встроенного языка на сервере.
Я запустила отладчик
сейчас при записи возникает такая ошибка ( Принскрин в приложенном файле.)
Прошу доступно объяснить, как найти и устранить эту ошибку и как использовать отладчик в поиске (особенно интересуют общие формы и модули).
Помогите пожалуйста разобраться с отладчиком и найти ошибку.
Я пытаюсь создать пользователей в базе, добавить ему права доступа.
Пользователи создаются.
При добавлении пользователям прав доступа, изменении профиля групп пользователей возникает ошибка:
Переполнение стека встроенного языка на сервере.
Переполнение стека встроенного языка на сервере
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(458)}: ЗаписатьИзмененияНаСервере(Отказ);
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(437)}: ЗаписатьИзмененияЗавершение(Null, ОбработкаПродолжения);
{ОбщаяФорма.ПраваДоступаУпрощенно.Форма(327)}: ЗаписатьИзменения();
по причине:
Переполнение стека встроенного языка на сервере
по причине:
ОбщаяФорма.ПраваДоступаУпрощенно.Форма : 852 : ГруппаДоступаОбъект.Записать();
Справочник.ГруппыДоступа.МодульОбъекта : 152 : РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(Ссылка);
РегистрСведений.ТаблицыГруппДоступа.МодульМенеджера : 262 : Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений());
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 4584 : ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений);
...
РегистрСведений.ПараметрыРаботыВерсийРасширений.МодульМенеджера : 62 : НаборЗаписей.Записать();
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);
ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1034 : Если ОбщегоНазначения.ЭтоКонстанта(Источник.Метаданные()) Тогда
ОбщийМодуль.ОбщегоНазначения.Модуль : 0
по причине:
Переполнение стека встроенного языка на сервере.
Я запустила отладчик
сейчас при записи возникает такая ошибка ( Принскрин в приложенном файле.)
Прошу доступно объяснить, как найти и устранить эту ошибку и как использовать отладчик в поиске (особенно интересуют общие формы и модули).
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)
А в замере производительности её можно отследить?
Запускаете замер, жмете кнопку, валится ошибка, останавливаете замер, смотрите, что там много-премного раз выполняется. В 1С глубина стека 1748 (если не ошибаюсь). С учетом уже использованной глубины 1700+ раз должна функция где-то вызываться...
я бы пошел другим путем. Берем эту процедуру, где ошибка, комментируем сначала всю. Проверяем. Работает? Убираем комментарий с первой строки (двух или десяти - ну смотря сколько строк). Проверяем. Работает? Убираем комментарии дальше. Не работает? Смотрим, что не так делает строка, на которой ошибка.
(5)
а почему нельзя точки останова использовать?
я бы пошел другим путем. Берем эту процедуру, где ошибка, комментируем сначала всю. Проверяем. Работает? Убираем комментарий с первой строки (двух или десяти - ну смотря сколько строк). Проверяем. Работает? Убираем комментарии дальше. Не работает? Смотрим, что не так делает строка, на которой ошибка.
а почему нельзя точки останова использовать?
(13)
(458 строка)
ЗаписатьИзмененияНаСервере(Отказ);
Процедура ЗаписатьИзмененияЗавершение(НовыйПарольПользователяСервиса, ОбработкаПродолжения) Экспорт
Если НовыйПарольПользователяСервиса = Неопределено Тогда
Возврат;
КонецЕсли;
Если НовыйПарольПользователяСервиса <> Null Тогда
ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
КонецЕсли;
ОчиститьСообщения();
Отказ = Ложь;
ОтказПриЗаписиИзменений = Ложь;
Попытка
Показать(458 строка)
ЗаписатьИзмененияНаСервере(Отказ);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Если ОтказПриЗаписиИзменений Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(
КраткоеПредставлениеОшибки(ИнформацияОбОшибке),,,, Отказ);
Иначе
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
ПодключитьОбработчикОжидания("УстановитьТекущуюСтрокуЗначенияДоступаПриОшибке", Истина, 0.1);
Если ОбработкаПродолжения = Неопределено Тогда
Возврат;
КонецЕсли;
ВыполнитьОбработкуОповещения(ОбработкаПродолжения, Отказ);
КонецПроцедуры
Показать
(22)
&НаСервере
Процедура ЗаписатьИзмененияНаСервере(Отказ)
Если Не ПроверитьЗаполнение() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено);
// Получение списка изменений.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Параметры.Пользователь);
Запрос.УстановитьПараметр("Профили", Профили.Выгрузить(, "Профиль, Пометка"));
Запрос.УстановитьПараметр("ВидыДоступа", ВидыДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ВсеРазрешены"));
ТаблицаЗначений = ЗначенияДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ЗначениеДоступа, ВключаяНижестоящие");
ТаблицаЗначений.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число",,,
Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
ГруппаДоступаВСтроке = Неопределено;
Для Каждого Строка Из ТаблицаЗначений Цикл
Если ГруппаДоступаВСтроке <> Строка.ГруппаДоступа Тогда
ГруппаДоступаВСтроке = Строка.ГруппаДоступа;
ТекущийНомерСтроки = 1;
КонецЕсли;
Строка.НомерСтроки = ТекущийНомерСтроки;
ТекущийНомерСтроки = ТекущийНомерСтроки + 1;
КонецЦикла;
Запрос.УстановитьПараметр("ЗначенияДоступа", ТаблицаЗначений);
Запрос.Текст =
"ВЫБРАТЬ
| Профили.Профиль КАК Ссылка,
| Профили.Пометка
|ПОМЕСТИТЬ Профили
|ИЗ
| &Профили КАК Профили
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВидыДоступа.ГруппаДоступа КАК Профиль,
| ВидыДоступа.ВидДоступа,
| ВидыДоступа.ВсеРазрешены
|ПОМЕСТИТЬ ВидыДоступа
|ИЗ
| &ВидыДоступа КАК ВидыДоступа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ЗначенияДоступа.ГруппаДоступа КАК Профиль,
| ЗначенияДоступа.ВидДоступа,
| ЗначенияДоступа.НомерСтроки,
| ЗначенияДоступа.ЗначениеДоступа,
| ЗначенияДоступа.ВключаяНижестоящие
|ПОМЕСТИТЬ ЗначенияДоступа
|ИЗ
| &ЗначенияДоступа КАК ЗначенияДоступа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Профили.Ссылка,
| ЕСТЬNULL(ГруппыДоступа.Ссылка, НЕОПРЕДЕЛЕНО) КАК ПерсональнаяГруппаДоступа,
| ВЫБОР
| КОГДА ГруппыДоступаПользователи.Ссылка ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК Пометка
|ПОМЕСТИТЬ ТекущиеПрофили
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
| ПО Профили.Ссылка = ГруппыДоступа.Профиль
| И (НЕ(ГруппыДоступа.Пользователь <> &Пользователь
| И НЕ Профили.Ссылка В (ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор))))
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
| ПО (ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка)
| И (ГруппыДоступаПользователи.Пользователь = &Пользователь)
|ГДЕ
| НЕ Профили.ПометкаУдаления
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| ГруппыДоступаВидыДоступа.ВидДоступа,
| ГруппыДоступаВидыДоступа.ВсеРазрешены
|ПОМЕСТИТЬ ТекущиеВидыДоступа
|ИЗ
| ТекущиеПрофили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа
| ПО Профили.ПерсональнаяГруппаДоступа = ГруппыДоступаВидыДоступа.Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| ГруппыДоступаЗначенияДоступа.ВидДоступа,
| ГруппыДоступаЗначенияДоступа.НомерСтроки,
| ГруппыДоступаЗначенияДоступа.ЗначениеДоступа,
| ГруппыДоступаЗначенияДоступа.ВключаяНижестоящие
|ПОМЕСТИТЬ ТекущиеЗначенияДоступа
|ИЗ
| ТекущиеПрофили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
| ПО Профили.ПерсональнаяГруппаДоступа = ГруппыДоступаЗначенияДоступа.Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПрофилиИзмененныхГрупп.Профиль
|ПОМЕСТИТЬ ПрофилиИзмененныхГрупп
|ИЗ
| (ВЫБРАТЬ
| Профили.Ссылка КАК Профиль
| ИЗ
| Профили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПрофили КАК ТекущиеПрофили
| ПО Профили.Ссылка = ТекущиеПрофили.Ссылка
| ГДЕ
| Профили.Пометка <> ТекущиеПрофили.Пометка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ВидыДоступа.Профиль
| ИЗ
| ВидыДоступа КАК ВидыДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ТекущиеВидыДоступа КАК ТекущиеВидыДоступа
| ПО ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль
| И ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа
| И ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены
| ГДЕ
| ТекущиеВидыДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТекущиеВидыДоступа.Профиль
| ИЗ
| ТекущиеВидыДоступа КАК ТекущиеВидыДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ВидыДоступа КАК ВидыДоступа
| ПО (ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль)
| И (ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа)
| И (ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены)
| ГДЕ
| ВидыДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЗначенияДоступа.Профиль
| ИЗ
| ЗначенияДоступа КАК ЗначенияДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ТекущиеЗначенияДоступа КАК ТекущиеЗначенияДоступа
| ПО ЗначенияДоступа.Профиль = ТекущиеЗначенияДоступа.Профиль
| И ЗначенияДоступа.ВидДоступа = ТекущиеЗначенияДоступа.ВидДоступа
| И ЗначенияДоступа.НомерСтроки = ТекущиеЗначенияДоступа.НомерСтроки
| И ЗначенияДоступа.ЗначениеДоступа = ТекущиеЗначенияДоступа.ЗначениеДоступа
| И ЗначенияДоступа.ВключаяНижестоящие = ТекущиеЗначенияДоступа.ВключаяНижестоящие
| ГДЕ
| ТекущиеЗначенияДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТекущиеЗначенияДоступа.Профиль
| ИЗ
| ТекущиеЗначенияДоступа КАК ТекущиеЗначенияДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияДоступа КАК ЗначенияДоступа
| ПО (ЗначенияДоступа.Профиль = ТекущиеЗначенияДоступа.Профиль)
| И (ЗначенияДоступа.ВидДоступа = ТекущиеЗначенияДоступа.ВидДоступа)
| И (ЗначенияДоступа.НомерСтроки = ТекущиеЗначенияДоступа.НомерСтроки)
| И (ЗначенияДоступа.ЗначениеДоступа = ТекущиеЗначенияДоступа.ЗначениеДоступа)
| И (ЗначенияДоступа.ВключаяНижестоящие = ТекущиеЗначенияДоступа.ВключаяНижестоящие)
| ГДЕ
| ЗначенияДоступа.ВидДоступа ЕСТЬ NULL ) КАК ПрофилиИзмененныхГрупп
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| СправочникПрофили.Наименование КАК ПрофильНаименование,
| Профили.Пометка,
| ТекущиеПрофили.ПерсональнаяГруппаДоступа
|ИЗ
| ПрофилиИзмененныхГрупп КАК ПрофилиИзмененныхГрупп
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Профили КАК Профили
| ПО ПрофилиИзмененныхГрупп.Профиль = Профили.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПрофили КАК ТекущиеПрофили
| ПО ПрофилиИзмененныхГрупп.Профиль = ТекущиеПрофили.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК СправочникПрофили
| ПО (СправочникПрофили.Ссылка = ПрофилиИзмененныхГрупп.Профиль)";
НачатьТранзакцию();
Попытка
ИзмененияГруппДоступа = Запрос.Выполнить().Выгрузить();
Блокировка = Новый БлокировкаДанных;
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа");
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
ЭлементБлокировки.УстановитьЗначение("Ссылка", Изменение.ПерсональнаяГруппаДоступа);
ЗаблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
Блокировка.Заблокировать();
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
ГруппаДоступаОбъект = Изменение.ПерсональнаяГруппаДоступа.ПолучитьОбъект();
ГруппаДоступаОбъект.ПометкаУдаления = Ложь;
Иначе
// Создание персональной группы доступа.
ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент();
ГруппаДоступаОбъект.Родитель = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа();
ГруппаДоступаОбъект.Наименование = Изменение.ПрофильНаименование;
ГруппаДоступаОбъект.Пользователь = Параметры.Пользователь;
ГруппаДоступаОбъект.Профиль = Изменение.Профиль;
КонецЕсли;
Если Изменение.Профиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда
Если ТребуетсяСинхронизацияССервисом Тогда
ГруппаДоступаОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса);
КонецЕсли;
Если Изменение.Пометка Тогда
Если ГруппаДоступаОбъект.Пользователи.Найти(Параметры.Пользователь, "Пользователь") = Неопределено Тогда
ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Параметры.Пользователь;
КонецЕсли;
Иначе
ОписаниеПользователя = ГруппаДоступаОбъект.Пользователи.Найти(
Параметры.Пользователь, "Пользователь");
Если ОписаниеПользователя <> Неопределено Тогда
ГруппаДоступаОбъект.Пользователи.Удалить(ОписаниеПользователя);
Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда
// Проверка пустого списка пользователей ИБ в группе доступа Администраторы.
ОписаниеОшибки = "";
УправлениеДоступомСлужебный.ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы(
ГруппаДоступаОбъект.Пользователи, ОписаниеОшибки);
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ОтказПриЗаписиИзменений = Истина;
Отказ = Истина;
ВызватьИсключение
НСтр("ru = 'Профиль Администратор должен быть хотя бы у одного пользователя,
|которому разрешен вход в программу.'");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
ГруппаДоступаОбъект.Пользователи.Очистить();
Если Изменение.Пометка Тогда
ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Параметры.Пользователь;
КонецЕсли;
Отбор = Новый Структура("ГруппаДоступа", Изменение.Профиль);
ГруппаДоступаОбъект.ВидыДоступа.Загрузить(ВидыДоступа.Выгрузить(Отбор, "ВидДоступа, ВсеРазрешены"));
ГруппаДоступаОбъект.ЗначенияДоступа.Загрузить(ЗначенияДоступа.Выгрузить(Отбор, "ВидДоступа, ЗначениеДоступа, ВключаяНижестоящие"));
КонецЕсли;
ГруппаДоступаОбъект.Записать();
КонецЦикла;
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
РазблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
РазблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
ПарольПользователяСервиса = Неопределено;
ВызватьИсключение;
КонецПопытки;
Модифицированность = Ложь;
ТребуетсяСинхронизацияССервисом = Ложь;
УправлениеДоступомСлужебный.ЗапуститьОбновлениеДоступа();
КонецПроцедуры
Показать
(24)
Вот по-моему в этой процедуре.
Вот на этот элемент идёт ссылка при ГруппаДоступаОбъект.Записать()
ГруппаДоступаОбъект = Выборка.ГруппаДоступа.ПолучитьОбъект(); // СправочникОбъект.ГруппыДоступа
ЗапуститьОбновлениеДоступа
// Запускает обновление доступа, если оно запланировано и еще не запущено.
Процедура ЗапуститьОбновлениеДоступа() Экспорт
Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь) Тогда
Возврат;
КонецЕсли;
Если МонопольныйРежим() Тогда
Возврат;
КонецЕсли;
ЗапуститьОбновлениеДоступаНаУровнеЗаписей();
КонецПроцедуры
Показать ГруппаДоступаОбъект.Записать()
Вот по-моему в этой процедуре.
Процедура ПриКопированииПравНовомуПользователю(Источник, Приемник) Экспорт
Если ТранзакцияАктивна()
И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить("Справочник.ГруппыДоступа");
// АПК:1320-выкл - №499, №783.1.3 Допустимо вызывать блокировку во внешней транзакции для файловой ИБ.
// Требуется для предотвращения взаимоблокировки: ниже запрос, который ставит неявную
// разделяемую блокировку и далее блокировка усиливается до исключительной явным вызовом,
// что приводит к взаимоблокировке в некоторых случаях.
Блокировка.Заблокировать();
// АПК:1320-вкл.
КонецЕсли;
УпрощенныйИнтерфейс = УпрощенныйИнтерфейсНастройкиПравДоступа();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Источник);
Если УпрощенныйИнтерфейс Тогда
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГруппыДоступаПользователи.Ссылка.Профиль КАК Профиль
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь = &Пользователь";
Иначе
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь = &Пользователь";
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Если Не УпрощенныйИнтерфейс Тогда
Блокировка = Новый БлокировкаДанных();
ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа");
ЭлементБлокировки.ИсточникДанных = РезультатЗапроса;
КонецЕсли;
НачатьТранзакцию();
Попытка
Если УпрощенныйИнтерфейс Тогда
Пока Выборка.Следующий() Цикл
УправлениеДоступом.ВключитьПрофильПользователю(Приемник, Выборка.Профиль);
КонецЦикла;
Иначе
Блокировка.Заблокировать();
Пока Выборка.Следующий() Цикл
ПоказатьВот на этот элемент идёт ссылка при ГруппаДоступаОбъект.Записать()
ГруппаДоступаОбъект = Выборка.ГруппаДоступа.ПолучитьОбъект(); // СправочникОбъект.ГруппыДоступа
ГруппаДоступаОбъект = Выборка.ГруппаДоступа.ПолучитьОбъект(); // СправочникОбъект.ГруппыДоступа -
Если ГруппаДоступаОбъект.Пользователи.Найти(Приемник, "Пользователь") = Неопределено Тогда
Строка = ГруппаДоступаОбъект.Пользователи.Добавить();
Строка.Пользователь = Приемник;
ГруппаДоступаОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Показать
(25)
Проверьте, что происходит внутри ЗапуститьОбновлениеДоступаНаУровнеЗаписей().
Процедура ЗапуститьОбновлениеДоступа() Экспорт
Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь) Тогда
Возврат;
КонецЕсли;
Если МонопольныйРежим() Тогда
Возврат;
КонецЕсли;
ЗапуститьОбновлениеДоступаНаУровнеЗаписей();
КонецПроцедуры
ПоказатьПроверьте, что происходит внутри ЗапуститьОбновлениеДоступаНаУровнеЗаписей().
(26)
ЗапуститьОбновлениеДоступаНаУровнеЗаписей
Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь) Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Истина) Тогда
ТекстОшибки =
НСтр("ru = 'Невозможно запустить обновление доступа на уровне записей, так как
|константа ОграничиватьДоступНаУровнеЗаписейУниверсально выключена.'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ТекстОшибки =
НСтр("ru = 'Невозможно запустить обновление доступа на уровне записей в открытой транзакции.'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если Не ЭтоЗапускВручную И Не ЗапланированоОбновлениеДоступа() Тогда
Возврат Неопределено;
КонецЕсли;
ПоследнееОбновлениеДоступа = ПоследнееОбновлениеДоступа();
Если Не ЭтоЗапускВручную И ПоследнееОбновлениеДоступа.ОбновлениеДоступаЗапрещено Тогда
Возврат Неопределено;
КонецЕсли;
Результат = Новый Структура("УжеВыполняется, ИдентификаторФоновогоЗадания, СвойстваСеанса, ТекстПредупреждения", Истина);
Исполнитель = ИсполнительОбновленияДоступа(ПоследнееОбновлениеДоступа);
Если Исполнитель = Неопределено Тогда
Результат.УжеВыполняется = Ложь;
Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы();
КонецЕсли;
Если ЭтоЗапускВручную Тогда
УстановитьЗапретОбновленияДоступа(Ложь);
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Истина);
Иначе
ПараметрыЗадания = Неопределено;
КонецЕсли;
ФоновоеЗадание = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеСРасширениямиБазыДанных(
Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.ИмяМетода, ПараметрыЗадания,,
?(ЭтоЗапускВручную, НСтр("ru = 'Запуск вручную'"), НСтр("ru = 'Автозапуск'")) + ": "
+ Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.Синоним);
Результат.ИдентификаторФоновогоЗадания = ФоновоеЗадание.УникальныйИдентификатор;
ИначеЕсли ТипЗнч(Исполнитель) = Тип("ФоновоеЗадание")
И Исполнитель.УникальныйИдентификатор <> ПоследнееОбновлениеДоступа.ИдентификаторФоновогоЗадания Тогда
Результат.ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось начать обновление доступа, так как оно уже запущено %1 в %2'"),
Формат(Исполнитель.Начало, "ДЛФ=D"),
Формат(Исполнитель.Начало, "ДЛФ=T"));
Иначе
СвойстваСеанса = Новый Структура("ИмяКомпьютера, НомерСеанса, НачалоСеанса");
Если ТипЗнч(Исполнитель) = Тип("ФоновоеЗадание") Тогда
ЗаполнитьЗначенияСвойств(СвойстваСеанса, ПоследнееОбновлениеДоступа);
Иначе
ЗаполнитьЗначенияСвойств(СвойстваСеанса, Исполнитель);
КонецЕсли;
Результат.СвойстваСеанса = СвойстваСеанса;
Результат.ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Обновление доступа уже выполняется
|(компьютер: %1, сеанс: %2, начат: %3 в %4)'"),
СвойстваСеанса.ИмяКомпьютера,
СвойстваСеанса.НомерСеанса,
Формат(СвойстваСеанса.НачалоСеанса, "ДЛФ=D"),
Формат(СвойстваСеанса.НачалоСеанса, "ДЛФ=T"));
КонецЕсли;
Если ТипЗнч(Исполнитель) = Тип("ФоновоеЗадание") Тогда
Результат.ИдентификаторФоновогоЗадания = Исполнитель.УникальныйИдентификатор;
КонецЕсли;
Возврат Результат;
КонецФункции
Показать
(26)
ЗапуститьОбновлениеДоступаНаУровнеЗаписей();
Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь) Экспорт
Подскажите пожалуйста,
Может быть так, что при обращении к функции в скобках ничего нет, а при объявлении функции есть переменные??
ЗапуститьОбновлениеДоступаНаУровнеЗаписей();
ЗапуститьОбновлениеДоступаНаУровнеЗаписей();
Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь) Экспорт
Подскажите пожалуйста,
Может быть так, что при обращении к функции в скобках ничего нет, а при объявлении функции есть переменные??
(28)
Конечно, при условии, что эти переменные объявлены со значениями по умолчанию.
В данном случае:
ЭтоЗапускВручную = Ложь означает, что если значение в переменную не передается, то она заполняется значением по умолчанию, в данном случае Ложь.
Может быть так, что при обращении к функции в скобках ничего нет, а при объявлении функции есть переменные??
Конечно, при условии, что эти переменные объявлены со значениями по умолчанию.
В данном случае:
Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь) Экспорт
ЭтоЗапускВручную = Ложь означает, что если значение в переменную не передается, то она заполняется значением по умолчанию, в данном случае Ложь.
Ошибка "Переполнение стека встроенного языка на сервере." как правило возникает в ситуации, когда в программном коде допущена ошибка. А точнее происходит зацикливание, когда обработчик уходит в бесконечный цикл.
Смотрите код процедуры ЗаписатьИзмененияНаСервере(Отказ)
Смотрите код процедуры ЗаписатьИзмененияНаСервере(Отказ)
(19)
Нашла это
Нашла это
&НаСервере
Процедура ЗаписатьИзмененияНаСервере(Отказ)
Если Не ПроверитьЗаполнение() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Пользователи.НайтиНеоднозначныхПользователейИБ(Неопределено);
// Получение списка изменений.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Параметры.Пользователь);
Запрос.УстановитьПараметр("Профили", Профили.Выгрузить(, "Профиль, Пометка"));
Запрос.УстановитьПараметр("ВидыДоступа", ВидыДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ВсеРазрешены"));
ТаблицаЗначений = ЗначенияДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ЗначениеДоступа, ВключаяНижестоящие");
ТаблицаЗначений.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число",,,
Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
ГруппаДоступаВСтроке = Неопределено;
Для Каждого Строка Из ТаблицаЗначений Цикл
Если ГруппаДоступаВСтроке <> Строка.ГруппаДоступа Тогда
ГруппаДоступаВСтроке = Строка.ГруппаДоступа;
ТекущийНомерСтроки = 1;
КонецЕсли;
Строка.НомерСтроки = ТекущийНомерСтроки;
ТекущийНомерСтроки = ТекущийНомерСтроки + 1;
КонецЦикла;
Запрос.УстановитьПараметр("ЗначенияДоступа", ТаблицаЗначений);
Запрос.Текст =
"ВЫБРАТЬ
| Профили.Профиль КАК Ссылка,
| Профили.Пометка
|ПОМЕСТИТЬ Профили
|ИЗ
| &Профили КАК Профили
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВидыДоступа.ГруппаДоступа КАК Профиль,
| ВидыДоступа.ВидДоступа,
| ВидыДоступа.ВсеРазрешены
|ПОМЕСТИТЬ ВидыДоступа
|ИЗ
| &ВидыДоступа КАК ВидыДоступа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ЗначенияДоступа.ГруппаДоступа КАК Профиль,
| ЗначенияДоступа.ВидДоступа,
| ЗначенияДоступа.НомерСтроки,
| ЗначенияДоступа.ЗначениеДоступа,
| ЗначенияДоступа.ВключаяНижестоящие
|ПОМЕСТИТЬ ЗначенияДоступа
|ИЗ
| &ЗначенияДоступа КАК ЗначенияДоступа
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Профили.Ссылка,
| ЕСТЬNULL(ГруппыДоступа.Ссылка, НЕОПРЕДЕЛЕНО) КАК ПерсональнаяГруппаДоступа,
| ВЫБОР
| КОГДА ГруппыДоступаПользователи.Ссылка ЕСТЬ NULL
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК Пометка
|ПОМЕСТИТЬ ТекущиеПрофили
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
| ПО Профили.Ссылка = ГруппыДоступа.Профиль
| И (НЕ(ГруппыДоступа.Пользователь <> &Пользователь
| И НЕ Профили.Ссылка В (ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор))))
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
| ПО (ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка)
| И (ГруппыДоступаПользователи.Пользователь = &Пользователь)
|ГДЕ
| НЕ Профили.ПометкаУдаления
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| ГруппыДоступаВидыДоступа.ВидДоступа,
| ГруппыДоступаВидыДоступа.ВсеРазрешены
|ПОМЕСТИТЬ ТекущиеВидыДоступа
|ИЗ
| ТекущиеПрофили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа
| ПО Профили.ПерсональнаяГруппаДоступа = ГруппыДоступаВидыДоступа.Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| ГруппыДоступаЗначенияДоступа.ВидДоступа,
| ГруппыДоступаЗначенияДоступа.НомерСтроки,
| ГруппыДоступаЗначенияДоступа.ЗначениеДоступа,
| ГруппыДоступаЗначенияДоступа.ВключаяНижестоящие
|ПОМЕСТИТЬ ТекущиеЗначенияДоступа
|ИЗ
| ТекущиеПрофили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
| ПО Профили.ПерсональнаяГруппаДоступа = ГруппыДоступаЗначенияДоступа.Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПрофилиИзмененныхГрупп.Профиль
|ПОМЕСТИТЬ ПрофилиИзмененныхГрупп
|ИЗ
| (ВЫБРАТЬ
| Профили.Ссылка КАК Профиль
| ИЗ
| Профили КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПрофили КАК ТекущиеПрофили
| ПО Профили.Ссылка = ТекущиеПрофили.Ссылка
| ГДЕ
| Профили.Пометка <> ТекущиеПрофили.Пометка
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ВидыДоступа.Профиль
| ИЗ
| ВидыДоступа КАК ВидыДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ТекущиеВидыДоступа КАК ТекущиеВидыДоступа
| ПО ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль
| И ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа
| И ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены
| ГДЕ
| ТекущиеВидыДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТекущиеВидыДоступа.Профиль
| ИЗ
| ТекущиеВидыДоступа КАК ТекущиеВидыДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ВидыДоступа КАК ВидыДоступа
| ПО (ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль)
| И (ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа)
| И (ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены)
| ГДЕ
| ВидыДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ЗначенияДоступа.Профиль
| ИЗ
| ЗначенияДоступа КАК ЗначенияДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ТекущиеЗначенияДоступа КАК ТекущиеЗначенияДоступа
| ПО ЗначенияДоступа.Профиль = ТекущиеЗначенияДоступа.Профиль
| И ЗначенияДоступа.ВидДоступа = ТекущиеЗначенияДоступа.ВидДоступа
| И ЗначенияДоступа.НомерСтроки = ТекущиеЗначенияДоступа.НомерСтроки
| И ЗначенияДоступа.ЗначениеДоступа = ТекущиеЗначенияДоступа.ЗначениеДоступа
| И ЗначенияДоступа.ВключаяНижестоящие = ТекущиеЗначенияДоступа.ВключаяНижестоящие
| ГДЕ
| ТекущиеЗначенияДоступа.ВидДоступа ЕСТЬ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТекущиеЗначенияДоступа.Профиль
| ИЗ
| ТекущиеЗначенияДоступа КАК ТекущиеЗначенияДоступа
| ЛЕВОЕ СОЕДИНЕНИЕ ЗначенияДоступа КАК ЗначенияДоступа
| ПО (ЗначенияДоступа.Профиль = ТекущиеЗначенияДоступа.Профиль)
| И (ЗначенияДоступа.ВидДоступа = ТекущиеЗначенияДоступа.ВидДоступа)
| И (ЗначенияДоступа.НомерСтроки = ТекущиеЗначенияДоступа.НомерСтроки)
| И (ЗначенияДоступа.ЗначениеДоступа = ТекущиеЗначенияДоступа.ЗначениеДоступа)
| И (ЗначенияДоступа.ВключаяНижестоящие = ТекущиеЗначенияДоступа.ВключаяНижестоящие)
| ГДЕ
| ЗначенияДоступа.ВидДоступа ЕСТЬ NULL ) КАК ПрофилиИзмененныхГрупп
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Профили.Ссылка КАК Профиль,
| СправочникПрофили.Наименование КАК ПрофильНаименование,
| Профили.Пометка,
| ТекущиеПрофили.ПерсональнаяГруппаДоступа
|ИЗ
| ПрофилиИзмененныхГрупп КАК ПрофилиИзмененныхГрупп
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Профили КАК Профили
| ПО ПрофилиИзмененныхГрупп.Профиль = Профили.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекущиеПрофили КАК ТекущиеПрофили
| ПО ПрофилиИзмененныхГрупп.Профиль = ТекущиеПрофили.Ссылка
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК СправочникПрофили
| ПО (СправочникПрофили.Ссылка = ПрофилиИзмененныхГрупп.Профиль)";
НачатьТранзакцию();
Попытка
ИзмененияГруппДоступа = Запрос.Выполнить().Выгрузить();
Блокировка = Новый БлокировкаДанных;
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа");
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
ЭлементБлокировки.УстановитьЗначение("Ссылка", Изменение.ПерсональнаяГруппаДоступа);
ЗаблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
Блокировка.Заблокировать();
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
ГруппаДоступаОбъект = Изменение.ПерсональнаяГруппаДоступа.ПолучитьОбъект();
ГруппаДоступаОбъект.ПометкаУдаления = Ложь;
Иначе
// Создание персональной группы доступа.
ГруппаДоступаОбъект = Справочники.ГруппыДоступа.СоздатьЭлемент();
ГруппаДоступаОбъект.Родитель = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа();
ГруппаДоступаОбъект.Наименование = Изменение.ПрофильНаименование;
ГруппаДоступаОбъект.Пользователь = Параметры.Пользователь;
ГруппаДоступаОбъект.Профиль = Изменение.Профиль;
КонецЕсли;
Если Изменение.Профиль = Справочники.ПрофилиГруппДоступа.Администратор Тогда
Если ТребуетсяСинхронизацияССервисом Тогда
ГруппаДоступаОбъект.ДополнительныеСвойства.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса);
КонецЕсли;
Если Изменение.Пометка Тогда
Если ГруппаДоступаОбъект.Пользователи.Найти(Параметры.Пользователь, "Пользователь") = Неопределено Тогда
ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Параметры.Пользователь;
КонецЕсли;
Иначе
ОписаниеПользователя = ГруппаДоступаОбъект.Пользователи.Найти(
Параметры.Пользователь, "Пользователь");
Если ОписаниеПользователя <> Неопределено Тогда
ГруппаДоступаОбъект.Пользователи.Удалить(ОписаниеПользователя);
Если НЕ ОбщегоНазначения.РазделениеВключено() Тогда
// Проверка пустого списка пользователей ИБ в группе доступа Администраторы.
ОписаниеОшибки = "";
УправлениеДоступомСлужебный.ПроверитьНаличиеПользователяИБВГруппеДоступаАдминистраторы(
ГруппаДоступаОбъект.Пользователи, ОписаниеОшибки);
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ОтказПриЗаписиИзменений = Истина;
Отказ = Истина;
ВызватьИсключение
НСтр("ru = 'Профиль Администратор должен быть хотя бы у одного пользователя,
|которому разрешен вход в программу.'");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
ГруппаДоступаОбъект.Пользователи.Очистить();
Если Изменение.Пометка Тогда
ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Параметры.Пользователь;
КонецЕсли;
Отбор = Новый Структура("ГруппаДоступа", Изменение.Профиль);
ГруппаДоступаОбъект.ВидыДоступа.Загрузить(ВидыДоступа.Выгрузить(Отбор, "ВидДоступа, ВсеРазрешены"));
ГруппаДоступаОбъект.ЗначенияДоступа.Загрузить(ЗначенияДоступа.Выгрузить(Отбор, "ВидДоступа, ЗначениеДоступа, ВключаяНижестоящие"));
КонецЕсли;
ГруппаДоступаОбъект.Записать();
КонецЦикла;
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
РазблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Для каждого Изменение Из ИзмененияГруппДоступа Цикл
Если ЗначениеЗаполнено(Изменение.ПерсональнаяГруппаДоступа) Тогда
РазблокироватьДанныеДляРедактирования(Изменение.ПерсональнаяГруппаДоступа);
КонецЕсли;
КонецЦикла;
ПарольПользователяСервиса = Неопределено;
ВызватьИсключение;
КонецПопытки;
Модифицированность = Ложь;
ТребуетсяСинхронизацияССервисом = Ложь;
УправлениеДоступомСлужебный.ЗапуститьОбновлениеДоступа();
КонецПроцедуры
Показать
Доброго утра.
я сегодня продолжила смотреть.
Идёт проблема именно при записи спр.ПрофилиГруппДоступа (объект в справочнике уже создан, я нажимаю на существующем кнопку записать и закрыть)
нашла процедуру, где возникает ошибка
При нажатии на f12 ничего не происходит.
Далее
В замер производительности (на маркете слева), нашла ссылку на эту процедуру (принскрин)
Видно, что эта большое количество вызовов этой процедуры.
А дальше что делать??
я сегодня продолжила смотреть.
Идёт проблема именно при записи спр.ПрофилиГруппДоступа (объект в справочнике уже создан, я нажимаю на существующем кнопку записать и закрыть)
нашла процедуру, где возникает ошибка
Справочник.ПрофилиГруппДоступа.Форма.ФормаЭлемента.Форма(436)}: Ошибка при вызове метода контекста (Записать)
При нажатии на f12 ничего не происходит.
Далее
В замер производительности (на маркете слева), нашла ссылку на эту процедуру (принскрин)
Процедура Проверить(Знач Условие, Знач Сообщение = "", Знач КонтекстПроверки = "") Экспорт
Если Условие <> Истина Тогда
Если ПустаяСтрока(Сообщение) Тогда
ТекстИсключения = НСтр("ru = 'Недопустимая операция'"); // Assertion failed
Иначе
ТекстИсключения = Сообщение;
КонецЕсли;
Если Не ПустаяСтрока(КонтекстПроверки) Тогда
ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 в %2'"),
ТекстИсключения,
КонтекстПроверки);
КонецЕсли;
ВызватьИсключение ТекстИсключения;
КонецЕсли;
КонецПроцедуры
ПоказатьВидно, что эта большое количество вызовов этой процедуры.
А дальше что делать??
Прикрепленные файлы:
(42) Записать(Новый Структура("ЗаписатьИЗакрыть"));
Если продолжить отладку, то это ПередЗаписью и т.д.
Ещё нужно посмотреть "не вскрыты" ли определяемые типы. Может там чего добавили?
Но как я понял ситуация не понятная, а это значит может быть имеет смысл запустить инструменты разработчика - Обновление вспомогательных данных(На ИТС обычно где-то есть) и какая-то еще есть(Не помню).
ТИИ не дает ошибок?
Если продолжить отладку, то это ПередЗаписью и т.д.
Ещё нужно посмотреть "не вскрыты" ли определяемые типы. Может там чего добавили?
Но как я понял ситуация не понятная, а это значит может быть имеет смысл запустить инструменты разработчика - Обновление вспомогательных данных(На ИТС обычно где-то есть) и какая-то еще есть(Не помню).
ТИИ не дает ошибок?
(45)
кстати, даёт, но и после тестирования ничего не изменилось. Хотя я ставила создать.
Проверка логической целостности. РегистрСведений.ГруппыЗначенийДоступа.Измерение.ГруппаЗначенийДоступа <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):<Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):1
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
Проверка логической целостности. РегистрСведений.СведенияОПользователях.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
Проверка логической целостности. РегистрСведений.СоставыГруппПользователей.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):<Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Объект, на который ссылается значение, отсутствует.
Проверка логической целостности. РегистрСведений.бит_ДоступныеИнтерфейсы.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
кстати, даёт, но и после тестирования ничего не изменилось. Хотя я ставила создать.
Проверка логической целостности. РегистрСведений.ГруппыЗначенийДоступа.Измерение.ГруппаЗначенийДоступа <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):<Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):1
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
Проверка логической целостности. РегистрСведений.СведенияОПользователях.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
Проверка логической целостности. РегистрСведений.СоставыГруппПользователей.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0):<Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Объект, на который ссылается значение, отсутствует.
Проверка логической целостности. РегистрСведений.бит_ДоступныеИнтерфейсы.Измерение.Пользователь <Объект не найден> (201:bab62c44fd95d95b11eb7da512b4d9c0)
ОбщийРеквизит.ОбластьДанныхОсновныеДанные = 0
Неверная ссылка.
Я частично нашла ошибку.
в чистой новой базе
при сохранении спр.Профили групп доступа ошибки не возникает.
Я очистила весь справочник Профили групп доступа в тестовой базе, оставила только администратора.
Но я не могу изменить доступные роли- не активна кнопка включить /исключить роли.
Также поставила базу на тестирование
Ошибка была в этом справочнике.
Сравню ещё раз файлы, которые были и которые стали после сохранения и попробую найти строчки, где конкретно была рекурсия.
в чистой новой базе
при сохранении спр.Профили групп доступа ошибки не возникает.
Я очистила весь справочник Профили групп доступа в тестовой базе, оставила только администратора.
Но я не могу изменить доступные роли- не активна кнопка включить /исключить роли.
Также поставила базу на тестирование
Ошибка была в этом справочнике.
Сравню ещё раз файлы, которые были и которые стали после сохранения и попробую найти строчки, где конкретно была рекурсия.
Прикрепленные файлы:
Доброго утра.
Решение мне помог найти air_mike
оказалось, что всё дело в дополнительных расширениях- есть роли, которые конфликтуют с ролями основной конфигурации.
ОбновлениеВспомогательныхДанных.epf использовали также эту обработку и точно также выскочила ошибка переполнение стека вызова.
Буду дальше смотреть и сравнивать эти роли с ролями из основной конфигурации.
Благодарю Всех за помощь и за разъяснения.
Решение мне помог найти air_mike
оказалось, что всё дело в дополнительных расширениях- есть роли, которые конфликтуют с ролями основной конфигурации.
ОбновлениеВспомогательныхДанных.epf использовали также эту обработку и точно также выскочила ошибка переполнение стека вызова.
Буду дальше смотреть и сравнивать эти роли с ролями из основной конфигурации.
Благодарю Всех за помощь и за разъяснения.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот