8.х Как сделать проверку на проведенность документа перед печатью?

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

  1. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Мучаюсь уже 2 неделю с этим вопросом. Есть самописная база в 1С 8.3 по складскому учету и движению оборудования созданная мной же (оооочень простая, но мне это и нужно). Есть необходимость создания проверки на проведенность документов перед печатью( важно, что бы распечатать можно было тот документ, который проведен), но на создание формулы не хватает ума/опыта/времени т.к. создается эта база на работе, которая никак не относится к программированию + сам я не программист и до недавнего времени знал 1с не более чем простой пользователь и то не слишком опытный. Собственно по этому пишу сюда и очень надеюсь на помощь.

    Есть простая процедура печати:

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

    Вот пример на мой взгляд (но я могу конечно же ошибаться) чего то более близкого к успеху:

    Код:
     Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
        Если РежимЗаписи = РежимЗаписиДокумента.Проведение  Тогда
        Документы.ВыдачаОборудованияИИнструмента.Печать(Ссылка.ТабДок);
        Отказ = Истина;
        Возврат;
        КонецЕсли;    
    КонецПроцедуры
       
    Но все равно не все так просто, как хотелось бы:

    Код:
     {Документ.ВыдачаОборудованияИИнструмента.МодульМенеджера(63,50)}: Переменная не определена (Ссылка)
        Документы.ВыдачаОборудованияИИнструмента.Печать(<<?>>Ссылка.ТабДок); (Проверка: Сервер)
       
    Объясните не опытному - что не так и что нужно, что бы все было так?

    Заранее благодарен!
  2. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    4.003
    Симпатии:
    465
    Баллы:
    104
  3. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Не могли бы вы немного пояснить описанное? Что и к чему это?
  4. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Скрыл стандартную кнопку печати при создании команды печати, вставил стандартный объект "проведен" в поле формы, сделал другую кнопку в форме документа с ссылкой на стандартную команду печати и попробовал в модуле формы документа создать условие типа:
    Код:
    &НаСервере
    Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
            Если Объект.Проведен = Истина Тогда
            Элементы.Печать.Видимость = Истина
            Иначе Сообщить(" Не проведен")
        КонецЕсли;
    КонецПроцедуры
    
    Ошибок никаких нет при отладке и при нажатии на кнопку печати но документы как продолжали печататься, так и печататются.


    Где я не прав?
  5. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    4.003
    Симпатии:
    465
    Баллы:
    104
    просто нужно делать эту проверку и продолжать выполнение если результат проверки - ИСТИНА
    и прерывать, если - ЛОЖЬ

    PS
    так ещё в 7.7 пользовались, как раза при печати
    в начале процедуры обработки печати стоял примерно такой код
    Код:
        Если ПустоеЗначение(Проведен())=1 Тогда
             Предупреждение("Печать накладной возможна только после проведения документа!");
             Возврат;
        КонецЕсли;    
    
  6. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Это вписать в процедуре печати в модуле менеджера?
  7. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Сделал следующее:
    Код:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        //Установка ответственным за постановку задачи текущего пользователя системы
        Объект.КладовщикОтпустил = ПользователиИнформационнойБазы.ТекущийПользователь();
        Кнопка = ЭтаФорма.Элементы.Печать;   
        Если ЭтаФорма.Объект.Проведен = Ложь Тогда
           
            Кнопка.Видимость = Ложь;
           
        КонецЕсли 
       
    КонецПроцедуры
    
    Все получилось. Но.... Теперь вопрос... Как убрать кнопку печати в самом журнале документов?
    Безымянный3.jpg
  8. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    4.003
    Симпатии:
    465
    Баллы:
    104
    зачем её убирать то?
    вопрос стоял -"создание проверки на проведенность документов перед печатью( важно, что бы распечатать можно было тот документ, который проведен)"

    если проверка есть и она прерывает процедуру печати, то кнопку хоть занажимайся
  9. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Да я просто не пойму, как и куда конкретно вписать проверку, по этому пытаюсь решить задачу таким колхозным методом. Пытался вписать то, что вы советовали в в процедуру печати ТабДок в модуле менеджера, но отладчик стал ругаться на выражение "Проведен". Пока удалось решить эту задачу следующим образом: в форме документа скрыл стандартную кнопку в командном интерфейсе в в группе "Важное", затем создал новую кнопку с ссылкой на команду "печать" и поместил ее в командную панель. Далее вписал в модуле этой же формы следующее:
    Код:
    Кнопка = ЭтаФорма.Элементы.Печать;
        Если ЭтаФорма.Объект.Проведен = Ложь Тогда
           
            Кнопка.Видимость = Ложь;
           
        КонецЕсли  
    Далее создал форму списка в формах этого же документа.При создании указал те элементы, которые необходимы и далее в форме списка документа скрыл стандартную кнопку в командном интерфейсе в в группе "Важное". Потом в общих свойствах документа в поле "основная форма списка" сделал отсылку на созданную мною форму списка. Все работает как надо. Но... Я был бы очень признателен, если бы вы мне объяснили, как все таки сделать проверку в самой процедуре.
  10. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.154
    Симпатии:
    217
    Баллы:
    104
    Давайте с начала.
    Вы создали печатную форму для документа через конструктор печати.
    В модуле менеджера этого документа сформировалась процедура "Печать".
    Кроме этого у документа была создана команда "Печать".
    В свойствах этой команды для упрощения установите режим использования параметра "Одиночный".
    Откройте модуль команды.
    Там должна быть клиентская процедура "ОбработкаКоманды", у которой есть параметр "ПараметрКоманды".
    При одиночном режиме ПараметрКоманды - это и есть ссылка на тот документ, который Вы печатаете.

    Тут и нужно проверить, проведен документ или нет.
    Получение признака "Проведен" выносите в серверную процедуру, т.к. на клиенте он недоступен.
    И если документ не проведен, то выдаете соответствующее предупреждение пользователю и прерываете процедуру.

    upload_2019-5-27_23-29-19.png
    xVadimx нравится это.
  11. TopicStarter Overlay
    xVadimx
    Offline

    xVadimx

    Регистрация:
    25 май 2019
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Как приятно знать, что ты что-то узнал! - - - ЭТО ТОЧНО!!!! Спасибо вам огромное! Все работает! Тема закрыта!