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

Запрет редактирования конкретных строк

Автор Максим *****, 21 мар 2018, 11:06

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

Максим *****

Всем привет, столкнулся с проблемой, есть кто знающий может.
Создал запрос с условиями:
Запрос:
СпСотрудники = Табель.Выгрузить( ,"Сотрудник");
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ
   |   &Дата,
   |   СписокСотрудников.Сотрудник
   |ПОМЕСТИТЬ ВтСписокСотрудников
   |ИЗ
   |   &СписокСотрудников КАК СписокСотрудников
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВтСписокСотрудников.Дата,
   |   ВтСписокСотрудников.Сотрудник,
   |   МАКСИМУМ(ЕСТЬNULL(дстСотрудникиПериод.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))) КАК ДатаНазначения
   |ПОМЕСТИТЬ ВтСотрудникиПериод
   |ИЗ
   |   ВтСписокСотрудников КАК ВтСписокСотрудников
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.дстСотрудникиПериод КАК дстСотрудникиПериод
   |      ПО ВтСписокСотрудников.Дата >= дстСотрудникиПериод.Период
   |         И ВтСписокСотрудников.Сотрудник = дстСотрудникиПериод.ФизЛицо
   |         И (дстСотрудникиПериод.Регистратор ССЫЛКА Документ.дстПереводСотрудников)
   |
   |СГРУППИРОВАТЬ ПО
   |   ВтСписокСотрудников.Дата,
   |   ВтСписокСотрудников.Сотрудник
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВтСотрудникиПериод.Дата,
   |   ВтСотрудникиПериод.ДатаНазначения,
   |   ВтСотрудникиПериод.Сотрудник,
   |   МАКСИМУМ(дстОкладСотрудников.Период) КАК ДатаБлижНазн,
   |   МАКСИМУМ(дстОтпускныеСотрудников.Период) КАК ДатаНазначОтпускные
   |ПОМЕСТИТЬ дстОкладСотрудников
   |ИЗ
   |   ВтСотрудникиПериод КАК ВтСотрудникиПериод
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.дстОкладСотрудников КАК дстОкладСотрудников
   |      ПО ВтСотрудникиПериод.Сотрудник = дстОкладСотрудников.Сотрудник
   |         И (дстОкладСотрудников.Период МЕЖДУ ВтСотрудникиПериод.ДатаНазначения И ВтСотрудникиПериод.Дата)
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.дстОтпускныеСотрудников КАК дстОтпускныеСотрудников
   |      ПО (дстОтпускныеСотрудников.Период МЕЖДУ ВтСотрудникиПериод.ДатаНазначения И ВтСотрудникиПериод.Дата)
   |         И ВтСотрудникиПериод.Сотрудник = дстОтпускныеСотрудников.Сотрудник
   |
   |СГРУППИРОВАТЬ ПО
   |   ВтСотрудникиПериод.Дата,
   |   ВтСотрудникиПериод.ДатаНазначения,
   |   ВтСотрудникиПериод.Сотрудник,
   |   дстОтпускныеСотрудников.Период
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВтСписокСотрудников.Сотрудник,
   |   дстОтпускныеСотрудников.Отпускные,
   |   дстОкладСотрудников1.ФормаОплатыТруда,
   |   дстОкладСотрудников1.Оклад
   |ИЗ
   |   дстОкладСотрудников КАК дстОкладСотрудников
   |      ЛЕВОЕ СОЕДИНЕНИЕ ВтСписокСотрудников КАК ВтСписокСотрудников
   |      ПО дстОкладСотрудников.Дата = ВтСписокСотрудников.Дата
   |         И дстОкладСотрудников.Сотрудник = ВтСписокСотрудников.Сотрудник
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.дстОкладСотрудников КАК дстОкладСотрудников1
   |      ПО дстОкладСотрудников.ДатаБлижНазн = дстОкладСотрудников1.Период
   |         И дстОкладСотрудников.Сотрудник = дстОкладСотрудников1.Сотрудник
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.дстОтпускныеСотрудников КАК дстОтпускныеСотрудников
   |      ПО дстОкладСотрудников.ДатаНазначОтпускные = дстОтпускныеСотрудников.Период
   |         И дстОкладСотрудников.Сотрудник = дстОтпускныеСотрудников.Сотрудник
   |ГДЕ
   |   (ЕСТЬNULL(дстОкладСотрудников1.Оклад, 0) = 0
   |         ИЛИ ЕСТЬNULL(дстОкладСотрудников1.ФормаОплатыТруда, ЗНАЧЕНИЕ(Перечисление.дстФормыОплатыТруда.ПустаяСсылка)) = ЗНАЧЕНИЕ(Перечисление.дстФормыОплатыТруда.ПустаяСсылка)
   |         ИЛИ ЕСТЬNULL(дстОтпускныеСотрудников.Отпускные, 0) = 0)
   |   И НЕ дстОкладСотрудников1.ФормаОплатыТруда = ЗНАЧЕНИЕ(Перечисление.дстФормыОплатыТруда.Сдельная)
   |
   |СГРУППИРОВАТЬ ПО
   |   ВтСписокСотрудников.Сотрудник,
   |   дстОтпускныеСотрудников.Отпускные,
   |   дстОкладСотрудников1.ФормаОплатыТруда,
   |   дстОкладСотрудников1.Оклад";
   
   Запрос.УстановитьПараметр("СписокСотрудников", СпСотрудники);
   Запрос.УстановитьПараметр("Дата", ТекущаяДата());                         
   СпСотрудники = Запрос.Выполнить().Выгрузить();
ПОЛУЧИЛ НУЖНЫЕ МНЕ ДАННЫЕ ПО УСЛОВИЮ.
Далее, мне нужно сделать так, чтобы если Оклад или Отпускные или Форма оплаты у сотрудника не заполнены то данная строка не дает себя редактировать. Как? Каааак мне это реализовать?
Мои попытки, но они увенчались провалом:

Для каждого Строка Из СпСотрудники Цикл
Если Строка.Оклад = Неопределено  Тогда
    Отказ = Истина   
  КонецЕсли;
КонецЦикла;
______
Для каждого Строка Из СпСотрудники Цикл
Если Строка.Оклад < 0 Тогда
    Отказ = Истина   
  КонецЕсли;
КонецЦикла;
_____
СпСотрудник.Найти(, "Сотрудник");
Для каждого Строка Из СпСотрудники Цикл
Если Строка.Оклад = Неопределено 
ИЛИ ___________
ИЛИ __________

Тогда
    Отказ = Истина   
  КонецЕсли;
КонецЦикла;

alex0402

Цитата: Максим ***** от 21 мар 2018, 11:06Каааак мне это реализовать?
формы управляемые? тогда условное оформление. Если Нет, то ПриНачалеРедактирования или ПриНачалеИзменения - как то так.
Спасибо за Сказать спасибо

Максим *****

alex0402, Форма обычная, я и так пишу на ПриНачалеРедактирования, но толку нет
Добавлено: 21 мар 2018, 11:17


alex0402, Он вроде вообще все блокировал

alex0402

ЦитироватьТабличноеПоле.ПередНачаломИзменения (TableBox.BeforeRowChange)
ТабличноеПоле (TableBox)
ПередНачаломИзменения (BeforeRowChange)
Синтаксис:

ПередНачаломИзменения(<Отказ>)
Параметры:

<Отказ>

Тип: Булево.
Признак отказа от изменения. Если в теле процедуры-обработчика установить данному параметру значение Истина, интерактивное изменение строки не начнется.
Значение по умолчанию: Ложь
Описание:

Возникает перед началом интерактивного изменения существующей строки табличного поля.
Спасибо за Сказать спасибо

Максим *****

alex0402, Блин мужик не работает, может конечно я чего не так леплю, вот что пишу:

Процедура ФорматированныйТабель2ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

     Для каждого Строка Из СпСотрудники  Цикл
        Если НЕ ЗначениеЗаполнено(Строка.Отпускные) Тогда
        Отказ = Истина   
        КонецЕсли;
        
     КонецЦикла;
    
  КонецПроцедуры

Добавлено: 21 мар 2018, 11:39


alex0402, Так, извиняюсь не на ту процедуру щас писанул,
сейчас вот так:
Процедура ФорматированныйТабель2ПередНачаломИзменения(Элемент, Отказ)   
   Для каждого Строка Из СпСотрудники  Цикл
        Если НЕ ЗначениеЗаполнено(Строка.Отпускные) Тогда
        Отказ = Истина   
        КонецЕсли;
        
     КонецЦикла;


Но он блокирует все данные

alex0402

Спасибо за Сказать спасибо

Максим *****

alex0402, Да, и знаешь как то странно, я иду сначала в один документ табеля - там заблокирована вся таблица, иду в следующий, там ничего не заблокировано, снова иду дальше - опять блок :mellow:

alex0402

Возле (перед или после) Отказ = Истина; напиши Сообщить("Отказ"); и увидишь когда на самом деле твой алгоритм идет в отказ. Правь свой алгоритм.
Спасибо за Сказать спасибо

Максим *****

alex0402, Доброе утро, я вроде разобрался что к чему, если обращаюсь напрямую к таблице в табеле, то все работает, но  этой таблице нет отпускных, они лежат в СпСотрудники (Запрос), как мне обратиться отпускным? Использовал " Для каждого Строка Из СпСотрудники", но не вышло ничего

alex0402

Цитата: Максим ***** от 22 мар 2018, 07:56они лежат в СпСотрудники (Запрос)
можно выгрузить результат запроса в ТаблицуЗначений и искать там, можно изменить запрос, сделать его таким, что бы возвращал данные по 1 сотруднику и потом анализировать это....
Спасибо за Сказать спасибо

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

Рейтинг@Mail.ru

Поиск