Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:08

Помощь с Регистром сведений

Автор Алексей_1985_06, 09 фев 2021, 22:06

0 Пользователей и 1 гость просматривают эту тему.

Алексей_1985_06

Всем привет!
Вопрос следующий:
В справочнике "Сотрудники" есть реквизит категория сотрудника (гражданский персонал/военнослужащий).
В РС "ПослужнойСписок" каждой должности соответствует классификация.
Реализовано, что если сотрудника в категории: военнослужащий назначают на гражданскую должность, то в справочнике его категория сразу меняется на - гражданский персонал, и наоборот если гражданского - на военную должность,  то  его категория меняется - на военнослужащего.
Но при удалении записи из РС, автоматического определения категории сотрудника исходя из занимаемой им должности не происходит... подскажите в каком событии и как это можно реализовать? Чтобы категория сотрудника = классификации последней записи занимаемой должности (военная или гражданская) в РС "ПослужнойСписок". :dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:

Код сейчас такой:
Процедура ПередЗаписью(Отказ, Замещение)

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


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


alexandr_ll

Цитата: Алексей_1985_06 от 09 фев 2021, 22:06
Всем привет!
Вопрос следующий:
В справочнике "Сотрудники" есть реквизит категория сотрудника (гражданский персонал/военнослужащий).
В РС "ПослужнойСписок" каждой должности соответствует классификация.
Реализовано, что если сотрудника в категории: военнослужащий назначают на гражданскую должность, то в справочнике его категория сразу меняется на - гражданский персонал, и наоборот если гражданского - на военную должность,  то  его категория меняется - на военнослужащего.
Но при удалении записи из РС, автоматического определения категории сотрудника исходя из занимаемой им должности не происходит... подскажите в каком событии и как это можно реализовать? Чтобы категория сотрудника = классификации последней записи занимаемой должности (военная или гражданская) в РС "ПослужнойСписок". :dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:

Код сейчас такой:
Процедура ПередЗаписью(Отказ, Замещение)

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


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

Зачем вообще в справочнике нужен реквизит "Категория"? Сделайте на форме поле, которое отображает текущее состояние регистра сведений.

Алексей_1985_06

Цитата: alexandr_ll от 10 фев 2021, 07:49
Цитата: Алексей_1985_06 от 09 фев 2021, 22:06
Всем привет!
Вопрос следующий:
В справочнике "Сотрудники" есть реквизит категория сотрудника (гражданский персонал/военнослужащий).
В РС "ПослужнойСписок" каждой должности соответствует классификация.
Реализовано, что если сотрудника в категории: военнослужащий назначают на гражданскую должность, то в справочнике его категория сразу меняется на - гражданский персонал, и наоборот если гражданского - на военную должность,  то  его категория меняется - на военнослужащего.
Но при удалении записи из РС, автоматического определения категории сотрудника исходя из занимаемой им должности не происходит... подскажите в каком событии и как это можно реализовать? Чтобы категория сотрудника = классификации последней записи занимаемой должности (военная или гражданская) в РС "ПослужнойСписок". :dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:

Код сейчас такой:
Процедура ПередЗаписью(Отказ, Замещение)

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


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

Зачем вообще в справочнике нужен реквизит "Категория"? Сделайте на форме поле, которое отображает текущее состояние регистра сведений.

Спасибо! Да действительно, так и сделаю....не додумался сам!
Добавлено: 10 фев 2021, 18:37


