1С проверить открыт ли документ

Как правило необходимость в определении того, что создается новый элемент, возникает тогда, когда новый элемент нужно предварительно заполнить какими-то данными. Поэтому рассмотрим сначала общую методику заполнения новых объектов данными.

Основной смысл заключается в том, что все действия, которые разработчику требуется сделать при создании нового объекта, должны быть выполнены на сервере.

Причем действия с данными самого объекта и действия с внешним видом его формы должны быть разделены. Действия с данными нужно выполнять в самом объекте, а внешним видом формы нужно управлять уже в форме, но в серверной процедуре.

Кроме этого могут понадобиться и другие действия при открытии формы, например открыть связанную форму, выдать предупреждение и т.д., которые нельзя сделать на сервере – их нужно выполнять в форме, но уже в клиентской процедуре.

Последовательность событий, которые происходят при открытии формы нового элемента, можно представить следующей схемой:

Прежде всего, при заполнении нового объекта данными, можно попробовать обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства ЗначениеЗаполнения и ЗаполнятьИзДанныхЗаполнения . Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.

Если этих возможностей недостаточно, то тогда нужно использовать возможности встроенного языка.

Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения . Этот событие возникает только при создании новых объектов, при открытии форм существующих объектов это событие не вызывается. Поэтому в нем не нужно узнавать, новый это объект, или нет. Нужно только описать алгоритм заполнения объекта данными. При этом следует учитывать, что это событие будет вызываться в нескольких случаях:

  • при интерактивном создании нового объекта
  • при вводе на основании
  • при выполнении метода объекта Заполнить()

При этом параметр ДанныеЗаполнения , передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент. Например, он может иметь тип ссылки, если новый объект вводится на основании. Или он может иметь тип Структура , если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка. Также этот параметр может иметь тип Неопределено , если новый элемент создается интерактивной командой из панели действий. То есть в своем алгоритме начального заполнения полезно анализировать этот параметр.

Подробнее о событии ОбработкаЗаполнения можно прочитать в синтакс-помощнике: ПрикладныеОбъекты — — Объект — События .

Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере . Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ . Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Ключ.Пустая() Тогда

Сообщить("Создается новый объект");

И, наконец, если требуется выполнять какие-то действия в обработчике события формы ПриОткрытии , то в нем ситуация аналогичная, нужно анализировать параметр формы Ключ .

ProfforG
16.11.2011 19:31

Прочитано: 10746
у меня некоторые Элементы на форме имеют закрытый доступ или видимость. при повторном открытии мне нужно проверить форма открыта повторно или нет?! как условие будет выглядеть?!

ПриПовторномОткрытии()
Если ЭтаФорма. <?Была открыта ранее?>= Истино Тогда
//
//выставляю все доступы элементов и видимость как мне надо
//
КонецЕсли;
КонецПроцедуры

Yandex
Возможно, вас также заинтересует
E_Migachev
17.11.2011 10:21

Ответ № 1
(0) ProfforG,
Код 1C v 8.х
ProfforG
17.11.2011 11:39

Ответ № 2
Делал я так, но тут немного другое условие. Вот мы заполнили документ, нажали кнопку "провести и закрыть". а потом к примеру решили просмотреть этот документ или редактировать его открываем его. и вот на это повторное открытие у меня должно условие работать. а тут получается условие на то что она уже открыта и мы на это условие проверяем.
E_Migachev
17.11.2011 12:15

Ответ № 3
з раза прочитал, так и не понял — что за условие тебе нужно!?
Ermak
17.11.2011 14:02

Ответ № 4
(2) ProfforG, Напиши по подробнее, что ты хочешь сделать. Я не давно делал одну вещь и мне кажется что ты тоже самое хочешь сделать.
ProfforG
17.11.2011 19:31

Ответ № 5
условие:

если форма документа(ранее созданного) открывается повторно, то тогда (пишу необходимый обработчик)

а вот почему мне нужна такая проверка при повторном открытии формы документа:

у меня видимость к некоторым полям стоит изначально закрытая. при заполнении одного поля открывается другое, оно заполняется соответственно. провожу документ. закрываю его. потом пытаюсь документ к примеру изменить или добавляю копированием или просто открываю его, открывается форма, и те реквизиты которые заполнены, у них видимость = ложь, а мне надо чтобы видимость = истина была.

в обработчике ПриПОвторном открытии будет так:

Если (форма документа открыта повторно?! )=да тогда
реквизиты.видимость = истина

В 1С есть возможность перебрать все открытые окна и проанализировать их содержимое. Рассмотрим работу с открытыми окнами на примере.

Предположим, что стоит задача при нажатии на кнопку анализировать открыта ли обработка «Моя обработка». Если обработка открыта и в ней не заполнен реквизит «Контрагент», то необходимо активизировать ее форму, в остальных случаях следует создать и открыть новую форму обработки. Данную задачу нельзя решить при помощи параметров метода ОткрытьФорму () .

Ниже представлен код для решения поставленной задачи:

Список открытых окон получается при помощи функции ПолучитьОкна () . Далее происходит обход открытых окон и анализ заголовков. Текст заголовков анализируется не по точному соответствию, а по вхождению необходимых слов, т.к. при изменении реквизитов в форме к заголовку может добавиться признак модифицированности — постфикс » *».

При нахождении нужного заголовка происходит получение управляемой формы и анализ реквизита «Контрагент». Если контрагент пустой, то текущее окно активизируется методом Активизировать () и выполнение процедуры прекращается.

Если нет открытых окон с требуемым заголовком и пустым реквизитом «Контрагент», происходит открытие нового окна при помощи метода ОткрытьФорму () . Четвертым параметром в метод передается уникальный идентификатор; это необходимо для того, чтобы в любом случае было открыто новое окно.

Остались вопросы?
Спросите в комментариях к статье.

2 комментария

Здравствуйте, при написании этого кода:
Процедура СохранитьДанныеКлиенскогоПриложения()
Окна = ПолучитьОкна();
Для каждого Окно Из Окна Цикл
Формы = Окно.Содержимое;
Для каждого Форма из Формы Цикл
Если Форма.Модифицировать Тогда
Файл = Новый ЗаписьXML
ФАйл.ОткрытьФайл0(«D:/Working»+Форма,ИмяФормы».xml»);
СериализаторXDTO.ЗаписатьXML(Файл,Форма.Объект);
Файл.Закрыть();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

После уго запуска высвечивает ошибку:
Поле объекта не обнаружено (Содержимое)

Добрый день!
Возможно, Вы пробуете выполнить код в режиме обычного приложения. В этом случае метод ПолучитьОкна() возвращает значение Неопределено. Данный метод работает только в режиме управляемого приложения. К тому же, «Окно» — это зарезервированная переменная в режиме управляемого приложения, необходимо использовать другую переменную.


[an error occurred while processing the directive]
Карта сайта