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

Помогите с обращение к реквизиту в РС

Автор Алексей_1985_06, 05 мар 2021, 20:34

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

Алексей_1985_06

Всем здравствуйте! Уважаемые программисты, помогите пожалуйста!
Необходимо при записи РС проводить проверку на ранее присвоенные звания, если звание раннее такое присваивалось - то запрещать запись!
Проблема в том, что не могу в запросе установить значение параметра Сотрудник (для отбора записей).

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВоинскиеЗвания.Сотрудник КАК Сотрудник,
| ВоинскиеЗвания.ВоинскоеЗвание КАК ВоинскоеЗвание
|ИЗ
| РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
|ГДЕ
| ВоинскиеЗвания.Сотрудник = &Сотрудник
|
|УПОРЯДОЧИТЬ ПО
| ВоинскиеЗвания.Период";
Запрос.УстановитьПараметр("Сотрудник", [b]ЭтотОбъект.Сотрудник); // ЗДЕСЬ ОШИБКА ![/b]


Массив = Новый Массив; // создаем массив

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий()Цикл
Массив.Добавить(Выборка.ВоинскоеЗвание); // добавляем в массив все ранее присвоенные звания
КонецЦикла;

// проверяем есть ли присвоенные ранее звания
Для Каждого Элемент Из Массив Цикл
Если Запись.ВоинскоеЗвание = Элемент Тогда
Сообщить("Ошибка ! Воинское звание присваивалось ранее");
Отказ = Истина;
КонецЕсли;
КонецЦикла;   

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


DmitriyF

Цитата: Алексей_1985_06 от 05 мар 2021, 20:34ЭтотОбъект.Сотрудник

Надеюсь это в модуле объекта делаешь? Попробуй Объект.Сотрудник.

Процедура ПередЗаписью(Отказ, Замещение)
   
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ВоинскиеЗвания.Сотрудник КАК Сотрудник,
    |    ВоинскиеЗвания.ВоинскоеЗвание КАК ВоинскоеЗвание
    |ИЗ
    |    РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
    |ГДЕ
    |    ВоинскиеЗвания.Сотрудник = &Сотрудник
    |
    |УПОРЯДОЧИТЬ ПО
    |    ВоинскиеЗвания.Период";
    Запрос.УстановитьПараметр("Сотрудник", Объект.Сотрудник); // ЗДЕСЬ ОШИБКА ![/b]

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Сообщить("Ошибка ! Воинское звание присваивалось ранее");
        Отказ = Истина;
    Иначе
    //Обрабатываешь и делаешь запись
    КонецЕсли;   
КонецЦикла;   

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


Это первое что на ум приходит ночью.

DNN

ЭтотОбъект - это набор записей. ЭтотОбъект[0].Сотрудник - это чтобы обратиться к сотруднику в первой строке. Учти, что он может быть пустым

Алексей_1985_06

Цитата: DmitriyF от 06 мар 2021, 00:37
Цитата: Алексей_1985_06 от 05 мар 2021, 20:34ЭтотОбъект.Сотрудник

ЦитироватьНадеюсь это в модуле объекта делаешь? Попробуй Объект.Сотрудник.
Процедура ПередЗаписью(Отказ, Замещение)
   
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ВоинскиеЗвания.Сотрудник КАК Сотрудник,
    |    ВоинскиеЗвания.ВоинскоеЗвание КАК ВоинскоеЗвание
    |ИЗ
    |    РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
    |ГДЕ
    |    ВоинскиеЗвания.Сотрудник = &Сотрудник
    |
    |УПОРЯДОЧИТЬ ПО
    |    ВоинскиеЗвания.Период";
    Запрос.УстановитьПараметр("Сотрудник", Объект.Сотрудник); // ЗДЕСЬ ОШИБКА ![/b]

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Сообщить("Ошибка ! Воинское звание присваивалось ранее");
        Отказ = Истина;
    Иначе
    //Обрабатываешь и делаешь запись
    КонецЕсли;   
КонецЦикла;   

КонецПроцедуры
Это первое что на ум приходит ночью.

Делаю, в модуле набора записей РС. Объект.Сотрудник - не подходит...
Добавлено: 06 мар 2021, 11:11


Цитата: DNN от 06 мар 2021, 07:10
ЭтотОбъект - это набор записей. ЭтотОбъект[0].Сотрудник - это чтобы обратиться к сотруднику в первой строке. Учти, что он может быть пустым
Спасибо за помощь! Написал так, но возникает ошибка:
Процедура ПередЗаписью(Отказ, Замещение)

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
            | ВоинскиеЗвания.Сотрудник КАК Сотрудник,
            | ВоинскиеЗвания.ВоинскоеЗвание КАК ВоинскоеЗвание,
            | ВоинскиеЗвания.Сотрудник КАК Сотрудник1
            |ИЗ
            | РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
            |ГДЕ
            | ВоинскиеЗвания.Сотрудник = &Сотрудник
            |
            |УПОРЯДОЧИТЬ ПО
            | ВоинскиеЗвания.Период";
