1с стандартная обработка ложь это
Обновлено: 07.07.2024
Иерархическому справочнику Номенклатура добавили реквизит Услуга (Булево).
Этому реквизиту задали использование для группы и элемента.
И представление - Заполнять из данных заполнения.
Нужно смотреть - есть ли у группы признак Услуга.
Если есть - при создании нового элемента признак Услуга должен устанавливаться.
Нет - не устанавливать, соответственно.
В модуле объекта справочника Номенклатура:
, то это не очень хорошо - если стоит отбор по реквизиту Услуга, то система и так отработает, без нашего кода.
Давайте сделаем СтандартнуюОбработку. Это правильнее.
Я поэкспериментировал с параметром - СтандартнуюОбработка = Ложь;
- это не стандартная обработка.
- Это стандартная обработка.
Только вот не могу понять, почему это стандартная обработка? Т.е. где признак стандартной обработки?
8.3 Упр.прил - Конвертация из 7.7
Конфигурация на 7.7 имеет свою структуру на 8.3 пишется сейчас и имеет свою. Вопрос как можно.
8.3 Упр.прил.: ДеревоЗначений и .НайтиСтроки
Ситуация такая, нужно вывести на экран дерево с отбором строк. Делаю это путем полного.
8.3 Упр.прил.: Дерево из Запроса ?
Есть справочник с группами и элементами - нужно получить дерево с видом: Группа Элемент.
8.3 Упр.прил. - Оптимизация работы с переменными ?
Все на клиенте: Одна процедура заполняет массив неизвестного размера, другая должна его.
СтандартнаяОбработка - это системный флаг для ленивых программистов. Перехватив событие, ты можешь не маяться с доведением его до конца, если оставить флаг поднятым (тру), типа "Ой! Я не брал!" и система доведёт дело сама. Но если ты серьёзно взялся, тогда сбрасываешь флаг, и всё на тебе: выборы, заполнения и пр. хрень. Этот флаг параметром передаётся во все события, где это нужно.
Вы мне немного встряхнули мозги.
Или просто с утра виднее стало. В общем, я только что допер, что если флаг СтандартнаяОбработка сбросить, то ДанныеЗаполнения будут "неопределено".
Ваш вопрос, не совсем понял вопрос, извините, пожалуйста.
Постараюсь ответить - как смогу.
На картинке мой справочник. Если галка "Услуга" для группы стоит, то всем элементам этой группы надо по умолчанию поставить галочку "Услуга". Т.е. без всякого отбора - только в зависимости от галочки у группы.
Событие - в модуле объекта ОбработкаЗаполнения.
Теперь не могу понять, почему правильнее написать
"ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга)", а не
"Услуга = ДанныеЗаполнения.Родитель.Услуга".
В видеокурсе объясняют: "Услуга = ДанныеЗаполнения.Родитель.Услуга" не очень хорошо по одной причине. Признак Услуга у нас - это реквизит справочника. В реквизите справочника у нас поставлено "Заполнять из данных заполнения". А это значит, что если в данных заполнения при отрабатывании этой процедуры будет найден ключ Услуга, то принудительное заполнение реквизитов устанавливать не нужно. Лучше написать "ДанныеЗаполнения.Вставить("Услуга", ДанныеЗаполнения.Родитель.Услуга)".
Т.е. не устанавливать значение напрямую, а передать стандартному механизму 1С: Предприятие инструкцию заполнить эти значения при отрабатывании процедуры ОбработкаЗаполнения.
Вот по мне - один хрен. Оба способа одинаковы. Просто первый обращается непосредственно к свойствам, а второй применяет метод объекта Структура к ДаннымЗаполнения. Оба механизма не будут работать, если я поставлю СтандартнаяОбработка = Ложь.
Я не прав, что один хрен?
Это управляемое. Тонкости, с которыми я плохо знаком. ДанныеЗаполнения - это, похоже, системный объект - соответствие или структура. Он действует в рамках стандартной процедуры. Допустим, он содержит полный комплект атрибутов элемента справочника (где он их берёт - из умолчаний, из копии - надо читать или проверять), Услуга там по умолчанию Ложь, а флаг СтОб поднят. Ты ставишь Услуга=Истина, а стандарт его сбрасывает. Если сбросить СтОб, тогда Услуга останется, но и всё остальное тоже.
Добавлено через 3 минуты
А если ты корректируешь ДанныеЗаполнения, но оставляешь флаг СтОб поднятым - всем хорошо
Обработчик события ОбработкаЗаполнения
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде "Создать на основании", то такую проверку следует выполнять в обработчике ОбработкаЗаполнения модуля объекта (набора записей). Например, это могут быть проверки вида:
- Для команды "Создать на основании" не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов. Требуется запретить ввод на основании групп.
- Требуется запретить ввод на основании непроведенных документов.
2. Для оповещения пользователя о причинах отказа, в обработчике ОбработкаЗаполнения следует использовать исключения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
Если ПолучитьЗначениеРеквизита(ДанныеЗаполнения, "ЭтоГруппа") = Истина Тогда
ВызватьИсключение "Ввод приказа о приеме на основании группы сотрудников невозможен!
|Выберите сотрудника. Для раскрытия группы используйте клавиши Ctrl и стрелку вниз";
КонецЕсли;
// обработка заполнения объекта по данным заполнения
При этом не рекомендуются какие-либо иные решения для подобных проверок. В частности, не следует создавать дополнительные команды для ввода на основании и размещать проверки в обработчиках этих команд.
Методическая рекомендация (полезный совет)
3. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):
3.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения .
Например:
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
// .3.2. Выполнение общего заполнения, с целью заполнить значениями по умолчанию реквизиты, которые не были заполнены специальным заполнением. При этом необходимо предварительно проверять реквизит на заполненность.
Например:
Если Не ЗначениеЗаполнено(Подразделение) Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;Также при заполнении реквизитов значениями по умолчанию следует, по возможности, использовать свойство метаданных "Значение заполнения" . Значение, указанное в этом свойстве будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения , в случае если параметр СтандартнаяОбработка установлен в Истина , и реквизит не был заполнен в обработчике.
Выполнение данной рекомендации позволит уменьшить количество логических ошибок заполнения и повысит читаемость кода.
Имею следующий обработчик: [1c] &НаКлиенте Процедура ТорговаяТочкаНачалоВыбора(Элемент, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ФормаВыбора = ПолучитьФорму("Справочник.Проекты.Форма.ФормаВыбораУпр",,Элемент); Список = Новый СписокЗначений; Список.ЗагрузитьЗначения(ПолучитьДоговора(Объект.Контрагент)); ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДоговорКонтрагента"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; ЭлементОтбора.ПравоеЗначение = Список; ЭлементОтбора.Использование = Истина; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПокупательКонтрагента"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Истина; ЭлементОтбора.Использование = Истина; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; ФормаВыбора.Открыть; КонецПроцедуры [/1с] СтандартнаяОбработка скописастина из параметров функции и вставлена в СтандартнаяОбработка = Ложь При отработке процедуры открывается две формы с отборами (моя, нужная) и просто форма выбора. 8.2.16.363 Это глюк платформы или что-то я не сделал?
в отладчике посмотреть? может очепятка в СтандартнаяОбработка? И оно не скидывается в Ложь?
А не три ли параметра у ТорговаяТочкаНачалоВыбора и не третьим ли параметром должна идти СтандартнаяОбработка?
СП говорит что два. Вернее 1, и один от расширения формы для управляемых форм. Так что все норм.
Вспомнил, это я сзначально сделал Обработчик выбора из списка, а потом "ИзСписка" удалил. А в Уф, у них разное количество параметров
точнее, для расширений не указываеют первый параметр (Элемент)
да собственно прав. он просто составлен по. даже и не знаю таких слов. Всегда надо помнить про " Расширение элементов управления, расположенных в форме (Extension for controls located in a form) <Имя события> (<Event name>) Синтаксис: <Имя события>(<Элемент>, <. >) " Даже если ты описание события смотришь для управляемых форм.
I. Решение задачи для для конфигураций на платформе 8.2, обычных форм, Бухгалтерии 2.0
пример кода для выбора адреса из Контактной информации:
II. Решение задачи через СписокЗначений для конфигураций на платформе 8.3, управляемых форм, Бухгалтерии 3.0
пример кода:
Получившийся выпадающий список адресов:
(мне показалось неудобным искать адрес, если данных в регистре много, поэтому предлагаю другой вариант ниже)
III. Решение задачи через ФормуВыбора для конфигураций на платформе 8.3, управляемых форм, Бухгалтерии 3.0
III.1.Что нужно сделать в форме-приемнике (форме Владельца)
У нас есть некая табличная часть. В один из её реквизитов мы хотим добавить адрес контрагента, используя форму выбора адреса. В моем примере это "ТабличнаяЧасть1" с реквизитом "Адрес" типа Строка. Соотвественно в моей обработке есть и сам реквизит "Контрагент" типа СправочникСсылка.Контрагенты. Важно не забыть добавить кнопку выбора.
Дальше объявляем у Адреса событие НачалоВыбора. В диалоговом окне выбираем только "на клиенте"
В этом событии должен отработать следующий код:
III.2.Что нужно сделать в форме-источнике
Дошли до формы выбора адреса. У меня получилась такая простенькая форма:
Нам понадобятся два реквизита СпрОбъект (тип СправочникОбъект.Контрагенты) и соответственно СсылкаКонтрагент. Вытаскиваем (перетягиваем) на форму Табличную часть "Контактная информация" у СпрОбъект и ничего заполнять не надо, просто в дальнейшем получим объект у СсылкаКонтрагент и информация будет отражаться на форме.
Что необходимо сделать в модуле формы выбора:
Во-вторых, получим объект у Контрагента, чтобы заполнилась табличная часть Контактной информации на форме
В-третьих, у табличной части объявляем событие "Выбор" только "на клиенте" и добавляем ОповеститьОВыборе
III.3.Что еще нужно сделать в форме-приемнике
Объявить процедуру ОбработкаВыбора только "на клиенте" и вставить подобный код:
III.4.Как записать изменения Контактной информации из формы выбора
Как видно из рисунка выше, у меня объявлена Команда формы - ЗаписатьИзменения. На ней "висит" следующая процедура:
IV. Вопрос к Знатокам- "Баг или криворук?"
Все замечательно работает. Но есть одно непонятное мне действо. Если в добавленной строке Табличной части источника ничего не заполнено, а мы пользуемся ОповеститьОВыборе(), то только что добавленная строчка исчезает. Причем это проявляется даже в типовой Бухгалтерии. Например, берем документ Реализация(услуги), добавляем строчку в Табличную часть, не выбирая Номенклатуру пытаемся сначала установить Счета учета. Открывается форма выбора, выставляем счета, нажимаем на ОК. В документе появляется строчка. Но стоит щелкнуть мышкой в другом месте, строчка пропадет.
Вопрос очень простой: Что же делать, как же быть в такой ситуации?
Покопавшись самостоятельно, удалось найти, что в самых свежих релизах Бухгалтерии 3.0 такая ошибка не воспроизводится. Разработчики добавили реквизит формы типа "Булево" (у меня это АдресЗаполнено, у них это АналитикаУчетаЗаполнена) и его в ОбработкеВыбора исходной формы заполняют. НО если (с учетом этого добавления) запустить мою обработку на старом релизе - строчка пропадет, если на новом - останется. Платформу при этом не меняем. В связи с этим, всё равно хочется докопаться до сути. КАК при одной платформе, но разных релизах один и тот же код отрабатывает по-разному, учитывая, что никакие общие модули не используем?
Читайте также: