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

Помогите решить проблему с Датой

Автор programiss1C, 10 фев 2025, 16:01

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

programiss1C

Есть код, который должен, при попытке проведения документа Запись с записью с реквизитами ДатаНачала и Тренер,  совпадающими в записи регистра накопления УчетЗанятий ( то есть в регистре уже есть запись на эту дату и этого тренера, и повторно записаться на это время к этому тренеру нельзя), должно выдавать сообщение ошибки, что в выбранное время тренер занят и запись невозможна. Этот код работает, если реквизит Дата в документе Запись совпадает с реквизитом ВремяНачала, а если Дата не совпадает с ВремяНачала, то документ проводиться. Исправь код так, чтобы даже если в документе  Запись реквизит Дата не совпадал с ДатойНачала, то при попытке повторной записи на одну и ту же ДатуНачала и одного и того же Тренера выдавалось сообщение ошибки:
Процедура ОбработкаПроведения(Отказ, Режим)
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   // регистр УчетЗанятий
   Движения.УчетЗанятий.Записывать = Истина;
   Для Каждого ТекСтрокаЗанятие Из Занятие Цикл
      Движение = Движения.УчетЗанятий.Добавить();
      Движение.Период = ВремяНачала; // Изначально было равно Дата, но ошибка все равно была
      Движение.ВремяНачала = ВремяНачала;
      Движение.ВремяОкончания = ВремяОкончания;
      Движение.Клиент = Клиент;
      Движение.Тренер = Тренер;
      Движение.Услуги = ТекСтрокаЗанятие.Услуги;
      Движение.Количество = ТекСтрокаЗанятие.Количество;
   КонецЦикла;
   
    Движения.Записать();
   
   Если Режим = РежимПроведенияДокумента.Оперативный Тогда
      Запрос4 = Новый Запрос; 
      МенеджерВТ = Новый МенеджерВременныхТаблиц;
      Запрос4.МенеджерВременныхТаблиц = МенеджерВТ;
         Запрос4.Текст = "ВЫБРАТЬ
                        | УчетЗанятийОбороты.Тренер КАК Тренер,
                        | УчетЗанятийОбороты.ВремяНачала КАК ВремяНачала,
                        | УчетЗанятийОбороты.ВремяОкончания КАК ВремяОкончания
                        | ИЗ
                        | РегистрНакопления.УчетЗанятий.Обороты КАК УчетЗанятийОбороты
                        | ГДЕ
                        | УчетЗанятийОбороты.Тренер = &Тренер
                        | И (&ВремяНачала < УчетЗанятийОбороты.ВремяОкончания
                        | И &ВремяОкончания > УчетЗанятийОбороты.ВремяНачала)"; 

        Запрос4.УстановитьПараметр("Тренер", Тренер);
        Запрос4.УстановитьПараметр("ВремяНачала", ВремяНачала);
        Запрос4.УстановитьПараметр("ВремяОкончания", ВремяОкончания); 
      
        РезультатЗапроса = Запрос4.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
       
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл   
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Вы не можете записаться на " + Строка(ВыборкаДетальныеЗаписи.ВремяНачала) + " к тренеру " + Строка(ВыборкаДетальныеЗаписи.Тренер) + ", так как это время занято";
            Сообщение.Сообщить();   
            Отказ = Истина;
        КонецЦикла;
    КонецЕсли;
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Afinogen

 B) вам эту проверку надо  делать не в обработкепроведения документа а перед записью

Afinogen

при этом помнить что  при перепроведении документа контроль не должен работать

programiss1C

Afinogen, а где мне тогда делать? в модуле формы документа? или в модуле объекта также?

Afinogen

 B) я бы это делал в пакетном запросе, где в первом пакете инициализировал данные текущего документа, во втором пакете подымал бы данные из регистра с минусом данных текущего документа (вдруг этот документ уже был ранее проведен), все это запихивал во временные таблицы а в третьем пакете сравнивал бюы эти 2 таблицы

Afinogen


Afinogen

вы же можете делать документ копированием и тогда модуль формы не отработает

Afinogen

 B) а еще вы можете делать документ вводом на основании тогда такие проверки можно сразу воткнуть в обработку заполнения

programiss1C

Afinogen, я не настолько крутой разработчик 1С  :D Потому что совсем не понимаю о чем Вы говорите и что мне делать((

Afinogen

ЦитироватьИсправь код так, чтобы даже если в документе  Запись реквизит Дата не совпадал с ДатойНачала, то при попытке повторной записи на одну и ту же ДатуНачала и одного и того же Тренера выдавалось сообщение ошибки:
вот у вас прописано. в принципе тут не совсем понятно как пишется у вас в регистр но идея в том что в обработчике передзаписью вы:

1. имеете табчасть текущего докумнента с данными, из которой как я понимаю данные записываются в регистр.
2. запросом получаете данные которые уже у вас в регистре, приход/расход,  при этом соответственно из этих данных минусуете данные текущего  документа,  которые были ранее записаны в регистр (это для ситуации если кому то вдруг вздумалось перепровести документ задним числом или откорректировать что то в нем после того  когда вы первично  сохранили). То есть вам надо  получить текущий остаток без учета текущего документа
3. сравниваете по нужным вам критериям таблицу 1 и таб.2 и уже результат сравнения и есть ваш итоговый контроль


Теги:

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

Рейтинг@Mail.ru

Поиск