Цитата: Алексей_1985_06 от 10 фев 2021, 18:02
Цитата: alexandr_ll от 10 фев 2021, 07:49
Цитата: Алексей_1985_06 от 09 фев 2021, 22:06
Всем привет!
Вопрос следующий:
В справочнике "Сотрудники" есть реквизит категория сотрудника (гражданский персонал/военнослужащий).
В РС "ПослужнойСписок" каждой должности соответствует классификация.
Реализовано, что если сотрудника в категории: военнослужащий назначают на гражданскую должность, то в справочнике его категория сразу меняется на - гражданский персонал, и наоборот если гражданского - на военную должность,  то  его категория меняется - на военнослужащего.
Но при удалении записи из РС, автоматического определения категории сотрудника исходя из занимаемой им должности не происходит... подскажите в каком событии и как это можно реализовать? Чтобы категория сотрудника = классификации последней записи занимаемой должности (военная или гражданская) в РС "ПослужнойСписок". :dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:

Код сейчас такой:
Процедура ПередЗаписью(Отказ, Замещение)

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


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

Зачем вообще в справочнике нужен реквизит "Категория"? Сделайте на форме поле, которое отображает текущее состояние регистра сведений.

Спасибо! Да действительно, так и сделаю....не додумался сам!

alexandr_ll  Извините...что-то я погорячился, переоценил свои возможности :D
Подскажите как это лучше реализовать? Поле создал, а как к нему сделать привязку к последней записи РС ?

alexandr_ll


LexaK

попробуйте такой вариант,
в форме элемента Справочника Сотрудники в событие ПриСоздании добавьте такой код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры
если помогло нажмите: Спасибо!

Алексей_1985_06

Цитата: LexaK от 11 фев 2021, 10:35
попробуйте такой вариант,
в форме элемента Справочника Сотрудники в событие ПриСоздании добавьте такой код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры


Огромное Вам человеческое спасибо!
Добавлено: 11 фев 2021, 21:17


Цитата: Алексей_1985_06 от 11 фев 2021, 17:34
Цитата: LexaK от 11 фев 2021, 10:35
попробуйте такой вариант,
в форме элемента Справочника Сотрудники в событие ПриСоздании добавьте такой код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры


Огромное Вам человеческое спасибо!

LexaK Извините что опять Вас беспокою :fdbsdfbsd:
Подскажите пжл что не так? Не записывается элемент (если форма открыта, то все меняется, а при закрытой форме никаких изменений не происходи, я так понимаю что запись элемента не происходит). Не пойму никак почему?

Сделал следующие:

1. В РС создал процедуру:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("ОбновитьДанныеСотрудников");
КонецПроцедуры

2. На форме справочника:
&НаСервере
Процедура ОбработкаОповещенияНаСервере()
Отбор = Новый Структура("Сотрудник",Объект.Ссылка);
ТЗ = РегистрыСведений.ПослужнойСписок.СрезПоследних(,Отбор);
    Если ТЗ.Количество() > 0 Тогда
        Если ТЗ[0].Должность.КлассификацияДолжности = Перечисления.КлассификацияДолжности.Гражданская Тогда
            Объект.Категория = Перечисления.КатегорияСотрудника.ГражданскийПерсонал;
        Иначе   
             Объект.Категория = Перечисления.КатегорияСотрудника.Военнослужащий;

// Запишем данные
Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию(Объект.Наименование);
СотрудникОбъект = Сотрудник.ПолучитьОбъект();
СотрудникОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьДанныеСотрудников" Тогда
ОбработкаОповещенияНаСервере();
КонецЕсли;
КонецПроцедуры



LexaK

вам все говорят что НЕ НАДО (не оптимально это) писать в элемент справочника Сотрудник категорию!
Вам показали/сделали механизм оперативного показа текущей категории при открытии Сотрудника,
а вы пытаетесь его применить к изменению объекта элемента,
то что вы хотите сделать, не через форму элемента должно делаться, так как если форма не открыта то ни какой код из нее не работает.
если вы настаиваете на своем решении дублировать данные, то надо доделывать обработку события записи в регистр сведений ПослужнойСписок.
если бы я делал, то использовал событие ПриЗаписи, в нем Запросом получил бы Сотрудников которым надо изменить Категорию,
т.е. один запрос, один проход по результату - на все случаи изменения регистра, добавление, исправление, удаление, 
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск