8.х [РЕШЕНО] РеквизитФормыВЗначение

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем nickvv, 2 мар 2017.

  1. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Уважаемые эксперты, помогите разобраться!
    КА-2.2.2.199
    При создании на основании Заказа клиента самописного документа Карточка сделки, надо проверить, нет ли уже созданного ранее документа.
    В модуле формы Карточки сделки написал:
    Код:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
            // ищем документы, ранее уже введенные на основании.
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
                           |    КарточкаСделки.Ссылка КАК Ссылка
                           |ИЗ
                           |    Документ.КарточкаСделки КАК КарточкаСделки
                           |ГДЕ
                           |    КарточкаСделки.ДокументОснование.Ссылка = &Основание";
      
            Основание = РеквизитФормыВЗначение("ДокументОснование");
            Запрос.УстановитьПараметр("Основание", Основание);
            Результат = Запрос.Выполнить().Выбрать().Количество();
      
            Если Результат > 0 Тогда
                Отказ = Истина;
                Сообщить("Документ Карточка сделки уже введен");
                Возврат;
            КонецЕсли;
      
          Объект.МаржинальнаяПрибыль = Объект.СуммаСделкиПоДоговору;
          Объект.ПроизводственнаяМПСумма = Объект.МаржинальнаяПрибыль;
          Объект.ПроизводственнаяМППроцент = 100;
    
          // СтандартныеПодсистемы.Печать
          УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма);
          // Конец СтандартныеПодсистемы.Печать
    
    КонецПроцедуры
    
    и при попытке создания Карточки сделки на основании Заказа клиента получаю ошибку:
    Где же ошибка? Реквизит ДокументОснование есть на форме.
    Если пишу
    Код:
    Основание = РеквизитФормыВЗначение("Объект.ДокументОснование");
    - та же ошибка.
    Спасибо!
    Последнее редактирование: 2 мар 2017
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    Для того, что использовать ссылку на документ основание из реквизита в качестве параметра запроса, вообще не нужно делать РеквизитФормыВЗначение().
    nickvv нравится это.
  3. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    559
    Баллы:
    204
    А ДокументОснование точно является реквизитом формы, а не объекта ?
    nickvv нравится это.
  4. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    А как же надо? Ведь документа в базе ещё нет, и он и не должен создаваться, если раньше уже был создан документ, у которого ДокументОснование - этот же Заказ.
    --- Объединение сообщений, 2 мар 2017 ---
    ДокументОснование - реквизит самого документа, но он же по команде СоздатьНаОсновании передается сразу в форму (на форму этот реквизит выведен).
    Как же из формы проверить наличие уже существующих документов, у которых такое же значение реквизита ДокументОснование?
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    По команде СоздатьНаОсновании он передается в реквизит объекта, форма - это всего лишь способ отображения понятный/удобный для пользователя.

    Ссылка на документ основание доступна в реквизите объекта просто как Объект.ДокументОснование.
    nickvv нравится это.
  6. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Так объекта же еще нет в базе, мы должны проверить существование документов с таким же значением ДокументОснование до записи нашего нового объекта в базу
  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    С чего его нет-то? Вы ж на основании этого документа создали свой, который даже уже заполнен по документу основанию.
    Если документа основания нет в БД, то чего вы проверять хотите?
    nickvv нравится это.
  8. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Сделал вот так:
    Код:
    Основание = Объект.ДокументОснование;
    Но отладчик показывает Результат = 0 даже в случае существования введенного ранее подчиненного документа
    --- Объединение сообщений, 2 мар 2017 ---
    ДокументОснование в базе как раз есть, надо проверить, есть ли по этому документу в базе подчиненные документы Карточка сделки.
    Я же проверяю из модуля формы вновь создаваемого документа, подчиненного документу-основанию. Я имел в виду, что этого создаваемого подчиненного документа нет в базе.
    Последнее редактирование: 2 мар 2017
  9. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    559
    Баллы:
    204
    Вроде, в 1С уже есть встроенный механизм структуры подчиненности, завязан на критериях отбора
    nickvv нравится это.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    Значит по этому ЗаказуПокупателя еще нет ни одного документа КарточкаСделки.
    nickvv нравится это.
  11. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Есть КритерийОтбора.СвязанныеДокументы, в состав которого включен в том числе и этот самописный документ КарточкаСделки.
    А как его можно использовать для поиска существующих документов?
    --- Объединение сообщений, 2 мар 2017 ---
    в том то и дело, что проверяю по тому заказу, по которому карточка сделки уже есть
    upload_2017-3-2_9-47-55.png
    Именно при попытке создать новую карточку сделки на основании этого заказа запрос ничего не находит, выдает Результат = 0
  12. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    Что содержится в Объект.ДокументОснование?
    nickvv нравится это.
  13. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    upload_2017-3-2_9-55-13.png
    если провалиться в Основание до ДокументОснование:
    upload_2017-3-2_9-57-12.png
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    Так заполните ДокументОснование в ОбработкаЗаполнения.
    nickvv нравится это.
  15. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    в модуле КарточкиСделки есть:
    Код:
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
            // Заполнение шапки
            ДоговорКонтрагента = ДанныеЗаполнения.Договор;
            КонечныйЗаказчик = ДанныеЗаполнения.КонечныйЗаказчик;
            Контрагент = ДанныеЗаполнения.Контрагент;
            ОтветственныйПоСделке = ДанныеЗаполнения.Менеджер;
            Организация = ДанныеЗаполнения.Организация;
            Партнер = ДанныеЗаполнения.Партнер;
            Приоритет = ДанныеЗаполнения.Приоритет;
            ДокументОснование = ДанныеЗаполнения.Ссылка;
            СуммаСделкиПоДоговору = ДанныеЗаполнения.СуммаДокумента;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Спецификация.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.КоличествоПользователей = ТекСтрокаТовары.КоличествоПользователей;
                НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
                НоваяСтрока.СрокГарантииКон = ТекСтрокаТовары.СрокГарантииКон;
                НоваяСтрока.СрокГарантииНач = ТекСтрокаТовары.СрокГарантииНач;
                НоваяСтрока.СрокДействияЛицензии = ТекСтрокаТовары.СрокДействияЛицензии;
                НоваяСтрока.Сумма = ТекСтрокаТовары.СуммаСНДС;
                НоваяСтрока.Характеристика = ТекСтрокаТовары.Характеристика;
                НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
            КонецЦикла;
            Для Каждого ТекСтрокаЭтапыГрафикаОплаты Из ДанныеЗаполнения.ЭтапыГрафикаОплаты Цикл
                НоваяСтрока = ЭтапыГрафикаОплаты.Добавить();
                НоваяСтрока.ДатаПлатежа = ТекСтрокаЭтапыГрафикаОплаты.ДатаПлатежа;
                НоваяСтрока.ПроцентПлатежа = ТекСтрокаЭтапыГрафикаОплаты.ПроцентПлатежа;
                НоваяСтрока.СуммаПлатежа = ТекСтрокаЭтапыГрафикаОплаты.СуммаПлатежа;
            КонецЦикла;
        КонецЕсли;
    КонецПроцедуры
    
    Получается, что до заполнения просто не доходит?
    Как же заставить сначала выполнить заполнение, а потом уже - ПриСозданииНаСервере?
  16. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.821
    Симпатии:
    1.024
    Баллы:
    204
    Вероятно и такое. Разберитесь с процессом ввода документа на основании и его заполнения.
    nickvv нравится это.
  17. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    148
    Симпатии:
    19
    Баллы:
    29
    Все не так!
    Если вы создаете документ Карточка Сделки на основании документа Заказ Клиента.
    то у вас в модуле документа Карточка Сделки есть обработка/процедура
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

    ДанныеЗаполнения - это ссылка Заказ клиента

    в этой процедуре делаете запрос/проверку
    пример
    Код:
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    //проверка
    лкЗапрос = Новый Запрос;
    лкЗапрос.Текст = "
        |Выбрать
        |    Док.Ссылка
        |Из
        |   Документ.КарточкаСделки Док
        |Где
        |   Док.ДокументОснование = &Заказ
        |   //здесь можно добавить еще проверок, например что документ не помечен на удаление
        |";
    лкЗапрос.УстановитьПараметр("Заказ", ДанныеЗаполнения);
    
    //для отладки
    //ВнешниеОбработки.Создать("C:\Temp\!!!ЗапросУФ.epf", Ложь).СохранитьЗапросВФайл(лкЗапрос, "C:\Temp\Запрос.sel")
    
    лкРезультат = лкЗапрос.Выполнить().Выбрать();
    Если лкРезультат.Следующий() Тогда
        //Есть Карточка, сообщаем и отменяем ввод
        ВызватьИсключение "Уже есть Карточка: " + лкРезультат.Ссылка;
    КонецЕсли;
    
    //проверка прошла, дальше код по формированию карточки
    ...
    КонецПроцедуры;
    
    при попытке второй раз по одному и тому же Заказу клиента создать Карточку вам будет выдаваться сообщение
    и Карточка не будет создана.

    Вроде все так. Проверьте.
    nickvv нравится это.
  18. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    440
    Симпатии:
    2
    Баллы:
    29
    Да, так всё работает. Спасибо!