Запрос.УстановитьПараметр("Сотрудник",ЭтотОбъект[0].Сотрудник); // ЗДЕСЬ ОШИБКА !
РезультатЗапроса = Запрос.Выполнить();

Если  НЕ РезультатЗапроса.Пустой() Тогда
Массив = Новый Массив; // создаем массив

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий()Цикл
Массив.Добавить(Выборка.ВоинскоеЗвание); // добавляем в массив все ранее присвоенные звания
КонецЦикла;
КонецЕсли;

// проверяем есть ли присвоенные ранее воинские звания
Для каждого Элемент Из Массив Цикл
Если Выборка.ВоинскоеЗвание = Элемент Тогда
Сообщить("Ошибка! Звание присваивалось ранее");
Отказ = Истина;

КонецЕсли;
КонецЦикла;   

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


Ошибка:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Индекс находится за границами массива
{РегистрСведений.ВоинскиеЗвания.МодульНабораЗаписей(59)}:   Запрос.УстановитьПараметр("Сотрудник",ЭтотОбъект[0].Сотрудник); // ЗДЕСЬ ОШИБКА !

LexaK

попробуйте такой вариант

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

Если ЭтотОбъект.Количество() > 0 Тогда
//есть строчки набора
лкСотрудник = ЭтотОбъект[0].Сотрудник;
лкЗвание = ЭтотОбъект[0].ВоинскоеЗвание;
//проверяем заданы ли значения, проверяемые значения
Если ЗначениеЗаполнено(лкСотрудник) и ЗначениеЗаполнено(лкЗвание) Тогда

    Запрос = Новый Запрос;
    Запрос.Текст = "
|ВЫБРАТЬ первые 1
                |    Истина
                |ИЗ
                |    РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
                |ГДЕ
                |    ВоинскиеЗвания.Сотрудник = &Сотрудник
                |и   ВоинскиеЗвания.ВоинскоеЗвание = &ВоинскоеЗвание
                |";
    Запрос.УстановитьПараметр("Сотрудник", лкСотрудник);
    Запрос.УстановитьПараметр("ВоинскоеЗвание", лкЗвание);

    РезультатЗапроса = Запрос.Выполнить();
Если  НЕ РезультатЗапроса.Пустой() Тогда
        Сообщить("Ошибка! Сотруднику: " + лкСотрудник + ", звание: " + лкЗвание + " - уже присваивалось ранее");
Отказ = Истина;
КонецЕсли;

КонецЕсли;

КонецЕсли;

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

Алексей_1985_06

Цитата: LexaK от 09 мар 2021, 10:33
попробуйте такой вариант

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

Если ЭтотОбъект.Количество() > 0 Тогда
//есть строчки набора
лкСотрудник = ЭтотОбъект[0].Сотрудник;
лкЗвание = ЭтотОбъект[0].ВоинскоеЗвание;
//проверяем заданы ли значения, проверяемые значения
Если ЗначениеЗаполнено(лкСотрудник) и ЗначениеЗаполнено(лкЗвание) Тогда

    Запрос = Новый Запрос;
    Запрос.Текст = "
|ВЫБРАТЬ первые 1
                |    Истина
                |ИЗ
                |    РегистрСведений.ВоинскиеЗвания КАК ВоинскиеЗвания
                |ГДЕ
                |    ВоинскиеЗвания.Сотрудник = &Сотрудник
                |и   ВоинскиеЗвания.ВоинскоеЗвание = &ВоинскоеЗвание
                |";
    Запрос.УстановитьПараметр("Сотрудник", лкСотрудник);
    Запрос.УстановитьПараметр("ВоинскоеЗвание", лкЗвание);

    РезультатЗапроса = Запрос.Выполнить();
Если  НЕ РезультатЗапроса.Пустой() Тогда
        Сообщить("Ошибка! Сотруднику: " + лкСотрудник + ", звание: " + лкЗвание + " - уже присваивалось ранее");
Отказ = Истина;
КонецЕсли;

КонецЕсли;

КонецЕсли;

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


LexaK огромное Вам спасибо! Не перестаю восхищаться Вашим профессионализмом !!! :ooifh::ooifh::ooifh:
Вы действительно "мастер" своего дела!

Теги:

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

Рейтинг@Mail.ru

Поиск