8.х БП Ввод на основании документа

Тема в разделе ""1С:Бухгалтерия БП"", создана пользователем Akuji, 11 ноя 2011.

  1. TopicStarter Overlay
    Akuji
    Offline

    Akuji Опытный в 1С

    Регистрация:
    5 июн 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    Необходимо ввести документ на основании РеализацииТоваровИУслуг.
    В случае если это уже было сделано ранее, открыть существующий.

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

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Где у вас этот код размещен? (в каком документе)

    Посмотрите как в типовой сделано формирование счет-фактуры из документа РТиУ. Сделайте аналогично.
  3. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    насколько я понимаю, механизм ввода на основании подрузамевает открытие нового документа после его заполнения.

    откуда у вас в процедуре взялись переменные ДанныеЗаполнения и СтандартнаяОбработка?? сами придумали?

    в обработку заполнения передается только одна переменная (см. синтаксис помощник), конструктор ввода на основании создает такой код:
    Код:
    Процедура ОбработкаЗаполнения(Основание)
    //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    Если ТипЗнч(Основание) = Тип("ДокументСсылка.Документ1") Тогда
    // Заполнение шапки
    Реквизит1 = Основание.Реквизит1;
    КонецЕсли;
    //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    КонецПроцедуры
    
    
    ЗЫ. по крайней мере в платформе 8.1.15.14.
  4. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    ЗЗЫ. упс. в 8.2 появилась СтандартнаяОбработка..

    насколько я понял из синтаксис-помощника, СтандартнаяОбработка определяет только автоматическое/не автоматическое заполнение одноименных элементов. документ все равно открывается после ОбработкиЗаполнения.
  5. Diego
    Offline

    Diego Любитель 1С Команда форума

    Регистрация:
    3 апр 2009
    Сообщения:
    966
    Симпатии:
    2
    Баллы:
    29
    Думаю, что после вт этих строк:

    Код:
    Сообщить("На основании данного документа отчет уже был сформирован. Будет открыт существующий");
    Форма = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьФорму();
    Форма.Открыть();
    
    и перед ИНАЧЕ должно стоять просто
    Код:
    возврат;
    
    Тогда Процедура ОбработкаЗаполнения прервется и новый пустой документ открыт не будет.
  6. TopicStarter Overlay
    Akuji
    Offline

    Akuji Опытный в 1С

    Регистрация:
    5 июн 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    возврат не прокатило(
  7. TopicStarter Overlay
    Akuji
    Offline

    Akuji Опытный в 1С

    Регистрация:
    5 июн 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    в счет фактуре нашел в комментариях что требуется закрыть новый и открыть старый... а как получить новый что б его закрыть? (там же что то не нашел)
  8. kotlovD
    Offline

    kotlovD Опытный в 1С

    Регистрация:
    16 фев 2011
    Сообщения:
    718
    Симпатии:
    0
    Баллы:
    26
    сор, не заметил - эта строчка уже есть
  9. Diego
    Offline

    Diego Любитель 1С Команда форума

    Регистрация:
    3 апр 2009
    Сообщения:
    966
    Симпатии:
    2
    Баллы:
    29
    Возврат точно должен быть, возможно нужно его переставить перед "Сообщить"

    У меня есть в одном документе аналогичная проверка, вводился ли уже документ на основании другого.
    Делал через критерии отбора: на основании документа "Маршрут" вводится документ "Возврат продукции". Если есть уже такой документ и он проведен - выдается предупреждение и новый док не вводится.

    Код:
    Если ТипЗнч(Основание) = Тип("ДокументСсылка.Маршрут") Тогда
    ЕстьПроведенные = 0;	
    Маршруты = Основание.Ссылка;	
    КритерийОтбора = "Маршрут";
    Список = ПолныеПрава.ПолучитьВыборкуПоКритериюОтбора(КритерийОтбора,Маршруты);
    Если Список.Количество() > 0 Тогда
    Для Каждого Строка из Список Цикл
    СсылкаНаДок = Строка.Ссылка;
    Если СсылкаНаДок.Метаданные().Имя = "ВозвратПродукции" Тогда 
    ОбъектДок = СсылкаНаДок.ПолучитьОбъект();
    Если ОбъектДок.Проведен Тогда
    ЕстьПроведенные = ЕстьПроведенные+1;
    КонецЕсли;	
    КонецЕсли;
    КонецЦикла;	
    
    Если ЕстьПроведенные > 0 Тогда
    Предупреждение("На основании этого маршрута уже проведен возврат продукции!");
    Возврат; //новый док не вводится
    Иначе
    ЗаполнитьПоМаршруту(Основание); //тут процедура заполнения нового дока
    КонецЕсли;
    
    
  10. TopicStarter Overlay
    Akuji
    Offline

    Akuji Опытный в 1С

    Регистрация:
    5 июн 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    если Возврат перед Сообщить то не открывается старый, а новый открывается все равно.
  11. TopicStarter Overlay
    Akuji
    Offline

    Akuji Опытный в 1С

    Регистрация:
    5 июн 2007
    Сообщения:
    119
    Симпатии:
    0
    Баллы:
    26
    Прописал в доп свойства формы значение что документ найден.
    И Перед открытием формы проверяю его.
    Вроде работает.

Поделиться этой страницей