- событие ПриИзменении()
- «При изменении» процедура, вопрос по азам программирования.
- Использование аннотации &ИзменениеИКонтроль на примерах
- &ИзменениеИКонтроль в расширениях 1С
- Методика обновления формы объекта данных при изменении объекта
- Примеры использования команды «Перечитать»
- В каких событиях обновлять форму?
- Управляемая форма
- Обычная форма
событие ПриИзменении()
Помощь в написании контрольных, курсовых и дипломных работ здесь.
1С 8.2 ПриИзменении()
Есть отчет, на форме реквизит, тип — строка, привязана процедура на событие ПриИзменении. Ввожу.
Обработчик ПриИзменении 1с 7.7
Как вставить обработчик ПриИзменении реквизита на форме в семерке? в 8 все просто. а тут не найти .
1C заполнение данных (ПриИзменении())
Здравствуйте, на этапе программирования курсового проекта по 1С у меня возникла проблема такого.
Доброго времени суток. Суть проблемы: никак не получается написать обработчик. Имеется документ.
2. Ты забыл передать параметр в Запрос.
3. Какого типа значение в поле «НаименованиеТовара»? Скорее всего СправочникСсылка.Номенклатура или Строка?
Добавлено через 6 минут
4. Вызываешь функцию ПолучитьЦену() как процедуру. Разумнее тогда так:
Однако почему-то все поля СтрокаСправочника оказались незаполненными.
При выполнении этого кода все поля в СтрокаСправочника оказываются пустыми. Хотя такое наименование 100% присутствует в справочнике ХлебобулочныеИзделия.
Можете подсказать почему и как исправить? Спасибо.
Чтобы ответить тебе, мне нужно знать:
1. Какого типа значение в поле «НаименованиеТовара»?
Пользователь выбирает его из справочника Номенклатура? Или вводит с клавиатуры?
2. «Колбасы» и «ХлебобулочныеИзделия» — это группы в справочнике Номенклатура или отдельные справочники?
Тогда твоя функция ПолучитьЦенуБезЗапросов() неверна.
Вообще, я бы решил задачу примерно так:
При этом проверяются оба справочника — «Колбасы» и «ХлебобулочныеИзделия».
Через НайтиПоНаименованию() эта задача если и решается, то крайне неоптимально.
Откуда ясно, что связь по ссылке.
2. Также оттуда ясно, какой тип имеет Колбасы.НаименованиеТовара
Поэтому, Колбасы.НаименованиеТовара = &ТекущийТовар — верно. Если вы другого мнения, то объясните, пожалуйста, подробнее.
О вашем Колбасы.Номенклатура в постановке задачи ничего не сказано вообще.
3. Согласен, система, судя по всему, спроектирована неоптимально.
По части имен реквизитов вообще беда. Но наша задача не систему проектировать, ведь так?
А почему по части имён реквизитов беда? Можете подсказать как более правильно тогда сделать?
И ещё вопрос. По поводу НайтиПоНаименованию. Насколько я понял после изучения литературы по 1С, имеется 2 способа доступа к данным: объектный (через Справочники.ИмяСправочника. (и дальше к конкретным данным можно получить доступ через НайтиПоНаименованию) и табличный (через запросы). Через запросы доступ к данным более быстрый. Поэтому вы не рекомендуете пользоваться НайтиПоНаименованию?
Тем не менее, остаётся очень интересным вопрос, почему всё-таки НайтиПоНаименованию ничего по сути не находит.
Специально сделал проверку через Если на предмет выполнения НайтиПоНаименованию. Привёл скрин из отладчика. Видно что переменная Спра не определа и не равна 2, т.е. блок внутри ЕСЛИ не выполнен.
P.S. Сейчас уже делаю правильную реализацию согласно вашим советам, но всё-таки хотелось понять почему сейчас НайтиПоНаименованию ничего не находит, чтобы впредь такой ошибки не повторять. Спасибо заранее!
1. Беда с именами реквизитов. Например, у тебя Колбасы.НаименованиеТовара имеет тип Ссылка. Если в имени реквизита есть слово «Наименование», то это как-бы намекает нам, что должен использоваться тип Сторка.
У любого справочника всегда есть стандартный реквизит «Наименование», тип Строка. Функция НайтиПоНаименованию() производит поиск именно по этому реквизиту.
Реквизит типа СправочникСсылка более правильно было бы назвать так: Колбасы.Номенклатура
С другой стороны. Для чего тебе отдельные справочники «Колбасы» и «ХлебобулочныеИзделия»? Если только для того, чтобы хранить Поставщика и Цену, то разумнее внести данные реквизиты в справочник Номенклатура.
Если в спр Номенклатура у тебя много групп, и есть опасение, что запутаешься где хлеб, а где колбаса, то могу посоветовать сделать ещё одни реквизит — вид номенклатуры. Его тип — либо справочник ВидыНоменклатуры, либо одноименное Перечисление. И в «виде номенклатуры» для каждого элемента Номенклатуры указывать, что это — «Колбасы» или «ХлебобулочныеИзделия» или что-то другое.
Цену номенклатуры лучше всего хранить в регистре сведений. При этом в карточку номенклатуры можно вынести самую актуальную цену на товар. Как сделан этот механизм можно посмотреть, например, в типовой конфигурации «Управление небольшой фирмой 8».
2. Через запросы быстрее, да.
3. НайтиПоНаименованию().
Посмотри, что в переменной Номенклатура. Если находит какую-нить ссылку, то хорошо.
Условие
Насколько я понимаю, Справочники.ХлебобулочныеИзделия.НайтиПоНаименованию(Наимено вание) возвращает ссылку на справочник, а не число. Поэтому сравнивать с числом неразумно. Поэтому в цикл и не заходит.
Вообще, если хочешь сделать через объектную модель, тогда придется, получив ссылку на нужный элемент Номенклатуры, выбрать из справочников Колбасы и ХлебобулочныеИзделия элементы, у которых в поле НаименованиеТовара стоит ссылка на этот элемент Номенклатуры. А потом выбрать цену. Это геморр.
Лучше всегда использовать Запросы.
4. Есть хороший базовый курс от 1С. Называется «Введение в конфигурирование. Основные объекты». Рекомендую. Там в целях обучения создается база, похожая на то, что видимо тебе нужно написать. По крайней мере за основу её можно взять. Ну и в основных принципах разобраться. Ещё есть продолжение этого курса — «Запросы». Тоже рекомендую.
Ну и ещё, полезно смотреть как всё это реализовано в типовых конфигурациях от 1С.
Источник
«При изменении» процедура, вопрос по азам программирования.
Всем здравствуйте ребята, вообщем вопрос такого характера: разработал форму и макет документа, теперь пытаюсь программно сделать автозаполнение полей как в табличной части, так и на самой форме (скрин 1 «Форма документа»), итак нужно чтобы при изменении физического лица заполнялись поля на основании справочника ФизическиеЛица, Табличная часть на основании Регистра Сведений «ЦеныНоменклатуры» (как я думаю), а поля Товаровед, на основании пользователя, который сейчас работает в системе, т.е. если зашел Администратор ( то Администратор), Из того, что получилось, это в табличной части заполнить из справочника пробу и шифр:
&НаКлиенте
Процедура ЦенностиНаименованиеИОписаниеЦенностейПриИзменении(Элемент)
СтрокаТЧ = Элементы.Ценности.ТекущиеДанные;
Проба=ПодставитьПробу(СтрокаТЧ.НаименованиеИОписаниеЦенностей);
СтрокаТЧ.ШифрИлиПроба = Проба;
КонецПроцедуры
&НаСервере
Функция ПодставитьПробу(НаименованиеИОписаниеЦенностей)
Спр = Справочники.Номенклатура.НайтиПоНаименованию(НаименованиеИОписаниеЦенностей);
Возврат Спр.ювПроба;
КонецФункции
После того, как получилось заполнить поле из справочника, я начал пробовать заполнить все поля на основании Регистра Сведений в Табличном поле, и для примера пытался заполнить цену номенклатуры из Регистра Сведений:
Функция ПолучитьЦену(НаименованиеИОписаниеЦенностей)
// <<КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны.
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних»;
Выборка= Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий()Цикл
НаименованиеИОписаниеЦенностей = Выборка.Цена;
КонецЦикла;
Возврат НаименованиеИОписаниеЦенностей;
Поле цена начала заполнятся, но некорректными данными.
А на самом документе формы, пробовал сделать при изменении ФизЛица, заполнить дата рождения из справочника, но что-то тоже не выходит. Понимаю, что многие сейчас могут написать «учи матчасть итд» но я пытаюсь разбираться и не пишу сразу, чтобы вы за меня решили этот вопрос. Но может кто, что дельного подскажет по поводу автоматического заполнения полей.
Поля формы: При изменение ФизЛица
Поля таблицы: При изменении Номенклатуры в таблицы
Поле товаровед: При открытии формы, как то так должно работать, на мой взгляд, всем спасибо за советы!
Источник
Использование аннотации &ИзменениеИКонтроль на примерах
Давайте разберем пример использования аннотации &ИзменениеИКонтроль (изменение и контроль). Для начала работы Вам потребуется создать расширение конфигурации. Для этого откройте список расширений и добавьте в него новое расширение. При этом обратите внимание на правильный выбор варианта назначения расширения конфигурации .
Возможность использования аннотации ИзменениеИКонтроль появилась начиная с версии платформы 8.3.15. В отличии от аннотаций &Перед, &После, &Вместо с помощью аннотации &ИзменениеИКонтроль Вы сможете делать точечные вставки в код типовой конфигурации. Основная проблема при изменении кода в больших процедурах и функциях с помощью расширений конфигурации — это постоянный контроль за постоянством этого кода. А в случае, если часть кода изменилась — необходимо сразу обновлять расширение. Использование аннотации &ИзменениеИКонтроль частично упрощает обновление расширений — теперь платформа будет контролировать неизменность кода в вынесенной в расширение процедуры.
Давайте разберем основные вставки, которые Вы можете выполнять в процедурах и функциях с аннотацией &ИзменениеИКонтроль:
- Для удаления кода типовой конфигурации Вы используете вставки #Удаление и #КонецУдаления . Таким образом, весь код, который будет обрамлен этими вставками будет игнорироваться при компиляции модуля.
- Для добавления своего кода Вы используете вставки #Вставка и #КонецВставки .
Теперь давайте рассмотрим, как добавить процедуру в расширение. Для этого на нужной процедуре кликните правой клавишей мыши и вызовите контекстное меню:
Источник
&ИзменениеИКонтроль в расширениях 1С
Начиная с версии платформы 8.3.15 в расширениях можно использовать аннотацию &ИзменениеИКонтроль. При этом важна именно версия платформы, а не режим совместимости. То есть, если у Вас платформа 8.3.15, а режим совместимости установлен 8.3.12, то аннотация &ИзменениеИКонтроль будет работать.
На платформе младше 8.3.15 будет ошибка: «Ожидается оператор препроцессора # >Вставка»:
Для примера использования создадим простую обработку с одной командой на форме и со следующим программным кодом в модуле:
Создадим новое расширение, назовем его «ИзменениеИКонтроль» и добавим в него процедуру ИзменениеИКонтроль() из модуля формы обработки. Аннотацию выберем «Вызывать вместо (с контролем)»:
Теперь сделаем так, чтобы в сообщениях было только сообщение о самой сумме, без слов «Сумма равна». Для этого внесем следующие изменения в процедуру:
Здесь мы использовали инструкции препроцессора #Удаление — #КонецУдаления. Код находящийся между ними будет удален из результирующего модуля. В результате, при нажатии на кнопку будет выведено только сообщение с числом 3. Если у Вас сообщение «Сумма равна» все равно выводится, проверьте снята ли галка «Безопасный режим» в списке расширений:
Теперь добавим, чтобы выводилось сообщение «Сумма из расширения равна»:
Здесь мы использовали инструкции препроцессора #Вставка — #КонецВставки. Код расположенный между ними будет добавлен в результирующий модуль.
Если сейчас в исходном модуле (не в расширении) изменить значение переменной «а» на 11:
И нажать на кнопку на форме обработки, то снова будет выведено «Сумма равна» и число 13 (сумма изменилась, так как мы изменили значение одного из слагаемых).
Расширение не применилось, так как отличается текст процедуры в исходной конфигурации и в расширении.
Если в конфигураторе в списке расширений выделить расширение и выполнить команду Конфигурация — Проверка возможности применения, то выйдет ошибка о невозможности применения расширения:
Это позволит избежать ошибок, когда после обновления конфигурации был изменен модуль, для которого в расширении была использована аннотация &Вместо.
Автоматическое обновление модуля в расширении можно выполнить только если настроено сравнение/объединение с помощью внешних программ.
В любом случае использование аннотации &ИзменениеИКонтроль позволит избежать ручного сравнения всех процедур и функций, где была использована аннотация &Вместо. Теперь сравнивать нужно будет только те процедуры и функции, где код в исходной конфигурации был изменен в результате обновления.
Но если бы наша процедура была клиентской, то расширение бы все равно применилось, несмотря на то что отличается текст процедуры.
Источник
Методика обновления формы объекта данных при изменении объекта
Актуально для платформы 1С 8.2-8.3.17 (выше не проверял)
Под формой объекта данных в статье подразумевается форма ссылочного объекта (элемента справочника, документа и т.д.) или форма записи независимого регистра сведений.
Пусть в объекте есть строковый реквизит Наименование, длину значения которого мы хотим отображать на форме этого объекта. Добавляем в форму реквизит ДлинаСтроки типа Число и отображаем его в одноименное нередактируемое поле.
Также пусть в объекте есть реквизит типа ХранилищеЗначения, тип которого мы также хотим отображать в форме. Добавляем в форму реквизит ТипЗначенияВХранилище типа Строка и отображаем его в одноименное нередактируемое поле.
В каких же ситуациях нам потребуется обновлять эти косвенно связанные с объектом реквизиты?
Разумеется это нужно вызывать в событии ПриИзменении поля Наименование. А вот дальше многие ограничиваются только вызовом в ПриСозданииНаСервере[упр] и ПриОткрытии[обыч]. Тем самым они не учитывют
- Возможность выполнения пользователем команды «Перечитать» формы.
В управляемой форме она всегда вызывает событие ПриЧтенииНаСервере.
В обычной форме она вызывает событие ПриИзмененииДанных только в модифицированном состоянии формы. В немодифицированном состоянии команда делает ничего. - Возможность изменения объекта в событии ПередЗаписью объекта.
Форма отправляет на запись одно состояние объекта, а после выполнения записи получает другое.
Примеры использования команды «Перечитать»
Случай 1
Объект данных, отображаемый в форме, мог быть изменен в БД с момента его загрузки в форму. Типичные способы таких изменений
- в другой форме в этом же клиентском приложении
- этим же пользователем в другом клиентском приложении в этой же базе
- другим пользователем
- фоновым процессом
Тогда при попытке начать изменение любого поля формы, напрямую связанного с данными (флаг «Изменяет данные»), пользователь увидит предупреждение «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!»
Это результат срабатывания так называемой оптимистической объектной блокировки. Она гарантирует, что если пользователь изменяет объект, то его изменения не «затрут» изменения, сделанные другими сеансами или другими программными объектами этого же сеанса. И тогда, чтобы получить возможность редактировать объект, нужно будет его перечитать либо переоткрыть форму.
Случай 2
Пользователь изменил данные в форме и решил отменить сделанные изменения, но продолжить редактировать объект от его текущего состояния в БД.
В каких событиях обновлять форму?
Чтобы учесть все эти тонкости, нужно всю логику обновления косвенно связанных с объектом элементов формы поместить в процедуру ПриСозданииПриЧтенииНаСервере и вызывать ее из следующих обработчиков событий формы:
Управляемая форма
- ПриСозданииНаСервере — вызываем в конце тела обработчика, но имеем доступ только к объекту в реквизите формы
- ПриЧтенииНаСервере — имеем доступ ко всем данным объекта
- ПослеЗаписиНаСервере — имеем доступ ко всем данным объекта и вызываем потому, что объект мог измениться в событии ПередЗаписью объекта
Обычная форма
- ПриИзмененииДанных — событие вызывается и для нового и для существующего объекта
- ПослеЗаписи — вызываем потому, что объект мог измениться в событии ПередЗаписью объекта
Управляемая форма
В управляемой форме при открытии существующего объекта выполняются два обработчика: сначала ПриЧтенииНаСервере и затем ПриСозданииНаСервере. Поэтому процедура ПриСозданииПриЧтенииНаСервере будет вызываться 2 раза подряд и нужно не задублировать выполнение логики обновления формы. Элементы формы могут зависеть как от данных объекта, доступных через реквизит формы, так и от недоступных через него (реквизиты типа ХранилищеЗначений), которые доступны только одном из них (ПриЧтенииНаСервере). Поэтому в процедуре ПриСозданииПриЧтенииНаСервере надо предусмотреть оба вызова таким образом, чтобы при создании формы существующего объекта при ее вызове из ПриЧтенииНаСервере выполнилась только логика работы с хранилищами значений, а при последующем вызове из ПриСозданииНаСервере выполнилась только логика, зависящая от остальных данных объекта. При этом ее вызов из уже открытой формы (из ПриЧтенииНаСервере и ПослеЗаписиНаСервере) должен выполнять все действия. Для этого создадим в общем модуле функцию ЭтоВызовПослеОткрытияФормы, где будем проверять наличие параметра ТолькоПросмотр у формы. Тогда процедура ПриСозданииПриЧтенииНаСервере будет выглядеть так
Из процедуры ПриСозданииПриЧтенииНаСервере можно выделить всю легкую клиентскую логику в процедуру НастроитьЭлементыФормы с директивой НаКлиентеНаСервереБезКонтекста. Такую легкую и доступную во всех контекстах формы процедуру можно звать при большинстве изменений реквизитов, которые должны менять косвенно связанные элементы формы.
Пример модуля управляемой формы
Обычная форма
В обычной форме благодаря наличию события ПриИзмененииДанных логику обновления формы можно помещать прямо в его обработчик. Здесь также стоит вынести всю легкую логику в процедуру НастроитьЭлементыФормы по аналогии с управляемой формой.
Пример модуля обычной формы
Применяю данную методику уже много лет.
Прикладываю выгрузку демонстрационной базы, где на примере справочника и регистра сведений показаны все описанные в статье проблемы и сама методика.
Источник