1с 8 для движения не найдено соответствующее ему правило заполнения типа записи
В некоторых типовых конфигурациях фирмы 1С существует возможность ручной корректировки движений документа по регистрам. В конфигурации 1С: Бухгалтерия 8 для этого, при наличии соответствующих прав, нужно открыть движения документа и установить флаг “Ручная корректировка”. Однако, иногда возникает необходимость выполнить корректировку движений большого количества документов. В этом случае нам понадобится обработка, которая изменит движения документов без перепроведения.
Рассмотрим как изменить движения документа на примере конфигурации 1С: Бухгалтерия 8. Менять будем движения по регистру бухгалтерии “Хозрасчетный”. Пусть перед нами стоит задача заполнить суммы налогового учета по данным бухгалтерского. Предположим, что у нас уже есть обработка, которая выбирает необходимые нам документы и последовательно обрабатывает их с помощью описанной нами процедуры “ИзменитьДвиженияДокумента”. Посмотрим как должна выглядеть эта процедура.
Хотелось бы отметить, что без проверки ведения налогового учета на счёте, при попытке записать набор, содержащий проводку с ненулевой суммой по счёту на котором не ведется налоговый учет, возникнет ошибка следующего содержания:
Запись не верна! Поле “Сумма (налоговый учет)” должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
Режим обмена данными устанавливается следующими строками:
Это необходимо для того, чтобы не выполнялся программный код, находящийся в обработчиках событий “ПередЗаписью” модуля набора записей регистра бухгалтерии “Хозрасчетный” и модуля корректируемого документа. В каждом из них (для типовых конфигураций) есть проверка следующего вида:
Движения документа отредактированы вручную и не могут быть автоматически актуализированы.
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Автоматическая архивация баз 1С с использованием Cobian Backup и VBS скриптов 8
Клиент попросил настроить автоматическую архивацию баз 1С раз в три дня и выгрузку архивов на Dropbox и на FTP Сервер. Кроме 1С нужно архивировать папку с рабочими документами. Хочет - так хочет, делаем: Первым делом настроим автоматическую архивац Ввод данных по командировкам в программе ЗУП 0
Ввод сведений о командировках в программе 1С: Зарплата и управление персоналом 8 (ред.30) осуществляется в Разделе Кадры - Все кадровые документы - Создать - Командировка Откроется документ: Ввод сведений о командировках в программ Посмотреть все результаты поиска похожих
Еще в этой же категории
Заполнить программно Партии в проводках 0
Добрый день! В счете учета включили Субконто3=Партии. Как заполнить партии в проводках, которые уже проведены ранее? Спасибо. Посмотреть все в категории Регистры бухгалтерии
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
1с доработали адреса в формате фиас и понеслось.
После обновления на УПП 166.2 возникло несколько проблем с заполнением адресов.
1. В контрагенте при сохранении адреса выдается ошибка, когда пытаешься установить номер квартиры, а слово Квартира не выбирается..
ОбщийМодуль.УправлениеКонтактнойИнформациейСлужебный.Модуль(225)>: Ошибка при вызове метода контекста (ЗаписатьJSON)
ЗаписатьJSON(ЗаписьJSON, Значение,, "АдаптацияПолейКонтактнойИнформации", УправлениеКонтактнойИнформациейСлужебный);
по причине:
Передано значение недопустимого типа
2. В документе больничного при попытке выбрать адрес мед. заведения выдается ошибка:
: Поле объекта не обнаружено (ПанельНастроекАдреса)
ФормаРедактированияАдреса.ЭлементыФормы.ПанельНастроекАдреса.Свертка = РежимСверткиЭлементаУправления.Верх;
3. При открытии Классификатора из адресной строки физ лица:
: Тип не определен (ФормаКлиентскогоПриложения)
ТипыСвойств.Вставить("ФормаВладелец", Тип("ФормаКлиентскогоПриложения"));
Даже как-то странно. такое количество ошибок, либо они вообще ничего не тестировали, просто накатили обнову и отправили людям.
У кого нибудь есть такие проблемы? Погуглил, таких ошибок не нашел.
Даже как-то странно, что человек после 8 лет общения с 1с обновляется не протестировав изменения.
где-то в 2010 на курсах в 1с Морозов утверждал, что ут почти вся покрыта тестами, а упп - вся.
но судя по кол-ву ошибок - тесты не поддерживаются и не применяются.
(1) Не поверите, но сколько не обновлялся за 20 лет косяков глобальных никогда не было, чтобы нельзя было работать. Вот чего чего, времени на глобальные тесты у меня нет, всех изменений не протестируешь. Если только у кого вагон свободного времени.
Дедушка старый, ему все равно. УПП, судя по всему, совсем не в приоритете у 1С, несмотря на то что они собирают по 8 штук за месячный пинкод обновлений и по 60 - за годовой.
(1) да в общем-то и я действую также. Чтобы тестировать - время надо и людей. Если в ит-отделе полтора человека, то заниматься этим некому. Если что-то вылезет в критичном функционале - подправляем прямо наживую. Что характерно, уже 10 годков существуем в таком режиме и ничего. Но у нас и готовность 24 часа в сутки не нужна, оттого что база будет недоступна, скажем, час - ничего не поменяется. Свет вырубают чаще и на-дольше, чем происходят сбои в ИТ.
Во встроенном языке программирования платформы «1С:Предприятие» встречаются методы, похожие по написанию и использованию, но имеющие отличия в работе.
Участник Мастер-группы курса по подготовке к сертификации “1С:Специалист по платформе 1С:Предприятие 8.3” обратил внимание, что в разных разделах курса метод «Записать()» у движений документа используется по-разному. Он попросил тренера пояснить причину, и теперь использует в своей работе эти методы правильно :)
Вопрос
В тексте ОбработкаПроведения документа «Расходная накладная» записано:
// 1. подготовка регистра бухгалтерии
Движения.Управленческий.Записывать = Истина;
Движения.Управленческий.Записать();
// 2. установка блокировки данных регистра бухгалтерии
Блокировка = Новый БлокировкаДанных;
т.е. после инструкции «Движения.Управленческий.Записать();» следует инструкция наложения блокировки.
А в разделе «Общие, универсальные механизмы, которые используются для решения задач всех разделов» в главе, посвященной «старой» методике контроля остатков, после инструкций «Записывать = Истина; Записать();» рекомендовано восстанавливать для свойства «Записывать» набора движений значение «Истина».
// 1. Подготовка наборов записей регистра
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Записать();
// 2. Восстановление для свойства набора движений Записывать значения Истина
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Если на экзамене опустить повторную инструкцию «Записывать = Истина», это не будет считаться ошибкой?
Или существует какая то особенность в использовании метода «Записать()» у движений документов?
Ответ
Да, существует особенность. Все зависит от того, каким образом производится запись пустого набора. Обратите внимание, что в задаче бухгалтерского учета запись пустого набора осуществляется методом Движения..Записать(). Это метод набора записей регистра. После его выполнения маркер записи движений не сбрасывается, поэтому его не нужно восстанавливать.
В задаче из общего раздела используется Движения.Записать(). Это метод коллекции движений документа. Он выполняет запись движений по регистрам, у которых установлен маркер записи «Записывать» в значении «Истина», после чего устанавливает его в значение «Ложь». Поэтому, требуется повторная установка признака записи. Если этого не сделать, то при проведении сформированные движения не будут записаны. Это будет ошибкой, и не только на экзамене!
Чтобы проверить это, можно закомментировать восстановление маркера записи, провести документ и посмотреть его движения.
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Комментарии / обсуждение (243):
Добрый день!
Попытался решить задачу из главы 6 урок 2 с помощью произвольного алгоритма. При передачи свойства «АВСкласс» в параметр и обращении к этому параметру в ПКО «После загрузки» возвращается «Неопределено». Причем все отрабатывает корректно при передачи данных в приемник. Подскажите пожалуйста в чем может быть причина?
…
(текст комментария доступен только участникам Мастер-группы)
Да, я передаю свойство “АВСкласс” в параметр объекта, в файле я этого параметра к сожалению не вижу. Попробовал скопировать еще раз, как Вы рекомендовали, не помогло.
…
(текст комментария доступен только участникам Мастер-группы)
Ольга, добрый день! Благодарю за помощь!
Выполнил все Ваши рекомендации.
1. В свойстве “АВСкласс” убрал ПКО “КлассыКонтрагентов”, в обработчике “Перед выгрузкой” прописал
Если НЕ Источник.ЭтоГруппа Тогда
Если Источник.АВСкласс = Перечисления.КлассыКонтрагентов.Акласс Тогда
Значение = "Акласс";
ИначеЕсли Источник.АВСкласс = Перечисления.КлассыКонтрагентов.Вкласс Тогда
Значение = "Вкласс";
ИначеЕсли Источник.АВСкласс = Перечисления.КлассыКонтрагентов.Скласс Тогда
Значение = "Скласс";
КонецЕсли;
КонецЕсли;
После вышеупомянутых манипуляций в файле данных появился узел “ЗначениеПараметра” с заполненным значением.
2. В обработчике ПКО “После загрузки” прописал
Если Константы.ИспользоватьКлассификациюКонтрагентов.Получить() Тогда
Если НЕ Объект.ЭтоГруппа И ПараметрыОбъекта <> Неопределено Тогда
Объект.АВСкласс = ПараметрыОбъекта["АВСкласс"];
Объект.Записать();
ОбъектМодифицирован = Ложь;
Сообщить(ПараметрыОбъекта["АВСкласс"]);
КонецЕсли;
КонецЕсли;
но в итоге в конечной базе реквизит “АВСкласс” все еще остается незаполненным.
…
(текст комментария доступен только участникам Мастер-группы)
Большое спасибо, Ольга! Все заработало!
Добрый день.
Видео 1-6-7 – Обеспечение проведения документа.
После добавления кода для проведения документа, при загрузке в конечную базу выдается ошибка.
Как ее вылечить?
Для теста загрузил выгрузку конечной базы, которая была в материалах курса.
Выполнил перенос (без установки режима записи и проведения) – ошибок нет.
В конечной базе пробую вручную провести документ – ошибка “Поле объекта не обнаружено (Хозрасчетный)”.
Этого поля нигде нет.
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
в задание 1.5.3 сделал ПВД “ВводНачальныхОстатков”
ВыборкаДанных = Новый ТаблицаЗначений;
ВыборкаДанных.Колонки.Добавить("Дата");
ВыборкаДанных.Колонки.Добавить("ОстаткиНоменклатуры");
Пока ВыборкаПериод.Следующий() Цикл
// Вставить обработку выборки ВыборкаПериод
СтрокаДата = ВыборкаДанных.Добавить();
СтрокаДата.Дата = ВыборкаПериод.Период;
ОстаткиНоменклатуры = Новый ТаблицаЗначений;
СтрокаДата.ОстаткиНоменклатуры = ОстаткиНоменклатуры;
ОстаткиНоменклатуры.Колонки.Добавить("Период");
ОстаткиНоменклатуры.Колонки.Добавить("ВидДвижения");
ОстаткиНоменклатуры.Колонки.Добавить("Организация");
ОстаткиНоменклатуры.Колонки.Добавить("Номенклатура");
ОстаткиНоменклатуры.Колонки.Добавить("Количество");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаНабор = ОстаткиНоменклатуры.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаНабор, ВыборкаДетальныеЗаписи);
КонецЦикла;
КонецЦикла;
Создал ПКО “ВводНачальныхОстатков” см рисунок 1 и 2, код
В ПКС Номенклатура написал код
Если ТипЗнч(ОбъектКоллекции.Номенклатура) = Тип("СправочникСсылка.Материалы") Тогда
ИмяПКО = "Номенклатура";
ПКО = НайтиПравило(Источник, ИмяПКО);
ИначеЕсли ТипЗнч(ОбъектКоллекции.Номенклатура) = Тип("СправочникСсылка.Продукция") Тогда
ИмяПКО = "МатериалНоменклатура";
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
В конечную базу документ ввод начальных остатков загружается пустым, не могу понять в чем дело….
…
(текст комментария доступен только участникам Мастер-группы)
Если я правильно понимаю, то движения в xml файле есть…
Вопрос закрыт, причина была в отриц остатках
все разобрался, причина была в отриц. остатках…
Здравствуйте.
подскажите как быть с ошибкой: метод Добавить при загрузке в ДЗ 1.5.2
…
(текст комментария доступен только участникам Мастер-группы)
Перенесла, ошибка не изменилась.
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
В первой версии было в ПередЗагрузкойДанных, по рекомендации перенесла в ПередВыгрузкойДанных.
Вернула обратно в ПередЗагрузкойДанных.
…
(текст комментария доступен только участникам Мастер-группы)
С этой ошибкой разобралась
Уже писал свой вопрос меня отправили на страницу соответствующего занятия. В моём случае это перенос табличной части документа поэтому пишу здесь.
…
(текст комментария доступен только участникам Мастер-группы)
Набор записей регистра сведений “Плановые начисления”. Ссылочные типы которые с ошибкой при переносе не пере записываются. В правиле конвертации справочника сотрудники стоят флаги: не создавать новый объект если он не найден и не пере заполнять существующие. На скриншоте код с ошибкой до строки “Набор.Записать();” ссылочные типы видны.
…
(текст комментария доступен только участникам Мастер-группы)
В ПВД произвольный алгоритм запросом получаю ссылки на подразделение потом через ВыгрузитьПоПравилу() передаю имя правила и ссылку на подразделение как источник. В ПКО поиск документа по подразделению пишу: “Значение = Источник;” в ПКГС таб части Начисления запросом получаю сотрудников виды начислений и суммы результат запроса передаю в коллекцию объектов. Загрузка проходит без ошибок если программно не вызывать проведение документа, ошибка при последующем проведении вручную. Какие данные нужны для более подробного ответа ?
…
(текст комментария доступен только участникам Мастер-группы)
Разьясните пожалуйста 1 момент в решении преподавателя:
В обработчике конвертации После загрузки данных он присваивает ДокументОбъект = Неопределено; А затем и в 1 и во 2 условии все равно получает ДокументОбъект от Ссылки. Ссылка у нас существует всегда (он заполнятеся в ПКО). Не логичнее вынести это в общий код перед условиями? Или я чего-то не понял?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте, подскажите, почему возникает такая ошибка при загрузке?
Ошибка при загрузке данных: : Поле объекта не обнаружено. А какой объект непонятно
…
(текст комментария доступен только участникам Мастер-группы)
К сожалению, не особо стало понятнее..
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте!
У меня есть документ с табличной частью.
В ПКГС табличной части в обработчике ПередОбработкой я делаю отбор, то есть мне нужны не все строки табличной части, а только некоторые. Далее пишу:
КоллекцияОбъектов = РезультатЗапроса.Выгрузить();
Все работает верно, но я не могу понять, как мне и в каком месте прописать отказ от выгрузки документа, если в табличной части стало пусто. (Ну то есть в документе нет строк, соответствующих моему условию).
В файл обмена документ выгружается с пустой табличной частью, а мне нужно, чтобы такой документ не выгружался совсем.
Пытаюсь сделать проверку в обработчиках ПКО , он не видит, что табличная часть пустая.
Использую ПВД – стандартную выборку.
Подскажите, пожалуйста.
…
(текст комментария доступен только участникам Мастер-группы)
подскажите как перенести контактную информацию из регистра сведеней КИ в тч КИ объекта (конфигурации из бп2 в бп3). Проблема в том что в бп3 надо у поля значениеполей представить в виде xml.
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.Вид,
| КонтактнаяИнформация.Вид КАК ВидДляСписка,
| КонтактнаяИнформация.Тип,
| КонтактнаяИнформация.Поле1 КАК Поле1,
| КонтактнаяИнформация.Поле2 КАК Поле2,
| КонтактнаяИнформация.Поле3 КАК Поле3,
| КонтактнаяИнформация.Поле4 КАК Поле4,
| КонтактнаяИнформация.Поле5 КАК Поле5,
| КонтактнаяИнформация.Поле6 КАК Поле6,
| КонтактнаяИнформация.Поле7 КАК Поле7,
| КонтактнаяИнформация.Поле8 КАК Поле8,
| КонтактнаяИнформация.Поле9 КАК Поле9,
| КонтактнаяИнформация.ТипДома КАК ТипДома,
| КонтактнаяИнформация.ТипКорпуса КАК ТипКорпуса,
| КонтактнаяИнформация.ТипКвартиры КАК ТипКвартиры
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &ТекущийОбъект”;
Запрос.УстановитьПараметр(“ТекущийОбъект”, Источник);
Выборка = Запрос.Выполнить().Выбрать();
Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов.
Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.
Казалось бы, всё это есть в литературе. Зачем словами переписывать? В этой статье собрана и структурирована информация из разных источников. Однако не всегда и не у всех есть эта литература под рукой. А тут информация в открытом источнике и достаточно структурированная, изложенная простым языком. Тем самым делаем эти знания более понятными и доступными.
Будем рассматривать запись документа, чтобы не загромождать статью и не описывать все типы объектов (у них всё также, за небольшим исключением).
Итак, для чего нам вообще нужны эти обработчики?
Очень часто программисту требуется переопределить стандартное поведение системы во время записи документа, а именно: отменить запись, в случае каких-то условий; запросить дополнительную информацию у пользователя; дозаполнить реквизиты; что-то ещё записать в базу данных на основании этой записи; что-то изменить на форме после записи и т.д. и т.п. Каждый программист рано или поздно сталкивается с подобными задачами, потому знать назначение и последовательность запуска этих событий необходимо.
Последовательность запуска событий (в том порядке, в каком они перечислены) и небольшие подробности:
Во многих обработчиках есть параметр «Отказ». Там, где этот параметр присутствует означает, что в этом обработчике ещё можно отказаться от записи, присвоив параметру «Отказ» значение Истина, и тогда запись произведена не будет. И ещё, отдельно отмечу, что п ри программной записи события модуля формы не запускаются!
1) Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
Выполняется на клиенте!
Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.
Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои!
Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, можно спросить что-то у пользователя и ответ записать в этот параметр. И уже, например, в ПриЗаписиНаСервере использовать этот параметр для анализа и дальнейших действий.
2) Модуль формы ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
3) Модуль объекта ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)
Сначала вызывается событие формы ОбработкаПроверкиЗаполненияНаСервере На данном этапе есть доступ к данным формы.
После этого в памяти сервера создается прикладной объект, соответствующий типу основного реквизита формы, и его данные заполняются из данных формы.
Затем вызывается событие прикладного объекта ОбработкаПроверкиЗаполнения .
Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения «Выдавать ошибку»). И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.
Эти два обработчика событий предназначены :
- Для включения в проверку заполнения тех реквизитов, у которых в свойствах «ПроверкаЗаполнения» указано «Не проверять». Для этого надо добавить этот реквизит в массив параметр «ПроверяемыеРеквизиты»
- Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить этот реквизит из массива параметра «ПроверяемыеРеквизиты»
Имеется несколько особенностей, которые необходимо учитывать:
- Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
- Вызываются только при интерактивной записи! При программной записи не вызываются. Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
- Для документов, имеющих возможность проведения, эти события проверки заполнения вызываются только при проведении!
Если данные формы не нужны, то используйте обработчик модуля объекта ОбработкаПроверкиЗаполнения
4) Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
В этом обработчике можно дозаполнять реквизиты объекта (через параметр ТекущийОбъект) или провести дополнительные проверки. Есть доступ к данным формы.
Важно понимать, что в предыдущем обработчике (в процессе проверки заполнения) произошло «разделение» формы на форму и прикладной объект (пока только в памяти сервера), данные которого будут записаны в базу данных.
В обработчике модуля формы ПередЗаписьюНаСервере появляется возможность доступа как к данным основного реквизита формы Объект, а также и к самому объекту, который будет записан через параметр обработчика ТекущийОбъект.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (в случае записи документа ДокументОбъект). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан.
И тут внимание. ТекущийОбъект — объект, который реально будет записан в информационную базу и дозаполнять реквизиты нужно именно через параметр ТекущийОбъект.
Внесение изменений через реквизит формы объекта Объект не даст никакого результата, его можно только анализировать. В информационную базу эти данные записаны не будут. После завершения транзакции записи, данные из ТекущегоОбъекта запишутся в Объект. Таким образом, все изменения, внесенные в Объект, пропадут.
Также нужно понимать, что при программной записи объекта это событие вызываться не будет.
Поэтому если какие-либо алгоритмы должны выполняться при любом способе записи данных объекта, а не только при записи из формы, их следует размещать в обработчике события объекта (ПередЗаписью), а не в обработчике события формы.
Начало транзакции
5) Модуль объекта ПередЗаписью(Отказ)
В этом обработчике можно провести дополнительные проверки и отказаться от записи.
Для документов в параметры данного обработчика добавляются ещё два параметра: РежимЗаписи, РежимПроведения.
Запись
6) Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Возникает в момент, когда выполняется установка номера нового документа, задачи или бизнес-процесса.
Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)
Возникает в момент, когда выполняется установка нового кода элемента справочника, узла плана обмена или кода плана видов характеристик.
Эти событии вызываются для объектов у которых указано свойство «Автонумерация» и только для тех объектов, у которых пустой код на момент записи.
Если установить параметру СтандартнаяОбработка значение Ложь, то новый номер генерироваться не будет и можно программно задать код объекта в данном обработчике.
7) Модуль объекта ОбработкаУдаленияПроведения (Отказ)
Этот обработчик запускается только при отмене проведения документов с целью удаления движений из регистров. При этом неважно как отменяется проведение документа — программно или интерактивно.
8) Модуль объекта ПриЗаписи(Отказ)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.
Назначение этого обработчика — записать в базу данных дополнительную информацию, связанную с данными записываемого объекта.
Ссылка уже есть и можно записать в базу данных дополнительные данные на основании текущего объекта, используя эту ссылку.
Например, при записи создавать другой документ, содержащий реквизит ссылку на записываемый.
Поскольку это событие обрабатывается в транзакции записи основных данных, гарантируется синхронность изменения основных и дополнительных данных. Либо и те и другие будут записаны, либо и те и другие изменения будут отменены при отмене транзакции.
Можно ещё отказаться от записи.
9) Модуль объекта ОбработкаПроведения (Отказ, РежимПроведения)
Этот обработчик запускается только при проведении документов. При этом неважно как проводится документ — программно или интерактивно.
Основное назначение процедуры-обработчика данного события — генерация движений по документу. Именно в данном обработчике прописываются алгоритмы записей в регистры, т.е. программно формируются движения документа.
Параметр РежимПроведения определяет как будет проводиться документ: оперативно или неоперативно.
Если для данного вида документа в конфигурации установлено автоматическое удаление движений, то перед возникновением события все движения по документу будут удалены.
10) Модуль формы ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.. Есть последний шанс отказаться от записи.
Назначение этого обработчика – записать в базу данных дополнительную информацию, связанную с данными записываемого объекта.
Если данные для записи дополнительной информации находятся в самом объекте, то мы использовали обработчик модуля объекта ПриЗаписи(). А вот если данные находятся в форме, то как раз для таких случаев и предназначено это событие, потому как есть доступ к данным формы.
Этот обработчик ещё используется, если нужны данные параметра обработчика ПараметрыЗаписи, которые «приехали» в этом параметре из других обработчиков.
Через параметр ТекущийОбъект доступны данные, которые уже были записаны в информационную базу и имеет тип класса Объект (ДокументОбъект). Можно обратиться к его свойствам и методам, а также использовать для вызова экспортных методов объекта.
Работать следует именно через этот параметр, то есть не путать с основным реквизитом формы Объект, так как там данные, которые были до записи и его изменения бесполезны потому, что после этого обработчика данные из ТекущегоОбъекта запишутся в Объект.
Если это запись нового объекта, то ТекущийОбъект.Ссылка будет содержать уже конкретное значение ссылки на этот элемент в информационной базе. А вот Объект.Ссылка имеет пустое значение на этом этапе.
Итак, по поводу этого обработчика можно сделать следующие выводы:
- Если нужно выполнять какие-то действия, связанные с записанным объектом, и при этом, например, нужна ссылка на этот объект, необходимо использовать ТекущийОбъект.Ссылка.
- Основной реквизит формы Объект можно использовать только для сравнения того, что «было», с тем, что «записалось». Изменять его бессмысленно, т. к. он будет замещен данными из ТекущийОбъект.
- Если нужно изменить записанные данные перед отправкой их на клиент, необходимо использовать ТекущийОбъект
Завершение транзакции
11) Модуль формы ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
После завершения транзакции записи выполняется преобразование данных записанного объекта в данные формы. После этого вызывается данный обработчик. Это последний обработчик, в котором по отдельности доступны данные формы и объект, который был записан.
Этот обработчик используют, когда предполагаются действия над формой. Это те действия, которые должны быть выполнены только в том случае, когда объект 100 % записан (т.е. после транзакции). Например, вывод в форме некоторой дополнительной информации, связанной с данными объекта. Или выполнение каких-либо действий, которые должны быть выполнены только в том случае, когда объект гарантированно записан.
Однако здесь назначение ТекущийОбъект – прямо противоположное тому, что было до этого. В этом обработчике данные записанного объекта уже помещены в форму, т.е. уже загружены в основной реквизит формы Объект и потому ТекущийОбъект изменять бессмысленно: он будет уничтожен при выходе из обработчика.
Но ТекущийОбъект можно использовать, чтобы выполнить какие-то вспомогательные действия, обратившись к его свойствам и методам, а также через вызов экспортных методов объекта. Например, е сли на данном этапе нужны какие-то данные или методы объекта, нужно использовать ТекущийОбъект, а не пытаться получать их через основной реквизит формы Объект.
Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.
12) Модуль формы ПослеЗаписи(ПараметрыЗаписи)
Выполняется на клиенте!
Можно использовать для того, чтобы визуально что-то отобразить на форме или организовать диалог с пользователем, например выдать предупреждение.
Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.
Часто бывает так, что использовать подписку на событие эффективнее, потому что не затрагивает модули, находящиеся на поддержке и очередное обновление конфигурации проходит с куда меньшими затратами труда и времени.
Обработчики событий объекта на которые можно сделать подписку на события:
Дополнение 2: подписки на события для одинаковых источников и действий выполняются в порядке размещения подписок в конфигураторе сверху вниз (т.е. в таком же порядке, как и в дереве метаданных).
Т.е., если для какого-то документа в конфигурации есть две подписки на событие ПриЗаписи, то в начале выполнится та, которая расположена выше.
Дополнение 3 : подписки с источником общего типа (ДокументОбъект, СправочникОбъект) выполняются позже, чем с источником конкретного типа, даже если он составной.
Как вариант указывать в своей подписке источник ДокументОбъект и ставить ее ниже по списку, а в самом обработчике проверять тип документа:
Если ТипЗнч(Источник) <> Тип("ДокументОбъект.МойДокумент") Тогда
Если статья оказалась вам интересной и полезной, то сохраняйте, чтоб не потерять и иметь под рукой- просто нажимайте + и получите от меня + в свою карму :))
Читайте также: