8.х [РЕШЕНО] Запрет создания новых документов до проведения документа-основания

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

  1. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Уважаемые эксперты, помогите разобраться!
    КА-2.2.2.199
    На основании типового документа ЗаказКлиента создан самописный документ КарточкаСделки, провести который может только пользователь с соответствующими правами после проверки.
    Только после того, как этот документ будет проведен, должна появиться возможность создания на основании родительского Заказа клиента последующих документов (Счет на оплату, Реализация товаров и услуг).
    Т.е., видимо, в процедуре ПриСоздании надо прописать проверку? Как проверить проведение подчиненного Заказу клиента документа Карточка сделки при созаднии на основании этого Заказ клиента нового документа Реализация ТУ?
    И попутно: почему-то этот новый документ не отображается в структуре подчиненности Заказа клиента (как и в своей структуре подчиненности не показывает Заказ-основание).
    Как это должно быть сделано, где прописано?
    Спасибо.
    Последнее редактирование: 21 фев 2017
  2. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Со структурой подчиненности разобрался, отображается.
    Как добавить проверку на наличие подчиненного документа, чтобы отключить возможность создания нового, если документ уже есть?
    Последнее редактирование: 21 фев 2017
  3. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    1.У КарточкаСделки должен быть реквизит ДокументОснование
    2. В процедуре заполнения документов Счет на оплату, Реализация товаров и услуг проверять существование КарточкаСделки и его статус.
    nickvv нравится это.
  4. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Я правильно понимаю, что в таком случае даже при отказе в процедуре заполнения этих документов (т.е. КарточкаСделки не проведена или ее вообще нет) у пользователя будет возможность сохранить эти документы? Может быть, эту проверку надо в процедуре ПриСоздании реализовать?
    Задача - реализовать строгий запрет создания документов до проведения КарточкиСделки

    И дополнение к #2: как сделать, чтобы в случае существования в системе подчиненного документа при попытке ввода нового открывался существующий?
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

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

    Открывать форму существующего документа.
    nickvv нравится это.
  6. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    А можно сделать недоступной команду ввода на основании, если соответствующая КарточкаСделки не проведена? Т.е. включать доступность команды ввода на основании ЗаказаКлиента только после проведения подчиненной КарточкиСделки? Как это можно сделать?
  7. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    В первом приближении:
    необходимо пробежаться по кнопкам на панели кнопок формы документа

    Но может оказаться, что кнопки, формируемые платформой автоматически, не доступны для редактирования/удаления/добавления.
    nickvv нравится это.
  8. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    в модуле менеджера Заказа клиента есть

    Код:
    Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСоздатьНаОсновании) Экспорт
    
    там и добавляются в список по кнопке "На основании" подчиненные документы.
    там есть некие проверки, например:
    Код:
        Если ПолучитьФункциональнуюОпцию("ИспользоватьВнутреннееСогласованиеЗаказовКлиентов") Тогда
            КомандаСоздатьНаОсновании = БизнесПроцессы.СогласованиеПродажи.ДобавитьКомандуСоздатьНаОсновании(КомандыСоздатьНаОсновании);
            Если КомандаСоздатьНаОсновании <> Неопределено Тогда
                КомандаСоздатьНаОсновании.Обработчик = "ВводНаОснованииУТКлиент.СоздатьНовоеСогласованиеЗаказаКлиента";
                КомандаСоздатьНаОсновании.Идентификатор = "СоздатьНовоеСогласованиеЗаказаКлиента";
                КомандаСоздатьНаОсновании.Представление = НСтр("ru = 'Согласование заказа клиента'");
                КомандаСоздатьНаОсновании.ПроверкаПроведенияПередСозданиемНаОсновании = Истина;
                КомандаСоздатьНаОсновании.ФункциональныеОпции = "ИспользоватьВнутреннееСогласованиеЗаказовКлиентов";
            КонецЕсли;
        КонецЕсли;
    
    или просто добавление команды:
    Код:
        Документы.РеализацияТоваровУслуг.ДобавитьКомандуСоздатьНаОснованииЗаказа(КомандыСоздатьНаОсновании);
    
    Может быть, где-то тут организовать проверку на наличие подчиненного проведенного документа КарточкаСделки?
    Каким образом можно это сделать, если можно?
    Как проверить наличие проведенного подчиненного документа?
    Последнее редактирование: 21 фев 2017
  9. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Тут и нужно делать:

    Что-то вроде

    Код:
    Если ДокументКарточкаСделкиСуществуетИПроведен() Тогда
    КомандаСоздатьНаОсновании = БизнесПроцессы.СогласованиеПродажи.ДобавитьКомандуСоздатьНаОсновании(КомандыСоздатьНаОсновании);
    .....
    КонецЕсли;
    А так же создать соответственные обработчики формирования документов, либо "встроиться" в существующие.
    nickvv нравится это.
  10. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    а ДокументКарточкаСделкиСуществуетИПроведен() - это что?
    Как раз синтаксис такой проверки не очень представляю
  11. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Функция, которая вернет Истина или Ложь в зависимости от того, существует документ и проведен или нет.
    nickvv нравится это.
  12. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    А можно пример функции привести?
  13. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Напишу очень уклончиво и корявенько. Оптимизация кода - домашнее задание :)

    Код:
    Функция ДокументКарточкаСделкиСуществуетИПроведен()
    
    Результат = Ложь;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать все документы КарточкаСделки, у которых ДокументОснование = &ЗаказПокупателя"
    .....
    
    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если ДокументПроведен тогда
    Результат Истина;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
    
    КонецФункции
    nickvv нравится это.
  14. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Спасибо!
    Ее куда - в модуль менеджера вставлять?
  15. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Можно и в модуль менеджера.
  16. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Что-то как-то не то:
    добавил в процедуру ПриСозданииНаСервере в модуле формы ЗаказаКлиента после формирования кнопки командной панели "СоздатьНаОсновании" следующее:
    Код:
        Если НЕ ДокументКарточкаСделкиСуществуетИПроведен() Тогда
            Элементы.ПодменюСоздатьНаОсновании.ПодчиненныеЭлементы.ПодменюСоздатьНаОснованииКомандаСоздатьНаОсновании1_СоздатьНаОснованииЗаказа.Доступность = Ложь;
            Элементы.ПодменюСоздатьНаОсновании.ПодчиненныеЭлементы.ПодменюСоздатьНаОснованииКомандаСоздатьНаОсновании2_СоздатьСчетНаОплату.Доступность = Ложь;
        КонецЕсли;
    
    В том же модуле формы:
    Код:
    Функция ДокументКарточкаСделкиСуществуетИПроведен()
    
    Результат = Ложь;
    
    СсылкаНаДокумент = Документы.ЗаказКлиента.ПолучитьСсылку();
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    КарточкаСделки.Проведен,
                   |    КарточкаСделки.ДокументОснование
                   |ИЗ
                   |    Документ.КарточкаСделки КАК КарточкаСделки
                   |ГДЕ
                   |    КарточкаСделки.Проведен = ИСТИНА
                   |    И КарточкаСделки.ДокументОснование = &СсылкаНаДокумент";
    
    Запрос.УстановитьПараметр("СсылкаНаДокумент",СсылкаНаДокумент);
               
    Проверка = Запрос.Выполнить();
    Если НЕ Проверка.Пустой() Тогда
        Результат = Истина;
    КонецЕсли;
    
    Возврат Результат;
    
    КонецФункции
    
    Там - потому что кнопка командной панели формы создается динамически (когда вставлял эту проверку в модуль менеджера - добавить команду при выполнении условия - эти документы вообще не отображались в команде ввода на основании).
    Создание документов действительно стало недоступным по кнопке"СоздатьНаОсновании", но они стали недоступными для всех ЗаказовКлиента, даже если по нему есть проведенный документ КарточкаСделки.
    Как же все-таки надо сделать?
    Прогнал отладчиком. При открытии ЗаказаКлиента, по которому есть проведенная КарточкаСделки, Результат все равно остался "Ложь".
    Ошибка в запросе? Вернее - что-то не то с параметром запроса (или с Если...КонецЕсли), потому что в консоли запросов всё отрабатывается.
    Что не так?
    Последнее редактирование: 22 фев 2017
  17. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Для чего делать

    СсылкаНаДокумент = Документы.ЗаказКлиента.ПолучитьСсылку();

    если Ссылка уже известна, т.к. находимся в форме документа ЗаказПокупателя?

    Если документ новый, то и смысла выполнять что-либо нет вообще.
    nickvv нравится это.
  18. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Я это уже понял и убрал. Сейчас вот как:
    Код:
    Функция ДокументКарточкаСделкиСуществуетИПроведен()
    
    Результат = Ложь;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    КарточкаСделки.Проведен,
                   |    КарточкаСделки.ДокументОснование
                   |ИЗ
                   |    Документ.КарточкаСделки КАК КарточкаСделки
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
                   |        ПО КарточкаСделки.ДокументОснование = ЗаказКлиента.Ссылка
                   |ГДЕ
                   |    КарточкаСделки.Проведен = ИСТИНА";
    
    Проверка = Запрос.Выполнить();
    Если НЕ Проверка.Пустой() Тогда
        Результат = Истина;
    КонецЕсли;
    
    Возврат Результат;
    
    КонецФункции
    
    и вот что получилось: открыл Заказ, по которому есть проведенная КарточкаСделки, - всё ОК, команды создания РТУ и Счета доступны.
    Но потом открываю Заказ, по которому нет КарточкиСделки, а Результат - все равно возвращается "Истина". И, соответственно, создание РТУ и Счета все равно доступно.
    Может быть, не "НЕ Проверка.Пустой()" надо проверять?
  19. TopicStarter Overlay
    nickvv
    Offline

    nickvv Опытный в 1С

    Регистрация:
    10 май 2011
    Сообщения:
    439
    Симпатии:
    2
    Баллы:
    29
    Вот работающий вариант. Всё - в модуле формы ЗаказаКлиента:
    Код:
    Функция ДокументКарточкаСделкиСуществуетИПроведен()
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    КарточкаСделки.Проведен КАК КарточкаСделкиПроведен,
                   |    КарточкаСделки.ДокументОснование,
                   |    ЗаказКлиента.Ссылка
                   |ИЗ
                   |    Документ.КарточкаСделки КАК КарточкаСделки,
                   |    Документ.ЗаказКлиента КАК ЗаказКлиента
                   |ГДЕ
                   |    КарточкаСделки.Проведен = ИСТИНА
                   |    И КарточкаСделки.ДокументОснование = &Заказ";
    
    Запрос.УстановитьПараметр("Заказ",Объект.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Количество() = 0 Тогда
        Результат = Ложь;
    Иначе
        Результат = Истина;
    КонецЕсли;
    
    Возврат Результат;
    
    КонецФункции
    
    и в процедуре ПриСозданииНаСервере:
    Код:
        Если НЕ ДокументКарточкаСделкиСуществуетИПроведен() Тогда
            Элементы.ПодменюСоздатьНаОсновании.ПодчиненныеЭлементы.ПодменюСоздатьНаОснованииКомандаСоздатьНаОсновании1_СоздатьНаОснованииЗаказа.Доступность = Ложь;
            Элементы.ПодменюСоздатьНаОсновании.ПодчиненныеЭлементы.ПодменюСоздатьНаОснованииКомандаСоздатьНаОсновании2_СоздатьСчетНаОплату.Доступность = Ложь;
        КонецЕсли;
    
  20. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.128
    Симпатии:
    953
    Баллы:
    204
    Да на кой черт выбирать заказы покупателей вообще, тем более полным соединением? ЗаказПокупателя - это документ основание.
    nickvv нравится это.

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