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 такая ошибка не воспроизводится. Разработчики добавили реквизит формы типа "Булево" (у меня это АдресЗаполнено, у них это АналитикаУчетаЗаполнена) и его в ОбработкеВыбора исходной формы заполняют. НО если (с учетом этого добавления) запустить мою обработку на старом релизе - строчка пропадет, если на новом - останется. Платформу при этом не меняем. В связи с этим, всё равно хочется докопаться до сути. КАК при одной платформе, но разных релизах один и тот же код отрабатывает по-разному, учитывая, что никакие общие модули не используем?

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