1с отказ создания на основании

Обновлено: 07.07.2024

С надеждой на Ваши советы и поддержку в нелегком освоении стези программирования решилась написать Вам еще раз. Есть документ "Отчет производства за смену", в котором при определенных условиях некоторым пользователям запрещено изменять документ(эту часть своими силами я реализовала-при открытии формы прописав что ТолькоПросмотр = Истина). Вопрос состоит вот в чем: ввод на основании все равно остается доступным.Как запретить данное действие?

(1)Попробуйте так, я всегда так делаю, работает замечательно:
Для Индекс = 0 По ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки.Количество() - 1 Цикл
Если ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки[Индекс].Текст = "Текст кнопки ввода на основании" Тогда
ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки[Индекс].Доступность = Ложь;
КонецЕсли;
КонецЦикла; Для Индекс = 0 По ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки.Количество() - 1 Цикл
Если ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки[Индекс].Текст = "Текст кнопки ввода на основании" Тогда
ЭлементыФормы.ВашаКоманднаяПанель.Кнопки["НазваниеВыпадающегоПодменю"].Кнопки[Индекс].Доступность = Ложь;
КонецЕсли;
КонецЦикла;
А в какой момент это надо писать? при наступлении какого события? В процедуре ОбработкаЗаполнения модуля документа напишите
Если ВашеУсловие Тогда
&Если Клиент Тогда
Предупреждение("Брысь. ");
&КонецЕсли
Возврат;
КонецЕсли;
Документ на основании создастся, но будет незаполненный, так что ничего страшного, имхо.
туплю, действительно не вариант В процедуре ОбработкаЗаполнения модуля документа напишите Это во всех модулях документов, которые вводятся на основании этого?
(1) sweety-twetty, в котором при определенных условиях некоторым пользователям запрещено изменять документ(эту часть своими силами я реализовала-при открытии формы прописав что ТолькоПросмотр = Истина).

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если . Тогда
// заполняете как обычно
Иначе
СтандартнаяОбработка = Ложь;
КонецЕсли;

А если сделать приоткрытии чтото подобное:

ЭлементыФормы.ДействияФормы.Кнопки.Подменю1.Доступность = Ложь;(подменю1 это подменю ввода на основании)

естественно после проверки на мое условие))))

