Имя: Пароль:
1C
1С v8
Ввод на основании
0 ogion83
 
31.07.13
16:43
На форме документа по кнопке создаю подчиненный документ. Если такой документ уже создан, то он открывается таким образом:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ДанныеЗаполнения.Проведен = Ложь Тогда
        Предупреждение("Нельзя ввести приемо-сдаточный акт на основании не проведенного акта выгрузки!");
        Возврат;
    КонецЕсли;
    СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст = "
|Выбрать
|ПСАЮр.Ссылка
|Из
|Документ.ПСАЮр КАК ПСАЮр
|Где
|ПСАЮр.ДокументОснование = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
    СтандартнаяОбработка = Ложь;
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    СсылкаНаДокумент = Выборка.Ссылка;
    Форма = СсылкаНаДокумент.ПолучитьФорму();
    Форма.Открыть();
    Возврат;
КонецЕсли;

Но при этом открывается ещё одна пустая форма. Кто-нибудь подскажите как от этого избавиться?
1 ogion83
 
31.07.13
16:45
При этом в новом пустом документе, даже не числится документ основание.
2 Капитан О
 
31.07.13
16:45
нехорошо интерфейсные вещи в модуле объекта делать
3 Maxus43
 
31.07.13
16:47
(2) + тем более в обработке заполнения.

Зачем?

Это делается обычно так...
Док = Документ.Траляля.СоздатьДокумент();
Док.заполнить(СсылкаНаТвойДок);
Док.ПолучитьФорму и т.д.
4 Лефмихалыч
 
модератор
31.07.13
16:48
(0) ужс... убери создание документа внутри обарботки заполнения.
У тебя задача не создать новый документ при создании нового документа, а установить Отказ в обработчике ПередОткрытием, если есть дубль документа. Вот эту задачу и решай
(1) ну еще бы, ты же там русским языком написал СтандартнаяОБработка = Ложь
5 ogion83
 
31.07.13
16:48
Может конечно, кто подскажет как по другому сделать так, чтоб по одной кнопке или создавался документ или открывался уже существующий?
6 Капитан О
 
31.07.13
16:49
(5) нехорошо такое на одну кнопку вешать
7 ogion83
 
31.07.13
16:49
(6) В 1С7 так реализовано и нормально
8 Maxus43
 
31.07.13
16:51
(7) забудь клюшки, всяк сюда входящий...
9 ogion83
 
31.07.13
16:51
(4) Где это я создаю новый документ? Ищу существующий и его открываю
10 ogion83
 
31.07.13
16:51
(8) Пользователям требуется аналогично сделать
11 Maxus43
 
31.07.13
16:52
(5) см (3) + твой запрос по поиску уже введённого.
Вобще такое реализовано, наподобие Счетов-фактур в РТУ/ПТУ
12 Капитан О
 
31.07.13
16:52
(7) я слышал, в семёрке даже свой язык запросов есть
13 Лефмихалыч
 
модератор
31.07.13
16:53
(9) тогда так
// модуль объекта
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
  Если ТакойДокументУжеЕсть() Тогда
     ДополнительныеСвойства.Вставить("Отказ",истина)



//модуль формы
Процедура ПередОткрытием(отказ)

   Если ДополнительныеСвойства.Свойство("Отказ", Отказ) И отказ Тогда
      Возврат;
14 ogion83
 
31.07.13
17:00
Хрен знает как...
15 ogion83
 
31.07.13
17:05
В каком тут месте создается лишний документ?

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ДанныеЗаполнения.Проведен = Ложь Тогда
        Предупреждение("Нельзя ввести приемо-сдаточный акт на основании не проведенного акта выгрузки!");
        Возврат;
    КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "
|Выбрать
|ПСАЮр.Ссылка
|Из
|Документ.ПСАЮр КАК ПСАЮр
|Где
|ПСАЮр.ДокументОснование = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
    СтандартнаяОбработка = Ложь;
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    СсылкаНаДокумент = Выборка.Ссылка;
    Форма = СсылкаНаДокумент.ПолучитьФорму();
    Форма.Открыть();
    Возврат;
КонецЕсли;
    ДокументОснование = ДанныеЗаполнения;
    //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.АктВыгрузки") Тогда
        // Заполнение шапки
        Контрагент = ДанныеЗаполнения.Контрагент;
        МестоХранения = ДанныеЗаполнения.МестоХранения;
        Сотрудник = ДанныеЗаполнения.Сотрудник;
        Если Вопрос("Скопировать табличную часть из акта выгрузки в ПСА?",РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
    
        Для Каждого ТекСтрокаВыгружаемоеСырьё Из ДанныеЗаполнения.ВыгружаемоеСырьё Цикл
            НоваяСтрока = СписокПривезенногоСырья.Добавить();
            НоваяСтрока.Засор = ТекСтрокаВыгружаемоеСырьё.Засор;
            НоваяСтрока.КоличествоБрутто = ТекСтрокаВыгружаемоеСырьё.КоличествоБрутто;
            НоваяСтрока.КоличествоНетто = ТекСтрокаВыгружаемоеСырьё.КоличествоНетто;
            НоваяСтрока.МПЗ = ТекСтрокаВыгружаемоеСырьё.МПЗ;
            НоваяСтрока.Сумма = ТекСтрокаВыгружаемоеСырьё.Сумма;
            НоваяСтрока.Цена = ТекСтрокаВыгружаемоеСырьё.Цена;
        КонецЦикла;
        
        КонецЕсли;
    Иначе
        Возврат;
    КонецЕсли;
    //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    
    КонецПроцедуры
16 Шапокляк
 
31.07.13
17:08
Нет такого места. Лишний документ создается платформой при нажатии кнопки ввода на основании. именно с ним имеет дело ОбработкаЗаполнения.
17 Maxus43
 
31.07.13
17:09
к слову, код
Если ДанныеЗаполнения.Проведен = Ложь Тогда
даст ошибку при создании нового документа не на основании. Там данные заполнения = неопределено, ТИП надо проверять обязательно, до каких либо действий с ним.
18 ogion83
 
31.07.13
17:13
(17) Да это то знаю, с 1 проблемой пока парюсь
19 Лефмихалыч
 
модератор
31.07.13
17:14
(18) в (13) решение
20 Maxus43
 
31.07.13
17:16
(19) решений много, автор игнорит.
(18) да сделай как в типовой, не парься
21 ogion83
 
31.07.13
17:22
Сделал 2-мя кнопками, одна на другой, в зависимости от условий   или "создать" или "Открыть". И гори всё ...)