Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ввод на основаниии
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Андрис
Имеются два документа, один из них вводится на основании другого. Как отменить ввод (создание) нового документа, если на основании первого документа уже был введен документ?
Создал в первом документе реквизит (ЗаявкаНаРемонт) - ссылка на второй документ, заполняется при первом вводе на основании. Во втором документе есть реквизит основание - ссылка на документ-основание. В каком событии проверять на заполнение реквизита ЗаявкаНаРемонт и отказаться от создания нового документа при нажатии на кнопку создать на основании?
Stazy
В процедуре "Перед открытием" формы документа, вводимого на основании.
Vofka
Если имеется ввиду именно ввод на основании - тогда
ОбработкаЗаполнения()


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

Хотел добавить: ввод на основании осуществляется стандартно. В свойствах документов указано, что один документ является основанием для другого, обработка заполнения построена конструктором. Дальше нужно доработать, отказаться от стандартной обработки и запретить создание документа, если уже введен документ на основании первого документа (это уже писал).
Vofka
Цитата
Так вот эту ссылку мы никак не имеем в процедуре ПередОткрытием

Почему это? Должны иметь.
Андрис
Цитата(Vofka @ 23.06.11, 18:57) необходимо зарегистрироваться для просмотра ссылки
Почему это? Должны иметь.

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


//Текст процедуры ПриСозданииНаСервере() (модуль формы 2-го документа)
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ЗаявкаНаРемонт.Ссылка
                   |ИЗ
                   |    Документ.ЗаявкаНаРемонт КАК ЗаявкаНаРемонт
                   |ГДЕ
                   |    ЗаявкаНаРемонт.Основание = &СсылкаНаЗаявку";
                  
    Запрос.УстановитьПараметр("СсылкаНаЗаявку", Объект.Основание);
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
        
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Сообщить("Заявка уже создана!!!"+ "Номер заявки - " + Выборка.Ссылка + Символы.ПС + "Для просмотра кликлите" + Символы.ПС + "на ссылку заявки на форме");
        Отказ = Истина;
        
    КонецЕсли;
DartRomanius
Цитата(Андрис @ 24.06.11, 15:29) необходимо зарегистрироваться для просмотра ссылки
Виноват! Все правильно. Сам же создал реквизит ОСНОВАНИЕ у 2-го документа. Его и можно проверять в запросе в процедуре формы ПриОткрытии(), подставляя значение параметра запроса ОБЪЕКТ.ОСНОВАНИЕ. (Или ПриСозданииНаСервере).
Все отлично работает, при нажатии на кнопку создать на основании, новый документ не создается. Но возникла другая проблема: когда я хочу просто просмотреть этот документ, соответственно тоже получаю отказ из события ПриОткрытии().
Надеюсь доступно изъяснился.


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



Сделать более сложное сравнение, что-то типа:

Вернуть подчиненный
если подчиненный = неопределено тогда ничего не делаем (или по желанию)
если подчиненный = этот документ (сравнить по ссылке) тогда типа нормально
если подчиненный = не этот документ тогда идем в отказ
Vofka
Цитата
Но возникла другая проблема: когда я хочу просто просмотреть этот документ, соответственно тоже получаю отказ из события ПриОткрытии()

Поэтому я изначально и сказал про процедуру
ОбработкаЗаполнения()
DartRomanius
Цитата(Vofka @ 24.06.11, 16:29) необходимо зарегистрироваться для просмотра ссылки
Поэтому я изначально и сказал про процедуру
ОбработкаЗаполнения()


Ага.
В данной процедуре установить реквизит основание, ну а дальше в "ПриОткрытии".
Андрис
Цитата(Vofka @ 24.06.11, 16:29) необходимо зарегистрироваться для просмотра ссылки
Поэтому я изначально и сказал про процедуру
ОбработкаЗаполнения()

А как в ОбработкеЗаполнения отказаться от создания документа? Здесь я только могу заполнить реквизит Объект.Основание.
//
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ЗадачаСсылка.ЗаявкаНаРемонт") Тогда
        // Заполнение шапки
        ИнвНомер = ДанныеЗаполнения.ИнвНомер;
        Отдел = ДанныеЗаполнения.Подразделение;
        Основание = ДанныеЗаполнения.Ссылка;
    КонецЕсли;
    
КонецПроцедуры


Цитата(DartRomanius @ 24.06.11, 17:32) необходимо зарегистрироваться для просмотра ссылки
Ага.
В данной процедуре установить реквизит основание, ну а дальше в "ПриОткрытии".

Надо попробовать ваше более сложное сравнение.

Цитата(DartRomanius @ 24.06.11, 15:46) необходимо зарегистрироваться для просмотра ссылки
Сделать более сложное сравнение, что-то типа:

Вернуть подчиненный
если подчиненный = неопределено тогда ничего не делаем (или по желанию)
если подчиненный = этот документ (сравнить по ссылке) тогда типа нормально
если подчиненный = не этот документ тогда идем в отказ


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

Просто сделал проверку: если форма открывается по кнопке СоздатьНаОсновании, значит создается новый документ, и тогда применяем проверки и отказываемся от создания, если надо.
Если же просто открываем документ для просмотра или редактирования, тогда нестандартного не происходит.
Поправьте меня, если что-то сделал не так.

Спасибо за учебу!
g789
Цитата(Андрис @ 22.06.11, 13:38) необходимо зарегистрироваться для просмотра ссылки
Во втором документе есть реквизит основание - ссылка на документ-основание.


В ОбработкаЗаполнения() заполняяем реквизит

основание = ДанныеЗаполнения.Ссылка;


При сохранении нового документа на основании проверять есть ли уже документ по этому основанию
DartRomanius
Цитата(g789 @ 29.06.11, 12:17) необходимо зарегистрироваться для просмотра ссылки
В ОбработкаЗаполнения() заполняяем реквизит

основание = ДанныеЗаполнения.Ссылка;


При сохранении нового документа на основании проверять есть ли уже документ по этому основанию


Та там не при записи надо было. А при открытии проверять.

Кстати еще вот в голову пришло, проверку на основание делать не всегда при открытии а если это новый не записанный документ.
Например так:
Процедура Приоткрытии(....)
....
Если Параметры.Ключ.Пустая() Тогда // собственно наш случай делаем проверку
    Если ...... Тогда ......
    Иначе.....
    КонецЕсли;
КонецЕсли;
....
КонецПроцедуры
g789
Цитата(DartRomanius @ 29.06.11, 12:43) необходимо зарегистрироваться для просмотра ссылки
Та там не при записи надо было. А при открытии проверять.

Именно при записи - не давать записывать второй документ с одним и тем же основанием. Тогда и при открытии ни чего мудрить не надо
DartRomanius
Цитата(g789 @ 29.06.11, 14:46) необходимо зарегистрироваться для просмотра ссылки
Именно при записи - не давать записывать второй документ с одним и тем же основанием. Тогда и при открытии ни чего мудрить не надо


Вообще ситуация (ранее) выглядела как не давать создать документ на основании, если уже есть такой документ. smile.gif
Читаем внимательно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.