1С запретить ввод на основании

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде "Создать на основании", то такую проверку следует выполнять в обработчике ОбработкаЗаполнения модуля объекта (набора записей). Например, это могут быть проверки вида:

  • Для команды "Создать на основании" не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов. Требуется запретить ввод на основании групп.
  • Требуется запретить ввод на основании непроведенных документов.

2. Для оповещения пользователя о причинах отказа, в обработчике ОбработкаЗаполнения следует использовать исключения:

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

Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
Если ПолучитьЗначениеРеквизита(ДанныеЗаполнения, "ЭтоГруппа") = Истина Тогда
ВызватьИсключение "Ввод приказа о приеме на основании группы сотрудников невозможен!
|Выберите сотрудника. Для раскрытия группы используйте клавиши Ctrl и стрелку вниз";
КонецЕсли;

// обработка заполнения объекта по данным заполнения

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

Методическая рекомендация (полезный совет)

3. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):

3.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения .

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

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

Читайте также:  Термическая и пьезоэлектрическая струйная печать сравнение

Если Не ЗначениеЗаполнено(Подразделение) Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;

Также при заполнении реквизитов значениями по умолчанию следует, по возможности, использовать свойство метаданных "Значение заполнения" . Значение, указанное в этом свойстве будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения , в случае если параметр СтандартнаяОбработка установлен в Истина , и реквизит не был заполнен в обработчике.

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

четверг, 26 февраля 2015 г.

Запрет ввода на основании

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

Я предлагаю другой способ отмены создания документа. А именно уставливать значение "ПометкаУдаления" в значение Истина, а в форме "ПриСозданииНаСервере" добавить такие строчки кода:

Если Объект.Ссылка.Пустая () И Объект.ПометкаУдаления Тогда
отказ = истина;
Возврат;
КонецЕсли;

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

Конструктор ввода на основании можно вызвать, например, из окна редактирования справочника:

Читайте также:  Установка openmediavault на raspberry pi

Конструктор позволяет вручную или автоматически заполнить выражения, которые будут записаны в поля результирующего объекта прикладного решения:

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

Для каждого типа объекта-основания формируется своя ветка условия Если , в которой происходит заполнение реквизитов нового документа.

Как выполнить ввод на основании программно?

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

При этом отработает процедура ОбработкаЗаполнения() в модуле объекта и те алгоритмы заполнения, которые в ней описаны.

Еще один способ — создать новый объект программно, вызвать у него метод Заполнить() и передать в этот метод значение, на основании которого должен быть создан новый объект. В этом случае тоже будет выполнен обработчик события ОбработкаЗаполнения() . В заключении останется только получить форму объекта, установить свойство расширения формы ПараметрОснование и открыть ее:

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

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

Оцените статью
Добавить комментарий

Adblock detector