П.С.:Почему-то после прохождения отладчиком этой строки Доступность данного подменю все равно истина =(((

ЭлементыФормы.ДействияФормы.Кнопки.Подменю1.Доступность = Ложь; (6) я уже поняла.но неужели никак не возможно в самой форме документа убрать эту кнопку? (7) sweety-twetty,
да почему не возможно? все возможно.
Только из списка из контекстного меню - как ввод на основании убирать будете?
(1) sweety-twetty,
подписку на ОбработкаЗаполнения, условие и Отказ = Истина в случае выполнения условия. (8) Спасибо большое за внимание к теме, в списке убирать не буду, но если можно подскажите как все-таки сделать его недоступным на форме? подписку на ОбработкаЗаполнения, условие и Отказ = Истина в случае выполнения условия.

В процедуре ОбработкаЗаполнения() Отказ не предусмотрен, соответственно, в подписке на нее - тоже.
Можно установить СтандартнаяОбработка = Ложь, только это не поможет, т.к. документ все равно будет создан.
Конечно же обработка заполнения предназначена не для того, чтобы отказываться от документа.

А если надо отказаться, то здесь скорее помогут ПередОткрытием() и ПередЗаписью().

(1) sweety-twetty,
хотелось бы уточнить, нужно ограничить доступ к документу "Отчет производства за смену"? Т.е. надо чтобы его нельзя было создать на основании?
- Запретить создание на основании другого документа вряд ли получится (если только не влазить в каждый), но можно гарантированно запретить запись документа "Отчет производства за смену" - вырабатывать Отказ в процедуре ПередЗаписью() модуля объекта. Это сработает при любой, в т.ч. программной записи. А чтобы не давать пользователю ненужной надежды - вырабатывать отказ также в процедуре ПередОткрытием() формы документа. Тогда как бы пользователь не пытался в диалоге создать новый документ "Отчет производства за смену", хоть вводом на основании, форма все равно не откроется и новый объект документа будет уничтожен.

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


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


Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.

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

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

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

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

Например, он может иметь тип ссылки, если новый объект вводится на основании.

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

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

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

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

Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:

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

Для тех кто не хочет читать все что выше, код проверки на ЭтоНовый в Управляемом приложении:


Заливкой выделены события, выполняющиеся в транзакции записи.

Последовательность событий при проведении документа из формы документа (провести и закрыть)


Заливкой выделены события, выполняющиеся в транзакции записи.

Последовательность событий при отмене проведения документа из формы документа


Заливкой выделены события, выполняющиеся в транзакции записи.

Обработчики событий

Расширение управляемой формы для документа. Возникает на клиенте перед выполнением записи объекта из формы. Процедура-обработчик данного события вызывается перед вызовом процедуры-обработчика события ПередЗаписью .

  • Отказ , тип Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь .
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения». Параметр РежимПроведения может отсутствовать, если режим проведения в документе не определен.

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере .

Расширение управляемой формы для документа. Вызывается перед записью объекта на сервере. Можно отменить запись. Выполняется вне транзакции.

  • Отказ , тип Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь .
  • ТекущийОбъект , тип ДокументОбъект.ИмяДокумента . Записываемый объект.
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Возникает перед выполнением записи объекта. Процедура-обработчик вызывается после начала транзакции записи, но до начала записи документа.

  • Отказ , тип Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , то запись выполнена не будет и будет вызвано исключение. Значение по умолчанию: Ложь .
  • РежимЗаписи , тип РежимЗаписиДокумента . В параметр передается текущий режим записи документа. Позволяет определить в теле процедуры режим записи. Изменение значения параметра позволяет изменить режим записи.
  • РежимПроведения , тип РежимПроведенияДокумента . В данный параметр передается текущий режим проведения. Изменение значения параметра позволяет изменить режим проведения.

Возникает при записи объекта. Процедура-обработчик вызывается после записи объекта в базу данных, но до окончания транзакции записи.

  • Отказ , тип Булево . Признак отказа от записи документа. Если в теле процедуры-обработчика установить данному параметру значение Истина , то запись документа выполнена не будет. Значение по умолчанию: Ложь .

Расширение управляемой формы для документа. Возникает на сервере при записи объекта из формы. Процедура-обработчик вызывается после записи объекта (после события ПриЗаписи объекта) в базу данных, но до окончания транзакции записи.

  • Отказ , тип Булево . Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина , то запись произведена не будет. Значение по умолчанию: Ложь .
  • ТекущийОбъект , тип ДокументОбъект.ИмяДокумента . Записываемый документ.
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Расширение управляемой формы для документа. Вызывается после записи объекта на сервере и после завершения транзакции.

  • ТекущийОбъект , тип ДокументОбъект.ИмяДокумента . Записываемый объект.
  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Расширение управляемой формы для документа. Возникает на сервере после записи объекта и после окончания транзакции записи, то есть к моменту вызова этой процедуры запись объекта полностью завершена.

  • ПараметрыЗаписи , тип Структура . Структура, содержащая параметры записи. Для формы документа существует два предопределенных параметра — РежимЗаписи и РежимПроведения . Они добавляются автоматически при вызове команд «Провести», «Провести и закрыть», «Отмена проведения».

Примечание: В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере .

Добавление расширения в конфигурацию

Работа с расширением

Мы добавили новое расширение и теперь можно приступать к работе с ним.

Для этого в списке расширение двойным кликом или с помощью контекстного меню откроем конфигурацию нашего расширения



На момент написания статьи, расширения конфигурации 1С не поддерживают стандартный механизм ввода на основании, поэтому нам придется описать его вручную, приступим.


Переходим с свойства общей нашей общей команды. В свойствах нам необходимо указать группу, в которую входит команда по умолчанию и тип параметра команды.



Переходим в модуль команды и описываем обработку нашей глобальной команды:

На этом работа с глобальной командой завершена.


В добавленной процедуре напишем простой код для заполнения нашего документа по основанию

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



На этом разработка реализации ввода на основании в 1С при помощи расширения конфигурации завершено, можем запустить конфигурацию и проверить, что проделали данную работу не зря.

Читайте также: