Как формируются данныезаполнения 1с
Требования соответствуют стандартам 1С (ссылка), если иное не указано в индивидуальных стандартах.
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде "Создать на основании", то такую проверку следует выполнять в обработчике модуля объекта ОбработкаЗаполнения. Например, это могут быть проверки вида:
- Для команды "Создать на основании" не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов. Требуется запретить ввод на основании групп.
- Требуется запретить ввод на основании непроведенных документов.
Для оповещения пользователя о причинах отказа, в обработчике ОбработкаЗаполнения следует использовать исключения:
При этом не рекомендуются какие-либо иные решения для подобных проверок. В частности, не следует создавать дополнительные команды для ввода на основании и размещать проверки в обработчиках этих команд.
Методическая рекомендация (полезный совет)
2. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):
2.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения .
2.2. Выполнение общего заполнения, с целью заполнить значениями по умолчанию реквизиты, которые не были заполнены специальным заполнением. При этом необходимо предварительно проверять реквизит на заполненность.
Также при заполнении реквизитов значениями по умолчанию следует, по возможности, использовать свойство метаданных "Значение заполнения". Значение, указанное в этом свойстве будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения , в случае если параметр СтандартнаяОбработка установлен в Истина, и реквизит не был заполнен в обработчике.
Выполнение данной рекомендации позволит уменьшить количество логических ошибок заполнения, и повысит читаемость кода.
Как при открытии формы определить, что создается новый элемент?
Как правило необходимость в определении того, что создается новый элемент, возникает тогда, когда новый элемент нужно предварительно заполнить какими-то данными. Поэтому рассмотрим сначала общую методику заполнения новых объектов данными.
Основной смысл заключается в том, что все действия, которые разработчику требуется сделать при создании нового объекта, должны быть выполнены на сервере.
Причем действия с данными самого объекта и действия с внешним видом его формы должны быть разделены. Действия с данными нужно выполнять в самом объекте, а внешним видом формы нужно управлять уже в форме, но в серверной процедуре.
Кроме этого могут понадобиться и другие действия при открытии формы, например открыть связанную форму, выдать предупреждение и т.д., которые нельзя сделать на сервере – их нужно выполнять в форме, но уже в клиентской процедуре.
Последовательность событий, которые происходят при открытии формы нового элемента, можно представить следующей схемой:
Прежде всего, при заполнении нового объекта данными, можно попробовать обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства ЗначениеЗаполнения и ЗаполнятьИзДанныхЗаполнения . Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.
Если этих возможностей недостаточно, то тогда нужно использовать возможности встроенного языка.
Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения . Этот событие возникает только при создании новых объектов, при открытии форм существующих объектов это событие не вызывается. Поэтому в нем не нужно узнавать, новый это объект, или нет. Нужно только описать алгоритм заполнения объекта данными. При этом следует учитывать, что это событие будет вызываться в нескольких случаях:
- при интерактивном создании нового объекта
- при вводе на основании
- при выполнении метода объекта Заполнить()
При этом параметр ДанныеЗаполнения , передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент. Например, он может иметь тип ссылки, если новый объект вводится на основании. Или он может иметь тип Структура , если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка. Также этот параметр может иметь тип Неопределено , если новый элемент создается интерактивной командой из панели действий. То есть в своем алгоритме начального заполнения полезно анализировать этот параметр.
Подробнее о событии ОбработкаЗаполнения можно прочитать в синтакс-помощнике: ПрикладныеОбъекты - <Вид объектов конфигурации (Справочники, Документы и т.п.)> - <Вид объектов конфигурации>Объект - События .
Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере . Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ . Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
Сообщить("Создается новый объект");
И, наконец, если требуется выполнять какие-то действия в обработчике события формы ПриОткрытии , то в нем ситуация аналогичная, нужно анализировать параметр формы Ключ .
Иерархическому справочнику Номенклатура добавили реквизит Услуга (Булево).
Этому реквизиту задали использование для группы и элемента.
И представление - Заполнять из данных заполнения.
Нужно смотреть - есть ли у группы признак Услуга.
Если есть - при создании нового элемента признак Услуга должен устанавливаться.
Нет - не устанавливать, соответственно.
В модуле объекта справочника Номенклатура:
, то это не очень хорошо - если стоит отбор по реквизиту Услуга, то система и так отработает, без нашего кода.
Давайте сделаем СтандартнуюОбработку. Это правильнее.
Я поэкспериментировал с параметром - СтандартнуюОбработка = Ложь;
- это не стандартная обработка.
- Это стандартная обработка.
Только вот не могу понять, почему это стандартная обработка? Т.е. где признак стандартной обработки?
8.3 Упр.прил - Конвертация из 7.7
Конфигурация на 7.7 имеет свою структуру на 8.3 пишется сейчас и имеет свою. Вопрос как можно.
8.3 Упр.прил.: ДеревоЗначений и .НайтиСтроки
Ситуация такая, нужно вывести на экран дерево с отбором строк. Делаю это путем полного.
8.3 Упр.прил.: Дерево из Запроса ?
Есть справочник с группами и элементами - нужно получить дерево с видом: Группа Элемент.
8.3 Упр.прил. - Оптимизация работы с переменными ?
Все на клиенте: Одна процедура заполняет массив неизвестного размера, другая должна его.
СтандартнаяОбработка - это системный флаг для ленивых программистов. Перехватив событие, ты можешь не маяться с доведением его до конца, если оставить флаг поднятым (тру), типа "Ой! Я не брал!" и система доведёт дело сама. Но если ты серьёзно взялся, тогда сбрасываешь флаг, и всё на тебе: выборы, заполнения и пр. хрень. Этот флаг параметром передаётся во все события, где это нужно.
Вы мне немного встряхнули мозги.
Или просто с утра виднее стало. В общем, я только что допер, что если флаг СтандартнаяОбработка сбросить, то ДанныеЗаполнения будут "неопределено".
Ваш вопрос, не совсем понял вопрос, извините, пожалуйста.
Постараюсь ответить - как смогу.
На картинке мой справочник. Если галка "Услуга" для группы стоит, то всем элементам этой группы надо по умолчанию поставить галочку "Услуга". Т.е. без всякого отбора - только в зависимости от галочки у группы.
Событие - в модуле объекта ОбработкаЗаполнения.
Теперь не могу понять, почему правильнее написать
"ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга)", а не
"Услуга = ДанныеЗаполнения.Родитель.Услуга".
В видеокурсе объясняют: "Услуга = ДанныеЗаполнения.Родитель.Услуга" не очень хорошо по одной причине. Признак Услуга у нас - это реквизит справочника. В реквизите справочника у нас поставлено "Заполнять из данных заполнения". А это значит, что если в данных заполнения при отрабатывании этой процедуры будет найден ключ Услуга, то принудительное заполнение реквизитов устанавливать не нужно. Лучше написать "ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга)".
Т.е. не устанавливать значение напрямую, а передать стандартному механизму 1С: Предприятие инструкцию заполнить эти значения при отрабатывании процедуры ОбработкаЗаполнения.
Вот по мне - один хрен. Оба способа одинаковы. Просто первый обращается непосредственно к свойствам, а второй применяет метод объекта Структура к ДаннымЗаполнения. Оба механизма не будут работать, если я поставлю СтандартнаяОбработка = Ложь.
Я не прав, что один хрен?
Это управляемое. Тонкости, с которыми я плохо знаком. ДанныеЗаполнения - это, похоже, системный объект - соответствие или структура. Он действует в рамках стандартной процедуры. Допустим, он содержит полный комплект атрибутов элемента справочника (где он их берёт - из умолчаний, из копии - надо читать или проверять), Услуга там по умолчанию Ложь, а флаг СтОб поднят. Ты ставишь Услуга=Истина, а стандарт его сбрасывает. Если сбросить СтОб, тогда Услуга останется, но и всё остальное тоже.
Добавлено через 3 минуты
А если ты корректируешь ДанныеЗаполнения, но оставляешь флаг СтОб поднятым - всем хорошо
Читайте также: